onChange仅在2个文本输入后触发

时间:2017-05-04 10:57:45

标签: javascript listview reactjs react-native textinput

我的“TextInput”有一种奇怪的行为。我正在尝试基于TextInput条目过滤ListView:

export default class SearchTabScreen1 extends Component {
  constructor(props) {
    super(props);
    this.state = {
      searchText:'',
      data:[]
    };
}

setSearchText(event) {
    var reset = realm.objects('User');
    if (this.state.data !== reset){
    this.setState({
      data:realm.objects('User')
    });

    const searchText = event.nativeEvent.text;
    this.setState({searchText:searchText});
    console.log(this.state.searchText);

    var searchString = this.state.searchText;
    if(searchString != ""){
      let searchResult = realm.objects('User').filtered('name BEGINSWITH[c] $0', searchString);
      var filteredData = searchResult;

      this.setState({
        data : filteredData
      });
      console.log("FILTERED", filteredData);
    }
  }
}

render() {
      return (
        <View style={{flex: 1, padding: 20}}>
          <TextInput
            ref="recherche"
            placeholder="Search"
            autoCorrect={true}
            returnKeyLabel="search"
            underlineColorAndroid="black"
            value = {this.state.searchText}
            onChange={this.setSearchText.bind(this)}
          />
          <ListViewDico
            navigator={this.props.navigator}
            dataFromParent={this.state.data}
          />
        </View>

问题是当我输入'L'时,例如,在TextInput中输入日志:console.log(this.state.searchText);什么也没显示。

只有在输入第二个字符(无论是什么)之后,日志才显示此“L”,等等。

我总是在“t + 1条目”收到回复。

感谢您的帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

它发生的原因是setState没有立即改变状态,但需要时间,而Javascript是异步的,console.log()在状态发生变异之前被执行,因此只有在下次看到旧值时执行更新值时才会获得更新值。解决方案是调用console.log()中的setState callback

 this.setState({searchText:searchText}, () => {
     console.log(this.state.searchText);
 });

代码:

setSearchText(event) {
    var reset = realm.objects('User');
    if (this.state.data !== reset){
    this.setState({
      data:realm.objects('User')
    });

    const searchText = event.nativeEvent.text;
    this.setState({searchText:searchText}, function() {
         console.log(this.state.searchText);
    });


    var searchString = searchText;
    if(searchString != ""){
      let searchResult = realm.objects('User').filtered('name BEGINSWITH[c] $0', searchString);
      var filteredData = searchResult;

      this.setState({
        data : filteredData
      }, function() {
          console.log("FILTERED", filteredData);
      });

    }
  }
}