Reactjs 在合成组件中,子组件如何访问最顶层组件的状态属性

Reactjs 在合成组件中,子组件如何访问最顶层组件的状态属性,reactjs,Reactjs,为了简化,我有一个组件,其中包括一个子组件。顶级父组件是唯一有状态的组件。但这种状况需要深入到儿童的内心深处。这些子项如何访问最顶层父项的状态 通过props传递状态是唯一的方法吗?我问这个问题是因为我有一个组件,它有很多子元素,所以要访问状态,我必须将状态作为道具传递到5级,这样第5级才能访问状态 举一个简单的例子: var Timer = React.createClass({ getInitialState: function() { return {secondsElapse

为了简化,我有一个组件,其中包括一个子组件。顶级父组件是唯一有状态的组件。但这种状况需要深入到儿童的内心深处。这些子项如何访问最顶层父项的状态

通过
props
传递状态是唯一的方法吗?我问这个问题是因为我有一个组件,它有很多子元素,所以要访问状态,我必须将状态作为道具传递到5级,这样第5级才能访问状态

举一个简单的例子:

var Timer = React.createClass({
  getInitialState: function() {
    return {secondsElapsed: 0};
  },
  tick: function() {
    this.setState({secondsElapsed: this.state.secondsElapsed + 1});
  },
  componentDidMount: function() {
    this.interval = setInterval(this.tick, 1000);
  },
  componentWillUnmount: function() {
    clearInterval(this.interval);
  },
  render: function() {
    return (
      <Label />
    );
  }
});

var Label = React.createClass({
  render: function() {
    return (
      <div>Seconds Elapsed: {this.state.secondsElapsed}</div>
    );
  }
});

ReactDOM.render(<Timer />, mountNode);
var Timer=React.createClass({
getInitialState:函数(){
返回{secondsElapsed:0};
},
勾选:函数(){
this.setState({secondsElapsed:this.state.secondsElapsed+1});
},
componentDidMount:function(){
this.interval=setInterval(this.tick,1000);
},
componentWillUnmount:function(){
clearInterval(这个.interval);
},
render:function(){
返回(
);
}
});
var Label=React.createClass({
render:function(){
返回(
秒数:{this.state.secondsElapsed}
);
}
});
render(,mountNode);

本例给出了This.state为null的

通常有两种公认的方法

  • 实际上,将属性向下传递到组件树。这有时可以很好地工作,我个人经常使用它来在组件中进行更多的UI工作,比如确保分页在整个应用程序中正常工作(总页面、当前页面、每页项目)。对于更多的应用程序“状态”类型的事情,这通常不是正确的方法
  • 切换到管理应用程序状态的工具,例如,如果两个组件都需要,这将有助于您使用存储的概念来保持这种状态。我使用这个实现,但是其他的实现也是非常有名的

  • 总的来说,我建议你深入一些React和Flux的视频,也许是人们向你展示他们如何做某些事情的视频。例如一个。

    您可以使用react的一个称为“上下文”的实验性功能,将状态传递到任意深度

    他们有。将警告置于顶部,因为这仅适用于特殊情况


    在使用上下文时,尝试重构或提前思考,因为它们可能会导致您创建假定特定上下文的子组件,从而限制其可重用性。

    Ah!!Flux看起来很棒。我认为这会给我带来很多好处,因为我需要生成和维护多个组件,这些组件涉及一个状态对象。通量是实现这一点的方法,嗯?因此,这将是2鸟1石,它处理深层子代,并在克隆组件之间保持状态?正确,您可以将其视为组件可以用作“道具”的某种单体,因此您不必到处都有这些大规模依赖项。如果没有它,我不会再构建任何React应用程序!非常感谢詹彼特。我看着它,但有点困难。请在JSFIDLE中使用Flux来显示一个存储,然后创建三个
    hello blah
    ,divs,其中blah是状态。我想不出它到底是怎么“流畅”的,我只是不断地创建一个全局对象,然后将状态设置为那个。我可以就此提出另一个问题,我应该这样做吗?@Noitidart在过去的20分钟里,我一直在尝试为您提供一个很好的JSFiddle,但与查看他们的教程相比,这似乎有点困难。这应该告诉你应该怎么做。其位置为:。使用Facebook纯流量的用户可以在这里找到:非常感谢您的努力@janpeter,我真的很感激!我将查看这些示例!:)我将首先尝试纯通量,然后进入高级alt:)这非常有趣!非常感谢你,马特!