fmoo / react-typeahead

Pure react-based typeahead and typeahead-tokenizer
ISC License
677 stars 232 forks source link

Input value doesn't update if new value comes in nextProps #214

Open dzmitry-kremez-itechart opened 7 years ago

dzmitry-kremez-itechart commented 7 years ago

For example I have cities typeahead input that is updated when user change another zip code input, so I need to set new input value by new property, but as it is based on state it doens't update it. I fixed it in my app by:

<Typeahead
    ...
    ref={(ref) => this.typeahead = ref}
 />
componentDidMount() {
  if (this.typeahead) {
    this.typeahead.componentWillReceiveProps = function (nextProps) {
      this.setState({
        entryValue: nextProps.value,
        visible: this.getOptionsForValue('', nextProps.options),
      });
    };
  }
}

I think this code could be placed inside the src. Is there any reason that why not to update entryValue state from new props?

Glogo commented 7 years ago

This is bugging me for quite some time. For those who prefer different solution (hotfix) this is my suggestion:

import { Typeahead } from 'react-typeahead';

class MyTypeahead extends React.Component {
    componentWillReceiveProps(nextProps) {
        if (this.props.value !== nextProps.value) {
            console.log('valueChanged', nextProps.value);
            this.refs.typeahead.setState({entryValue: nextProps.value});
        }
    }

    render() {
        return <Typeahead ref="typeahead" value={this.props.value} />
    }
}

MyTypeahead.propTypes = {
    value: PropTypes.string // Or whatever
};