我的“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条目”收到回复。
感谢您的帮助,谢谢。
答案 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);
});
}
}
}