切换语言控制台报错

来源:8-8 【redux重构】action 的拆分与统一

慕粉4283821

2021-03-17

老师,按照你的代码去写之后

切换语言时, 功能没有问题。但是控制台有报错。如下:
图片描述

这是什么原因呀。
看意思是不能在组件构造函数中使用 setState 但是实际上,只有下面这个地方可能报错

// Header.class.tsx文件
constructor(props) {
    super(props);
    const storeState = store.getState();
    this.state = {
      language: storeState.language,
      languageList: storeState.languageList,
    };

    store.subscribe(() => {
      const storeState = store.getState();
      // 这里用了 setState, 但是是在回调内,也不是在构造函数中执行了
      this.setState({
        language: storeState.language,
        languageList: storeState.languageList,
      });
    });
  }
写回答

1回答

阿莱克斯刘

2021-03-19

这个问题是我忽视了。不过首先要注意的是,这是个warning(警告)不是error(错误),这是就是为什么网站可以正常运行,语言操作也能正常进行。


不过这个问题确实值得我们注意,warning告诉我们在组件还没加载进来的时候不可以调用setState,那么在代码中,我们的确在store.subcribe的callback中调用了setState,而store.subcribe又是在constructor中调用的。


还记得第三章、第四章的内容吗?组件加载的顺序是constructor -> componentDidMount ->  componentWillunMount。问题就是constructor调用的时候组件根本还没加载进来,所以出现了warning。不过幸运的是我们的setState实际上是跑在store.subcribe中的callback中,正是因为callback延缓了组件加载的时机,所以尽管有warning,但网站确没有出问题。


那么我们应该怎么修复这个问题呢?我们可以把store.subcribe放在componentDidMount中就可以解决问题了。



0
1
慕粉4283821
非常感谢!
2021-03-19
共1条回复

React18 系统精讲 结合TS打造旅游电商平台

React18 精讲 + 结合 TS 实战 + 热门业务开发,获取必备技能

1993 学习 · 1015 问题

查看课程