import React, { Component } from 'react';
import PropTypes from 'prop-types';
import Counter from './Counter';
class SummaryContainer extends Component {
constructor (props) {
super(props);
this.onChange = this.onChange.bind(this);
this.computSum = this.computSum.bind(this);
this.state = {
sum: this.computSum()
}
}
componentDidMount () {
this.context.store.subscribe(this.onChange);
}
onChange () {
this.setState({
sum: this.computSum()
});
}
computSum () {
console.log(this.context.store); // TypeError: Cannot read property 'store' of undefined
// const data = this.context.store.getState();
// let sum = 0;
// Object.keys(data).forEach((v) => {
// sum += data[v];
// });
return 30;
}
render() {
return <Summary sum={this.state.sum}/>;
}
}
class Summary extends Component {
render() {
return (
<div>
<Counter caption="First" />
<Counter caption="Second" />
<Counter caption="Third" />
<h3 style={{ marginTop: '30px' }}>sum: {this.props.sum}</h3>
</div>
);
}
}
SummaryContainer.contextTypes = {
store: PropTypes.object
}
export default SummaryContainer;
SummaryContainer 和 Summary分别为容器组件和傻瓜组件,SummaryContainer中的computSum方法为页面初始时调用,这里运行会报“TypeError: Cannot read property ‘store’ of undefined”,这里产生原因是在constructor中调用时,上下文未获取到值,解决修改如下
constructor (props, context) { // 加上context参数
super(props, context); // 加上context
this.onChange = this.onChange.bind(this);
this.computSum = this.computSum.bind(this);
this.state = {
sum: this.computSum()
}
}
在constructor和super分别加上context参数,再运行下,问题解决。