vue 重写数组的七个方法

这篇具有很好参考价值的文章主要介绍了vue 重写数组的七个方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为什么要重写数组方法?

Vue 为了实现响应式数据绑定,需要能够捕获到数据的变化,以便在数据发生改变时自动更新视图。JavaScript 中的数组是引用类型,所以常规的引用跟踪机制不能捕获数组内部的变化。因为Vue的响应式是通过 Object.defineProperty()实现的,这个api没办法监听数组长度的变化,也就没办法监听数组的新增。所以为了更友好的操作数组并触发响应式检测,Vue对改变原数组(数组本身)的方法进行了重写。

Vue通过原型拦截的方式重写了数组的7个方法,首先获取到这个数组的Observer。如果有新的值,就调用observeArray对新的值进行监听,然后调用notify,通知render watcher,执行update。

二、vue重写数组的七个方法分别是哪些?

push()、pop()、shift()、unshift()、splice()、sort()、reverse()

说明:vue只重写了这7个方法,使用其它数组方法不会主动触发试图更新,例如 concat、slice 等,如果需要触发更新,我们可以使用Vue.set() 或 this.$set() 方法手动触发更新。另外,Vue3处理响应数据使用了Proxy,系统会自动捕获这些操作,并在数据变化时触发视图更新,所以不需要重写数组方法。

三、重写数组方法源码

// 获取数组的原型Array.prototype
var arrayProto = Array.prototype

// 新建一个继承于Array的对象
var arrayMethods = Object.create(arrayProto)

// 列出需要重写的数组方法名
var methodsToPatch = [
  "push",
  "pop",
  "shift",
  "unshift",
  "splice",
  "sort",
  "reverse",
]

// 遍历上述数组方法名,依次将上述重写后的数组方法添加到arrayMethods对象上
methodsToPatch.forEach(function (method) {
  // 缓冲原始数组的方法
  var original = arrayProto[method]

  // 利用Object.defineProperty对方法的执行进行改写
  def(arrayMethods, method, function mutator(val) {
    var args = [],
      len = arguments.length;
    while (len--) args[len] = arguments[len]
    // 执行原数组方法
    var result = original.apply(this, args)
    var inserted
    switch (method) {
      case "push":
      case "unshift":
        inserted = args;
        break;
      case "splice":
        inserted = args.slice(2);
        break;
    }
    // 在此处进行通知
    return result
  })
})

// 进行监听
function def(obj, key, val, enumerable) {
  Object.defineProperty(obj, key, {
    value: val,
    enumerable: !!enumerable,
    writable: true,
    configurable: true
  })
}

具体来说,当调用重写的数组方法时,Vue 会执行以下步骤:

1.调用原始的数组方法,例如 push()、pop()、splice() 等。

2.在执行数组方法后,Vue 检测到数组发生了变化。

3.Vue 发出通知,触发视图的重新渲染,确保视图与数据保持同步。

这种重写机制使得开发者在操作数组时无需手动去触发视图更新,Vue 自动为你处理了这部分逻辑。

说明:这些重写仅适用于通过 Vue 实例声明的数组。如果你直接使用原生的数组方法,Vue 将无法捕获到变化,可能导致视图不更新。文章来源地址https://www.toymoban.com/news/detail-650889.html

