//因为useEffect可以被调用多次,所以使用数组 prevDepsAry = [[name], [count]]
let prevDepsAry = [];
// 每次组件重新渲染effectIndex都会在render方法中置为0
let effectIndex = 0
function 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] = depsAry
effectIndex++
}
}
疑问:
// 这段代码有什么作用
prevDepsAry[effectIndex] = depsAry
effectIndex++
正如useState调用多次一样,useEffect同一页面也可以调用多次,所以也需要index与prevDepsAry数组做存储。