反应本机状态不更新

时间:2019-02-10 03:19:23

标签: react-native

我觉得我在这里疯了..... 我在搜索栏中输入了“ x”,但this.setState({ filter: text });未更新状态。...console.log(this.state.filter);给我一个值”(其初始值在构造函数中设置)。 我可以看到text变量的值是x ...,但它只是不更新​​过滤器状态。

constructor(props) {
    super(props);

    this.state = {
      timer: 30 * 60,
      lat: 0,
      lng: 0,
      loading: false,
      data: [],
      pagetoken: null,
      refreshing: false,
      waiting4answer: false,
      placeName: null,
      placeUri: null,
      filter: '',
    };

}

renderHeader = () => {
    if (this.state.waiting4answer === false) return null;
    return (
      <SearchBar
        placeholder="Type Here..."
        lightTheme
        round
        onChangeText={(text) => {
          this.setState({ filter: text });
          console.log(this.state.filter);
          this.searchFilterFunction();
        }}
        autoCorrect={false}
      />
    );
  };

2 个答案:

答案 0 :(得分:1)

状态正在更新,这只是您检查和使用更新后的状态存在缺陷的方式。

状态为异步

状态是异步的,需要花费一些时间来设置状态。您遇到的问题是您正在调用setState,然后立即从状态记录值。不幸的是,当您执行此操作时,状态将不会更新,因此您将获得以前的值。

状态进行回调

如果要使用刚刚设置的状态值,则需要使用callback具有的setState函数。 this.setState({key: value}, callback)

此回调允许您在设置状态后运行函数。您可以通过以下方式使用它:

this.setState({filter: text}, () => {
  // put the things you wish to occur after you have set your state.
  console.log(this.state.filter);

  // I am guessing your searchFilterFunction requires the updated filter value in state 
  // so put that here too
  this.searchFilterFunction();
});

这意味着,一旦您在状态中设置了filter的值,并且该状态已更新以反映该值,它将运行callback,因此它将记录{{1 }}处于当前状态,然后它将运行filter

进一步阅读

您可以在Michael Chan的这一系列精彩文章中进一步了解状态

https://medium.learnreact.com/setstate-is-asynchronous-52ead919a3f0

https://medium.learnreact.com/setstate-takes-a-callback-1f71ad5d2296

https://medium.learnreact.com/setstate-takes-a-function-56eb940f84b6

答案 1 :(得分:0)

在设置状态后,立即使用setState回调获取更新后的状态

from django.db import connection
cursor = connection.cursor()
cursor.copy_expert('''
        COPY employee_employee (name, slug, title)
        FROM STDIN WITH (FORMAT csv, HEADER true, FORCE_NOT_NULL (status));
        ''', open(csv_fname),
        )
rowcount = cursor.rowcount

反应setState为asynchronous