2015-07-20 26 views
1

发生UI事件时,我的顶级React组件接收数据以用作外部对象的道具。我想知道更新组件的道具以用于下一个渲染的正确方法。从外部源设置道具

看起来像组件生命周期方法之一应该处理这个问题,但似乎并非如此。

下面的代码显示了我试过:

Root.update自定义的方法调用外部一旦数据已准备就绪。显示的两种技术都有效。

Root.getDefaultProps用于检索第一个渲染道具。

Root.render这也适用,但在第一次渲染时是多余的。

Root.componentWillUpdate不起作用,但似乎应该。

Root.componentWillReceiveProps这对工作没有意义;道具不会从React组件收到。

var Root = React.createClass({ 

    update: function() { 
    this.setProps(Obj.data); // works but setProps is deprecated 
    this.props = Obj.data; // always works 
    }, 

    getDefaultProps: function() { 
    return Obj.pageload(); // works on first render 
    }, 

    componentWillUpdate: function() { 
    this.props = Obj.data. // does not work 
    this.setProps(Obj.data); // infinite loop 
    }, 

    componentWillReceiveProps: function() { 
    this.props = Obj.data; // does not work 
    }, 

    render: function() { 
    this.props = Obj.data; // works but is redundant 

    // ... 
    }, 
}); 
+0

道具应该是不可变的。你是否可以在你的根组件上使用状态并将其作为道具传递给子组件? – noveyak

回答

2

在某些时候你必须调用React.render来呈现,最初的根组件与你的道具。

要使用新道具更新组件,只需再次调用React.render即可使用新道具对同一Dom元素上的相同组件进行更新。

这不会重新安装该组件,但实际上只是将挂载的实例发送给您的新道具,并使其重新渲染。

如果您想控制组件接收道具时发生的情况,请查看组件生命周期方法componentWillReceiveProps

+0

感谢您的回复;我没有想过尝试这个。当我读到'setProps'文档的注释时,我正在考虑在组件上调用'render'与'React.render'。非常有用的知道这样做并不意味着React必须从头开始,这正是我所期望的。再次感谢。 – cantera

+0

没问题。由于该方法的措词,我认为这是一个相当普遍的问题;) –