这一块逻辑没搞懂,setstate不是一直是undefined吗?

来源:4-8 【全局数据传递】组件化Context Provider

NBADOTA2

2021-02-08

const setState = useContext(appSetStateContext)
    //console.log(setState)
    const addToCart = () => {
         // 思考: 同学们可以想一想如何化简这里的代码
        if (setState) {
            console.log('2222')
            setState(state => {
                return {
                    ...state,
                    shoppingCart: {
                        items: [...state.shoppingCart.items, {id, name}]
                    }
                }
            })
        }
    }
写回答

1回答

阿莱克斯刘

2021-02-13

hello 同学,新年好啊。

这里的逻辑有点绕,但是很重要。关于setState为undefined的原因,我们应该从下向上追溯源头。

  • 首先,这里(Robot组件)的setState可以被认为是hook,所以与类组件的this.setState是两码事

  • 第二,观察setState的定义,useContext hook中传入的是appSetStateContext,所以setState的类型是跟着appSetStateContext走的。

  • 第三,打开 "/appState.tsx"可以找到appSetStateContext的定义,定义如下图所示,

        //img1.sycdn.imooc.com/szimg/6026eac6093dde6119840294.jpg

appSetStateContext 定义的是一个函数,是一个混合类型,而它的初始化为undefined。所以,这就是setState undefined 类型的来源。

而app启动完成以后,下图第19行的代码就会把 defaultContextValue 与 setState hook 绑定起来,而最后setState 又会与 appSetStateContext 的 provider 绑定链接,传递给 Robot 组件。

//img1.sycdn.imooc.com/szimg/6026ec77097f7e9f17220754.jpg

这个部分的逻辑略显复杂,比较重要,可以结合react文档来学习。https://zh-hans.reactjs.org/docs/context.html#gatsby-focus-wrapper

如果实在不理解,也不用着急,可以先暂时跳过,学习接下来的内容,等课程大部分内容学完以后,再回头看看或许就能融会贯通了。

祝你新年快乐、万事如意啊

2
3
qq_112很简单_0
为什么我拿到执行的时候还是undefined
2022-03-18
共3条回复

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

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

2008 学习 · 1024 问题

查看课程