我试图在ES6中使用有状态的React组件但是当我定义构造函数时,构造函数只会在组件被渲染多次(从其父级)时被调用一次。示例如下所示。
class SubComponent extends React.Component {
constructor(props) {
super(props);
console.log("Creating sub component");
this.state = { count: props.count };
}
render() {
console.log("Rendering sub component", this.state.count);
return (<div>count: {this.state.count}</div>);
}
}
class App extends React.Component {
constructor(props) {
super(props);
console.log("Creating app");
this.state = { count: 0 };
this.tick = this.tick.bind(this);
setInterval(this.tick, 1000);
}
tick() {
this.setState({ count: this.state.count + 1 });
}
render() {
console.log("Rendering app", this.state.count);
return (<SubComponent count={this.state.count} />);
}
}
这不会更新渲染的输出(它总是count: 0
),但会输出日志:
Creating app
Rendering app 0
Creating sub component
Rendering sub component 0
Rendering app 1
Rendering sub component 0
Rendering app 2
Rendering sub component 0
Rendering app 3
Rendering sub component 0
...
这是一个JSFiddle:http://jsfiddle.net/jor0xu1a/1/
我知道示例SubComponent
并不需要状态,但我尝试尽可能简单地显示我的问题。
我错过了什么?
答案 0 :(得分:3)
在SubComponent中,props
没有状态 - 将其更改为this.props.count
,这将有效
答案 1 :(得分:2)
我建议您阅读Props in getInitialState Is an Anti-Pattern。
基本上,尽可能少的组件应具有状态。正如其他答案已经说过的那样,在您的情况下,您可以使用this.props.count
来引用当前值。似乎没有任何理由为SubComponent
拥有自己的状态。
但是,如果您真的想从它收到的道具中计算组件的状态,那么您有责任使用生命周期方法componentWillReceiveProps
保持它们的同步:
componentWillReceiveProps(nextProps) {
this.setState({count: nextProps.count});
}
答案 2 :(得分:0)
你的SubComponent应该是:
class SubComponent extends React.Component {
constructor(props) {
super(props);
console.log("Creating sub component");
}
render() {
return (<div>count: {this.props.count}</div>);
}
}
答案 3 :(得分:0)