【问题标题】:How to reset React component to start from initial state from inside the parent component如何从父组件内部重置 React 组件以从初始状态开始
【发布时间】:2016-02-18 15:30:53
【问题描述】:
var A = React.createClass({
onTabChange:function(e, id){
    this.setState( {tabIndex:id} );
    //Inside this function I would like to get the state of B component 
    //to start from initial state, (i.e. call initialState() function)
},

render:function(){
    return <div>
        <FormTabs options={['A', 'B', 'C']} onChange={this.onTabChange} value={this.state.tabIndex} /> // This creates 3 simple tabs 
        <B x={5} y={8} z={10} />
    </div>;
}

});

var B = React.createClass({
getInitialState:function(){
    return {
        x: a,
        y: b,
        z: c
    }
},

render:function(){
    this.state.x = this.props.x;
    this.state.y = this.props.y;
    this.state.z = this.props.z;

    return <div>
            //...
        </div>
}

});

所以,我真正想要的是在 onTabChange 函数中删除 B 组件的实例。关于如何删除它的实例的任何帮助,以便当我调用时,它会进入 B.initialState() 函数。

【问题讨论】:

  • 您能详细说明一下用例吗?您正在使用可变解决方案来解决此问题,但我确信有一种更具声明性的“类似反应”的方式来解决您的实际问题。

标签: reactjs react-native


【解决方案1】:

所以你问这个的方式有点令人困惑,但如果我理解正确,你想要做的是在使用 B 的 getInitialState 调用 onTabChange 函数时重新渲染 B。一种方法是将 x、y、z 作为单个对象传递(即 }{x:5,y:8,z:10}。然后在 getInitialState 中,您可以检查是否设置了该道具,如果它是作为初始状态返回该道具,如果不是返回 abc。所以它看起来像:

var A = React.createClass({
onTabChange:function(e, id){
    this.setState( {tabIndex:id} );
    ReactDOM.render(<B />, document.getElementById("bContainer));
},

render:function(){
var values= {x:5,y:8,z:10};
return <div>
    <FormTabs options={['A', 'B', 'C']} onChange={this.onTabChange} value={this.state.tabIndex} /> // This creates 3 simple tabs 
    <div id="bContainer">
        <B values={values} />
    </div>
</div>;
}});

var B = React.createClass({
   getInitialState:function(){
      if (this.props.values !== undefined) {
          return this.props.values
      }
      return {
         x: a,
         y: b,
         z: c
       }
   },   

   render:function(){
      //this.state.x = this.props.x;
      //this.state.y = this.props.y;
      //this.state.z = this.props.z;

      return <div>
          //...
         </div>
      }
   };
});

然后,您可以直接在 B 渲染中使用状态变量。
希望这会有所帮助。

【讨论】:

  • 我知道我可以使用状态变量。我承认这个问题解释得有点不清楚。反正已经解决了。
  • @NaibBaghirov 这是您正在寻找的答案还是您以不同的方式解决了它?
  • 实际上不,您的答案有点不正确,因为 B 组件也在我的原始代码中再次呈现。我想要发生的是以某种方式卸载 B 组件或删除它的所有实例,以便当我在“onTabChange”函数之后渲染它时,它的值默认为初始状态值。我通过一种解决方法解决了这个问题,这可能不是最好的解决方案,但它有效,这就是我想要的。感谢您努力回答这个问题。
猜你喜欢
  • 2021-06-27
  • 2023-03-08
  • 1970-01-01
  • 2021-06-29
  • 2015-05-10
  • 1970-01-01
  • 2021-01-06
  • 2020-04-27
  • 2020-10-30
相关资源
最近更新 更多