vue2 源码修改这 3 行,有啥用?

2020-08-08 11:41:43 +08:00
 az22c

https://github.com/vuejs/vue/commit/91deb4fd910afd51137820f120d4c26d0a99e629

如这个 commit,其实就加了 1 句 const cloned = fns.slice()

放在这个 js 代码上下文里面,好像没有区别。

我看了一下 commit 所指向的 issue,也好像没有关联。自己找个项目去 vue 源码那里修改一下,对比一下,发现好像修改前后没有区别。

3703 次点击
所在节点    Vue.js
12 条回复
tikazyq
2020-08-08 11:50:56 +08:00
可读性
binux
2020-08-08 11:52:58 +08:00
fns 执行过程中会变?
xiangyuecn
2020-08-08 11:55:20 +08:00
加了 const cloned = 。。。 可读性比旧版差多了,slice 创建新数组,在这段代码里面一点意义都没有
LostPrayers
2020-08-08 11:56:44 +08:00
看 const , 应该还是为了防止 fns 被修改导致 循环提前结束吧, 玄学 js
xiangyuecn
2020-08-08 11:57:40 +08:00
撤回#3 😂 fns = invoker.fns 😂
BarZu
2020-08-08 11:59:35 +08:00
fix: multiple merged vnode hooks not invoked properly 人家标题已经告诉你修复了什么问题了
az22c
2020-08-08 12:15:13 +08:00
我把背景交代一下:
重新加载组件都是先更新好 fns 属性,然后 invoker 函数作为 DOM 绑定的回调函数会在未来执行,并且它是用到 fns 的。

```
// [伪代码] 判断出用户在该组件添加 click 事件,将这些事件更新到 fns 数组中
dom.addEventListener('click', invoker() {
// [伪代码] 用到 invoker.fns
})
```
好像 2 楼 4 楼正解
@binux
@LostPrayers
az22c
2020-08-08 12:15:59 +08:00
@BarZu 水平不够,没看懂啊,所以一开始觉得和 issue 关联不大
tonytonychopper
2020-08-08 13:44:16 +08:00
这里只是把 fns 拷贝一份出来,否则其他代码可能会导致 fns 改变,进而影响这里的执行。
tonytonychopper
2020-08-08 13:44:52 +08:00
@tonytonychopper 如果不是这样,那这段代码就没啥意义。
lizz666
2020-08-08 14:26:17 +08:00
看了 #5 楼,估计这里就是拷贝一份出来,后面 fns 会被重新赋值,没去看 vue 源码
JayLin1011
2020-08-11 15:29:00 +08:00
不可变状态思想的浅应用,稳定状态更新。Vue 源码栈结构的相关操作涉及浅拷贝,要么是为了稳定目标对象,要么是为了缓存优化性能。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/696664

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX