| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> vue1历史源码解析:数组更新检测 -> 正文阅读 |
|
[JavaScript知识库]vue1历史源码解析:数组更新检测 |
前言我们先来看看vue对应数组更新检测的文档:数组更新检测 1、Vue.js 包装了被观察数组的变异方法,故它们能触发视图更新。被包装的方法有:
2、Vue.js 不能检测到下面数组变化:
解析Q:数组更新检测的整体思路是什么呢? A:通过重新包装数据中数组的push、pop等常用方法。 注意,这里重新包装的只是数据数组(也就是我们要监听的数组,也就是vue实例中拥有的data数据)的方法,而不是改变了js原生Array中的原型方法。否则,当与vue无关的数组更新的时候,居然触发了vue的方法那就晕菜了 代码实现
PS:如果不能理解这里的 当然还有Vue先判断了一下是否能使用 深入思考ok,目前为止我们已经实现了如何监听数组的变化了。 但是,我们仔细回想一下,疑惑Vue为什么不采用 继承数组 来实现数组监听的问题呢? 首先,我们来实现一段ES5继承的代码(感兴趣的可以点击看ES5写继承的思路):
那么,把上面的 答案是不能,因为Array,String,Number,Regexp,Object 等JS的内置类 执行时不会对传进去的 例如 那么,我们换个思路,是否可以照着数组“仿照”一个构造方法,例如把上面的Parent构造函数模拟成Array,答案也是不行的,这也是那个著名的问题的来源: ES5及以下的JS无法完美继承数组。(这是一个著名的问题,大伙们可以随意google,文章非常多,git上有大量的程序员朋友用各种奇技淫巧来实现继承数组实现队列、栈等等子类,但都不是完美的),主要有以下两个原因: (1)因为数组有个响应式的
(2)数组内部的 而为什么一定要用这两种方法来判断是否是数组大家应该都看过相关文章把,比如 因为上面的两个原因导致你根本没办法继承数组,ES6倒是解决了这个问题,不管是 除非是
到此,我们用 当然,这种形式来监听数组意味着 Vue 只能监听到那 7个异化方法 的执行,对于修改 数组为什么不能通过defineProperty的方式呢首先 Vue 是反对你用 Vue.set/delete的。 但是增删属性的需求确实是有的,并且不少,所以他俩存在的意义是保证这种需求至少可以得到满足。 但是这种需求是低频的。而数组元素增删则是极其高频的 你会去 set/delete data上的10个属性吗? 可能你100行代码里都没有一个this.$delete,但是对于数组而言, 你增/删10个、100个、1000个元素都是再平常不过的需求。几乎所有数组使用都伴随着高频的数组元素删除。 同时,数组元素增删的方法是多样化的。 举个例子, 回忆一下数组的那个"响应式" length 属性(在数组10000下标里填写元素, 数组 length 自动变成10001; 给数组length属性赋值为0, 会自动清空数组所有元素). 所以,现在的问题就出现了,你如果强行 hack , 去改造那些增、删的手段, 让用户每次增删元素, 你都能监听到, 并且在监听到之后使用 Vue.set / delete,那么因为增、删的高频性。会使得 Vue.set/ delete同样高频,但是 Vue.set / delete 会带来明显性能问题的呀。对于 data 的直接属性的 set 和 delete 会使得所有 同时,因为数组增删元素的多样性会带来代码实现上的极大复杂度,最关键的是即使代码量增加了,你也无法真正做到任何时候都能监听到他的增删操作,是的,没有方法。 所以,对每一个数组元素defineProperty带来代码本身的复杂度增加和代码执行效率的降低, 为什么不采用简单的改写数组7大方法来实现呢? |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 3:12:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |