【问题标题】:Why I can't access component state in render in reactjs为什么我无法在 reactjs 的渲染中访问组件状态
【发布时间】:2015-04-23 23:58:13
【问题描述】:

尝试学习 react.js 我试图在getInitialState 中设置组件的状态并使用this.state.myproperty 在渲染中访问它,但似乎我做错了什么。这是我到目前为止所做的。

app.jsx 这是我的切入点

var React = require('react');
var App = require('./components/App');

React.render(
  <App />,
  document.getElementById('content')
);

/components/App.jsx

var React         = require('react');
var UserStore     = require('../stores/UserStore');
var ActionCreator = require('../actions/Actions');
var UserApp       = require('./UserApp');
var App = React.createClass({

  propTypes: {
     users: React.PropTypes.array,
   },

 getInitialState: function() {
      ActionCreator.loadUsers();
      return UserStore.getState();
  },

  render: function(){
    var users = this.state.users;
     console.log(this.state);// see what is in the state
     console.log(users);  // see what is in users 
     return(
        <UserApp users = {users}/>
     );
  },
});


module.exports = App;

动作创建者

var AppDispatcher = require('../dispatcher/AppDispatcher');
var Constants = require('../constants/Constants');
var ApiClient = require('../clients/ApiClient');
var ActionTypes = Constants.ActionTypes;
var Actions = {

  loadUsers: function(){
     ApiClient.getUsers(function(usersObj) {
       AppDispatcher.handleServerAction({actionType:ActionTypes.LOAD_USERS_SUCCESS, usersObj: usersObj});
     }.bind(this), function(error) {
      AppDispatcher.handleServerAction({actionType:ActionTypes.LOAD_USERS_FAIL, error: error});
     }.bind(this));
   },
};

module.exports = Actions;

这是我在控制台中看到的

为什么我不能从状态访问users 还是我做错了?

【问题讨论】:

  • 我假设loadUsers 是一个异步操作,而在您记录users 时,该操作尚未完成。您仍然可以在 this.state 中看到结果,因为 Chrome 控制台很神奇。
  • @FelixKling 是的,你是对的 .. 那么我如何才能从数据库中为 actioncreator 的组件加载数据?请参阅编辑我也发布了 actioncreator 的代码
  • 您也可以先加载数据并将其作为道具传递给组件,即您正在渲染组件以响应 Ajax 响应。但是,由于您似乎正在使用通量,因此商店应在其更改时发出一个事件,您的组件会侦听该事件,然后自行更新。

标签: javascript reactjs reactjs-flux


【解决方案1】:

根据通量理论,您的组件必须调用一个操作并等待商店通知数据准备就绪。商店是必须听调度员的。

如果我是你,我会在 getInitialState 中返回一个模拟对象,将我的组件订阅到 UserStore 更改事件并在商店告诉我时获取用户数据。

然后我会在 UserStore 订阅的回调中更新组件状态(使用 setState 方法)。 setState 方法会自动调用 render。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-03-19
  • 2021-08-11
  • 2018-10-24
  • 2019-08-08
  • 2019-10-14
  • 2020-07-11
  • 2020-06-04
  • 2020-11-02
相关资源
最近更新 更多