《Vue设计与实现》第四章 第三节 嵌套的effect

1.《Vue设计与实现》第四章 第三节 嵌套的effect

嵌套的effect代码

effect(effectFn1(){
	console.log('effectFn1函数执行了')
	effect(effectFn2(){
		console.log('effectFn2函数执行了');
		obj.ok;
	})
	obj.name;
})

从上面这段代码的执行来看
effect函数的定义

function effect(fn) {
	let effectFn = () => {
		activeFffect = effectFn; 
		cleanup(effectFn)
		fn();
	}
	effectFn.deps = [];
	effectFn();
}

结果时这样的
在这里插入图片描述
结论

  1. 在同一时间内activeFffect 变量只能为一个值。
  2. 内层的副作用函数,会覆盖外层的副作用函数。
  3. 所以obj.name, obj.ok保存的副作用函数都是同一个。

如何解决这个问题
4. 我们需要一个副作用函数栈 effectStack。
5. 在副作用函数执行时,将当前的副作用函数压入栈中。
6. 待副作用函数执行完毕之后将其从栈中弹出,并始终让activeEffect指向栈顶的副作用函数

let activeEffect;
let effectStack = [];
function effect(fn) {
	const effectFn = () => {
		activeEffect = effectFn;
		effectStack.push(effectFn);
		fn();
		effectStack.pop();
		activeEffect = effectStack[effectStack.length - 1];
	}
	effectFn.deps = [];
	effectFn();
}

在这里插入图片描述
这样就完美的解决了这个effect嵌套的问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值