不确定这是否是React.js错误或"功能"的Javascript语言。我有一个名为Page
的React.js( edit:using v0.12.x )组件,它充当路由器并根据路由选择子组件。我创建了一个mixin,它添加了一个名为runRoute
的函数,它接受一个JSX组件并使用Page
的{{1}}方法更新setState
。此外,state.routeComponent
还会调用runRoute
以确保重新呈现forceUpdate()
。
问题是,当它们属于同一个类时,React不会区分状态中的两个组件。我会解释一下。
我有两个名为Page
和Board
的子组件。 Profile
被重用于不同的上下文。如果运行两个使用Board
的连续路由,则React.js不会更新UI。仅当使用不同类的连续路由(例如<Board/>
)实际更新UI时才会这样做。如果状态更改为使用<Profile/>
的另一条路线,则只会将UI更新为适当的<Board/>
状态。
以下是<Board/>
和<Page/>
混音下面的示例代码:
Router.js
Router
Page.jsx
module.exports = function(){
return {
getInitialState: function () {
return {
routeComponent: null
};
},
runRoute: function(component){
this.setState({routeComponent: component});
this.forceUpdate();
},
componentWillMount: function() {
var self = this;
self.router = Router(self.routes).configure({
resource: self,
notFound: self.notFound
});
self.router.init();
}
};
}
感谢是否有人对此有所了解。谢谢!
答案 0 :(得分:2)
如果没有查看Board
组件,不能肯定地说,但看起来问题是它的状态依赖于属性,并且在更新属性时不会使它们保持同步(在{{之后) 1}})。
以下是演示此问题的简单示例(jsfiddle):
runRoute
点击链接会更改var Board = React.createClass({
getInitialState: function() {
return {title: this.props.title}
},
render: function() {
return <h1>{this.state.title}</h1>
}
});
var Page = React.createClass({
getInitialState: function () {
return {routeComponent: null}
},
handleClick: function(title) {
var self = this;
return function() {
self.setState({ routeComponent: <Board title={title} /> })
}
},
render: function() {
return <div>
<a href='#' onClick={this.handleClick('Trending')}>Trending</a>
<br/>
<a href='#' onClick={this.handleClick('Most Loved')}>Most Loved</a>
{this.state.routeComponent}
</div>;
}
});
的状态,但不会更改Page
的直观表示。
您需要通过处理componentWillReceiveProps
中的更改,使Board
的状态与其更新的属性保持同步。
只需向Board
添加几行即可解决问题:
Board
作为旁注: componentWillReceiveProps: function(props) {
this.setState({title: props.title})
},
之后您永远不需要this.forceUpdate()
。如果没有它就无法获得所需的行为,那么你做错了。