到了这里,关于vue 重写数组的七个方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript 手写代码 第七期(重写数组方法三) 用于遍历的方法

    我们在日常开发过程中,往往都是取出来直接用,从来不思考代码的底层实现逻辑,但当我开始研究一些底层的东西的时候,才开始理解了JavaScript每个方法和函数的底层实现思路,我认为这可以很好的提高我们的代码水平和逻辑思维。 2.1.1 基本使用 forEach() 方法用于调用数组

    2024年02月12日
    浏览(41)
  • 〖大前端 - 基础入门三大核心之JS篇㉔〗- JavaScript 的数组的常用方法 (一)

    当前子专栏 基础入门三大核心篇 是免费开放阶段 。 推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费开放 , 购买任意白宝书体系化专栏可加入 TFS-CLUB 私域社区。 福利:除了通过订阅\\\"白宝书系列专

    2024年02月07日
    浏览(34)
  • 【前端灵魂脚本语言JavaScript⑤】——JS中数组的使用

    🐚 作者: 阿伟 💂 个人主页: Flyme awei 🐋 希望大家多多支持😘一起进步呀! 💬 文章对你有帮助👉关注✨点赞👍收藏📂 第一种: var 数组名 = new Array(); 创建一个空数组 第二种: var arr2 = new Array(10); 创建一个定长为10的数组 第三种 var arr3 = new Array(a,b,c); 创建时直接指定元素值

    2023年04月08日
    浏览(42)
  • 〖大前端 - 基础入门三大核心之JS篇㉓〗- JavaScript 的「数组」

    当前子专栏 基础入门三大核心篇 是免费开放阶段 。 推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费开放 , 购买任意白宝书体系化专栏可加入 TFS-CLUB 私域社区。 福利:除了通过订阅\\\"白宝书系列专

    2024年02月04日
    浏览(43)
  • JavaScript:js数组/对象遍历方法

    一、js遍历方法 序号 方法 描述 1 for 使用最基本的for循环可以遍历数组 2 for of for...of语句用来遍历可迭代对象(包括数组、Set、Map、字符串等),它可以替代传统的for循环和forEach()方法。for...of循环每次迭代都将返回一个值,而不是索引。 3 for in for...in语句用来遍历对象的可

    2024年02月09日
    浏览(44)
  • 使用ChatGPT教学的七个案例

       自OpenAI公司2022年11月30日发布ChatGPT3.5以来,其技术在各行业的应用火爆全球,而且技术迭代速度很快,2023年3月15日又推出了ChatGPT4.0。处在当今人工智能时代的大潮下,教师要与时俱进,积极应用ChatGPT辅助自己的教学。 本文通过7个较为完整的案例阐明如何在自己所教的学

    2024年02月15日
    浏览(32)
  • 最高效的七个云原生开发原则

    ​Cloud native是一种软件开发方法,利用云基础架构实现更快、更可扩展的部署。云原生应用程序旨在充分利用现代化的工程实践,如自动化、托管服务和自动扩展控制。 这种模式对组织文化和工作实践也有影响。云技术应成为软件交付的重要组成部分。每个人都应该意识到云

    2024年02月02日
    浏览(26)
  • 选购音箱的七个指标,你知道吗?

    前言:现如今 人们的生活水平越来越高, 已经不单纯于满足于温饱问题,更多是追求精神上的享受。日常休闲、工作繁忙之余大家喜欢k歌、听音乐来放松消遣。日常居家大家为了 随时随地享受到好音乐 , 就会在家里购置音箱, 但你知道一款好的音箱该 如何 选购吗? 如今

    2024年02月02日
    浏览(31)
  • 用Flutter你得了解的七个问题

    Flutter是Google推出的一款用于构建高性能、高保真度移动应用程序、Web和桌面应用程序的开源UI工具包。Flutter使用自己的渲染引擎绘制UI,为用户提供更快的性能和更好的体验。 Flutter使用Dart语言,具有强大的类型、效率和易学能力,基本上你会写JS,就可以快速入门。但是,

    2024年02月01日
    浏览(30)
  • win7 诊断并修复网络的七个步骤

    Windows 7新增了一项自动诊断并修复计算机问题的功能,这个功能对于电脑菜鸟来说无疑是雪中送炭,以下笔者以网络问题作为演示。 Windows 7诊断并修复网络问题的步骤: 1、单击“开始”菜单,弹出的窗口单击“控制面板” 2、在控制面板中找到并打开“疑难解答” 3、在“网

    2024年02月07日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包