javascript - Reactjs 如何从不同的组件更改组件的状态

标签 javascript ruby-on-rails-4 backbone.js reactjs

我有一个 React 组件,我们称它为组件 1

define([..., /path/component_2.jsx], function(..., Component2) {
   var Component1 = React.createClass({
      getInitialState: function() {
         return {.......};
      },

      componentDidMount: function() {
          .......
          dates = ....;
          Component2.setState({dates: dates});
      }
       render: function() { return (<div ...></div>) }
   });
}

如您所见,我正在调用此组件中的 Component2.setState。但是我收到一个错误,比如 setState is not a function。我尝试通过在组件 2 中定义一个自定义函数而不是 setState 函数并从组件 1 调用该函数来尝试此操作,但我遇到了同样的错误,“不是函数”。

和组件 2:

define([..., ], function(...) {
   var Component2 = React.createClass({
      getInitialState: function() {
         return {.......};
      },

      render: function() { return (<div ...></div>) }
   });
}

所以我想在 reactjs 中我们调用一个组件只是为了渲染某些东西(React DOM 元素)?并且不能改变组件状态?

如果是这样,我怎样才能从不是 first 的子组件或父组件的不同组件更改组件的状态?

最佳答案

组件不会公开暴露它们的状态。同样重要的是要记住,状态的范围是组件的实例,而不是它们的定义。

要在组件之间进行通信,您可以推出自己的事件订阅服务。

var events = new EventEmitter();

// inside Component1
events.emit('change-state', newState);

// inside Component2
events.on('change-state', function(state) {
  this.setState(state);
});

但是,这很快就会变得难以管理。

一个更明智的解决方案是使用 Flux .它允许您显式管理整个应用程序的状态,并在您的组件中订阅状态的不同位的变化。值得尝试全神贯注。

想要通信的组件应该调度一个 Action ,这个 Action 将负责改变商店中的东西,你的其他组件应该订阅那个商店并可以根据变化更新它的状态。

关于javascript - Reactjs 如何从不同的组件更改组件的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33800759/

相关文章:

javascript - Backbone.View 渲染错误。 "TypeError: invalid ' instanceof' 操作数 e.$"

javascript - Colorbox 将图像显示为二进制数据

javascript - 如何在列表和项目 View 中呈现 Backbone 集合?

javascript - 在 Express 中从一条路线重定向到另一条路线

javascript - 如何检查给定的单词是否包含在字符串中?

ruby-on-rails - rails : Update data via link_to (without view)

ruby-on-rails - 使用 ajax 提交表单后显示 flash 消息

javascript - Ajax 的 PHP 只工作一次

php - 使用 CakePHP 生成 Javascript View block

ruby-on-rails - 如何清理我的 Puma Logs?