//因为useEffect可以被调用多次,所以使用数组 prevDepsAry = [[name], [count]]let prevDepsAry = [];// 每次组件重新渲染effectIndex都会在render方法中置为0let effectIndex = 0function useEffect(callback, depsAry) {// 首先判断callback是不是函数if(Object.prototype.toString.call(callback) !== '[object Funtion]') throw new Error("useEffect的第一个参数必须为函数")// 判断 depsAry 有没有被传递,没有被传递的话每次都调用传入的函数if(typeof depsAry === 'undefined'){// 调用传入的函数callback()}else{// 判断depsAry是不是数组, 如果不是数组直接返回错误信息if(Object.prototype.toString.call(depsAry) !== '[object Array]') throw new Error('useEffect第二个参数应为数组')// 获取上一次的状态值let prevDeps = prevDepsAry[effectIndex]// 判断depsAry数组中传入的值是否有变化let hasChanged = depsAry.every((dep, index) => dep === prevDeps[index]) === false// 如果有变化,调用传过来的函数if(hasChanged){callback()}//同步依赖值prevDepsAry[effectIndex] = depsAryeffectIndex++}}
疑问:
// 这段代码有什么作用prevDepsAry[effectIndex] = depsAryeffectIndex++
正如useState调用多次一样,useEffect同一页面也可以调用多次,所以也需要index与prevDepsAry数组做存储。
