模拟实现 useEffect
// useEffect(setup, dependencies?);
const createEffectManager = () => {
// 保存清除函数
let cleanup;
// 保存依赖项
let dependencies = [];
const useEffect = (setup, deps) => {
// 判断依赖项是否发生变化
const isChanged = dependencies.some((dep, i) => dep !== deps[i]);
if (isChanged || !dependencies.length) {
if (typeof cleanup === "function") {
cleanup();
}
// 执行副作用函数,并保存清除函数
cleanup = setup();
// 更新依赖项
dependencies = deps;
}
};
return { useEffect };
};
const effectManager = createEffectManager();
const MyComponent = () => {
effectManager.useEffect(() => {
console.log("Effect has been run");
return () => {
console.log("Cleanup previous effect");
};
}, []);
};
MyComponent(); // First render
MyComponent(); // Second render with same dependencies