首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应: setState没有像预期的那样产生结果(不起作用吗?)

反应: setState没有像预期的那样产生结果(不起作用吗?)
EN

Stack Overflow用户
提问于 2016-10-01 07:54:18
回答 2查看 212关注 0票数 1

我的项目是Cordova + React(es6)。我在使用setState()时遇到了一些问题。

传递给状态的数据不是空的。但是,将数据传递到状态时,我收到的结果状态是空的。

我的项目的env(package.json):

代码语言:javascript
复制
{
  "name": "MYAPP",
  "version": "1.0.0",
  "description": "this is front of simula's app",
  "main": "gulpfile.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "browserify ./www/jsx/app.jsx -t babelify -o ./www/js/app.js"
  },
  "author": "maki",
  "license": "ISC",
  "dependencies": {
    "babel-preset-es2015": "^6.13.2",
    "browserify": "^13.1.0",
    "gulp": "^3.9.1",
    "history": "^4.2.0",
    "material-design-icons": "^2.2.3",
    "material-ui": "^0.15.4",
    "rd3": "^0.7.2",
    "react": "^15.3.0",
    "react-d3": "^0.4.0",
    "react-dom": "^15.3.1",
    "react-motion": "^0.4.4",
    "react-router": "^2.7.0",
    "react-swipeable-views": "^0.7.0",
    "react-tap-event-plugin": "^1.0.0",
    "vinyl-source-stream": "^1.1.0"
  },
  "devDependencies": {
    "babel-cli": "^6.11.4",
    "babel-plugin-transform-class-properties": "^6.11.5",
    "babel-preset-react": "^6.11.1",
    "babel-preset-stage-1": "^6.13.0",
    "babelify": "^7.3.0",
    "gulp-sass": "^2.3.2",
    "jquery": "^3.1.0"
  }
}

我的密码是:

代码语言:javascript
复制
export default class SomeCard extends React.Component {
  constructor(){
    super();

    this.state = {
      data_source: []
    }
  }

  componentDidMount(){
    const {name, data} = this.props.data;
    if(name == 'AAA'){
      let values_a = data.map((tmp_data) =>{
        let date = new Date(tmp_data.date);
        return {
          x: date,
          open: tmp_data.open,
          high: tmp_data.high,
          low: tmp_data.low,
          close: tmp_data.close
        };
      });
      let final_tmp_data = [
        {
          name: name,
          values: values_a
        }
      ];
      console.log(final_tmp_data);  //NOT EMPTY
      this.setState({data_source: final_tmp_data});
      console.log(data_source);     //NOT EMPTY
    }else if(name == 'BBB'){
      let values_b = data.map((tmp_data) => {
        let date = new Date(tmp_data.date);
        let tmp_date = date.getFullYear();
        return {
          "x": String(tmp_date),
          "y": tmp_data.value
        };
      });
      let final_cash_data = [
        {
          "name": name,
          "values": values_b
        }
      ];
      console.log(final_cash_data);          //NOT EMPTY
      this.setState({data_source: final_cash_data});
      console.log(this.state.data_source);   //EMPTY!!!!!!!!
    }
  .....
}

我该怎么办?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-01 08:02:42

React setState()是一个异步操作,因此它不会在代码中调用结果之后立即交付结果。如果在render()方法中添加console.log(this.state.data_source); ,则只在this.setState()完成时调用,您就可以访问更新后的状态。

看一看反应文档:https://facebook.github.io/react/docs/component-api.html#setstate

setState()不会立即改变this.state,而是创建一个挂起的状态转换。调用此方法后访问this.state可能会返回现有值。无法保证对setState的调用的同步操作,而且为了提高性能,调用可能会批处理。 除非在()中实现了条件呈现逻辑,否则setState()总是会触发重呈现。

票数 0
EN

Stack Overflow用户

发布于 2016-10-01 08:13:18

除了Piotr'a答案之外,还可以传递一个回调,这个回调是用新的状态调用的,例如;

代码语言:javascript
复制
  this.setState({data_source: final_cash_data}, function(newState){
    console.log(newState.data_source)
  });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39804278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档