react context初始加载读取不到上下文的内容

本文详细解析了在React应用中,由于上下文未正确获取导致的TypeError错误。通过调整SummaryContainer组件的构造函数,引入context参数并传递给super,解决了因store属性未被识别而引发的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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参数,再运行下,问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值