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 не является функцией. Я попробовал это с определением пользовательской функции вместо функции setState в компоненте 2 и вызовом этой функции из компонента 1, но я получаю ту же ошибку, "не является функцией".

и компонент 2:

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

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

поэтому я думаю, что в reactjs мы вызывает компонент только для рендеринга чего-либо (React dom elements)? и не может изменить состояние компонента?

Если да, то как я могу изменить состояние компонента из другого компонента, который не является дочерним или родительским для first?

2 ответов


компоненты публично не раскрывают свое состояние. Также важно помнить, что состояние ограничено экземпляр компонентов, а не их определение.

для связи между компонентами вы можете запустить собственную службу подписки на события.

var events = new EventEmitter();

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

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

однако, это быстро станет трудно управлять.

более разумным решением является использование Flux. Это позволяет четко контролировать состояние вашего все приложение и подписаться на изменения в различных битах состояния, в пределах ваших компонентов. Стоит попытаться понять это.

компонент, который хочет общаться, должен отправить действие, и это действие будет отвечать за изменение чего-то в магазинах, ваш другой компонент должен подписаться на это хранилище и может обновить его состояние на основе изменения.


вы можете использовать общее состояние между двумя компонентами. Вы можете построить "mixin", как это

app.mixins.DateMixin = {
   getInitialState: function () 
      return {
          dates: []
         }
      }
};

и затем в вас компоненты вы можете включить этот mixins с помощью массива mixins

define([..., /path/component_2.jsx], function(..., Component2) {
   var Component1 = React.createClass({

      mixins: [app.mixins.DateMixin],

      getInitialState: function() {
         return {.......};
      },

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

define([..., ], function(...) {

   mixins: [app.mixins.DateMixin],

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

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

теперь ваши компоненты разделяют состояние "даты", и вы можете изменить/проверить его в обоих из них. NB: вы также можете поделиться методами таким же образом, написав в компонент mixin.

Edit: я предлагаю вам посетить этот веб-сайт http://simblestudios.com/blog/development/react-mixins-by-example.html