Vue源码学习之关于对Array的数据侦听实现

这里提供一份 Vue 源码学习关于对 Array 数据侦听实现的完整攻略。

概述

Vue 框架作为数据驱动的 MVVM 框架,在响应式数据更新时能够实现高效的性能优化,是设计优秀的前端框架之一。而在 Vue 的响应式系统中,“对数组的数据侦听”是一个重要的实现细节,它可以实现监听数组数据变化并动态的更新视图。这也是 Vue 与其他前端框架的一个区别。

数组侦听实现

在 Vue 中,对于需要侦听的对象,会通过 Object.defineProperty 方法 实现属性拦截,从而实现对该对象的监听。而对于数组,则通过重写数组的原型方法来实现对数组数据的侦听。

源码分析

首先,Vue 在初始化时会先判断是否支持使用原生 __proto__ 属性。如果支持,Vue 会直接重写原型方法;否则,Vue 会创建一个新的对象,并将需要重写的数组原型方法挂载在该对象上,最后在数组对象上重新设置 __proto__ 属性;

接着,针对要被重写的 原型方法 pushpopshiftunshiftsplicesortreverse,Vue对这些数组方法增加了一个或多个拦截器。如 push 方法如下:

// src/core/observer/array.js

const arrayProto = Array.prototype;
export const arrayMethods = Object.create(arrayProto);

const methodsToPatch = [
  'push',
  'pop',
  'shift',
  'unshift',
  'splice',
  'sort',
  'reverse'
];

// 对数组对象的7个变异方法,添加拦截器
methodsToPatch.forEach(function (method) {
  // 原始方法
  const original = arrayProto[method];
  // 覆盖数组原型方法
  def(arrayMethods, method, function mutator (...args) {
    const result = original.apply(this, args);
    const ob = this.__ob__;
    let inserted;
    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args;
        break;
      case 'splice':
        inserted = args.slice(2);
        break;
    }
    // 对插入的新元素进行响应式处理
    if (inserted) ob.observeArray(inserted);
    // 通知依赖更新
    ob.dep.notify();
    return result;
  });
});

我们可以看到,Vue 重写了数组的原型方法,并为数组的7个变异方法添加了拦截器。拦截器会拦截数组变化并进行响应式更新,通知依赖更新。

示例说明

我们来看一下一个实际的示例,这个示例是一个模板引擎库的源码(我翻译了一下),它基于 Vue 实现。在模板引擎中,我们可以使用 JavaScript 表达式,包括用于处理数组的方法。在下面的示例中,我们可以看到如何使用数组的 splice 方法来删除数组中的项:

<template>
  <ul>
    <li v-for="(item, index) in list" :key="index">{{ item }}</li>
  </ul>
  <button @click="deleteLastItem()">删除最后一个元素</button>
</template>

<script>
export default {
  data() {
    return {
      list: ['苹果', '香蕉', '草莓']
    }
  },
  methods: {
    deleteLastItem() {
      this.list.splice(this.list.length-1, 1)
    }
  }
}
</script>

上述示例中,我们使用 splice 方法从 list 数组中删除最后一个元素,删除后,Vue 会自动检测到该数组的数据变化,并执行相应的更新。

再来看一个使用 push 方法添加一个项的示例:

<template>
  <button @click="addItem()">添加元素到数组中</button>
  <div>
    {{ list }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: []
    }
  },
  methods: {
    addItem() {
      this.list.push('新加入的元素')
    }
  }
}
</script>

我们可以通过上述示例看到,当我们使用 push 方法添加新项时,Vue 同样会自动响应式更新视图。

总结

通过以上分析,我们可以看出 Vue 在对数组进行操作时,会重写数组的原型方法,并在方法内添加响应式逻辑。这种方式能较为高效地实现局部更新,且在我们在使用 Vue 的过程中,我们可以像普通数组一样正常使用其方法,并且能自动地触发相应的更新,这也是 Vue 响应式能力的重要部分之一。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue源码学习之关于对Array的数据侦听实现 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • 带你一文了解Vue生命周期钩子

    带你一文了解Vue生命周期钩子 Vue生命周期钩子是指Vue在组件实例化、数据更新、渲染页面等不同阶段执行的方法。这些钩子函数对于理解Vue的生命周期非常重要,因为他们使得我们有机会在特定时间节点执行自己的代码。 Vue生命周期的三个阶段 Vue的生命周期可以分为三个主要的阶段: 创建阶段(Creation):在这个阶段Vue实例化组件、设置数据观测、初始化…

    Vue 2023年5月27日
    00
  • vue2.x双向数据绑定原理解析

    vue2.x双向数据绑定原理解析 什么是双向数据绑定 双向数据绑定是指视图层和数据层之间的数据同步。当数据层中的数据发生变化时,视图层会自动更新;反之,当视图层中用户操作修改了数据时,数据层的数据也会自动更新。 通常而言,双向数据绑定有两种方式,一种是脏值检测(angular.js),另一种则是数据劫持(vue.js)。 本文将介绍 vue2.x 中的数据劫…

    Vue 2023年5月27日
    00
  • 手把手教你搭建一个vue项目的完整步骤

    下面是搭建Vue项目的完整步骤: 1. 创建Vue项目 创建Vue项目有多种方式,这里我们以 Vue CLI 为例。先确保已经安装了 Node.js,然后执行命令: npm install -g @vue/cli 安装成功后,使用 vue create 命令创建项目: vue create my-project 根据提示选择一些基本配置,然后等待安装完成即可…

    Vue 2023年5月28日
    00
  • Vue MVVM模型与data及methods属性超详细讲解

    Vue是一个基于MVVM架构模式的一款前端框架,可轻松实现数据和视图的绑定,其中data和methods是Vue实例中的常用属性,下面详细讲解其使用方法。 MVVM模型 MVVM模型指的是Model-View-ViewModel模式,将数据(Model)和视图(View)的表示分离,ViewModel则是数据和视图之间的链接。在Vue中,Model就是数据,…

    Vue 2023年5月28日
    00
  • 从零开始实现Vue简单的Toast插件

    让我们开始讲解“从零开始实现Vue简单的Toast插件”的完整攻略。 1. 确定插件的功能和结构 在进行插件开发之前,我们需要确定Toast插件的基本功能以及它的结构。一般来说,Toast插件应该能够在页面上显示一条简短的提示信息,比如操作成功或者失败。根据这个要求,我们可以定义一个名为VueToast的插件,并且将它的HTML结构定义如下: <div…

    Vue 2023年5月28日
    00
  • Vue 实现穿梭框功能的详细代码

    实现穿梭框功能需要依赖于 Vue.js 框架和一些 UI 组件库,本文以 element-ui 为例,给出一份详细的代码实现攻略。下面是具体步骤: 步骤一:引入 Element UI 首先,在 index.html 中引入 Element UI: <link rel="stylesheet" href="https://u…

    Vue 2023年5月28日
    00
  • vue3.0自定义指令(drectives)知识点总结

    下面就是关于“vue3.0自定义指令(drectives)知识点总结”的完整攻略: 一、什么是Vue自定义指令? 在Vue中,除了内置指令(例如:v-if、v-for等)之外,还可以自定义指令,用于对DOM元素进行增强操作。自定义指令是以v-作为前缀定义的,例如:v-myDirective。 自定义指令由两个钩子函数构成,分别为bind和update。其中b…

    Vue 2023年5月28日
    00
  • 快速了解vue-cli 3.0 新特性

    快速了解vue-cli 3.0 新特性 简介 vue-cli是一个脚手架工具,用于在Vue.js项目中快速生成模板和配置文件。在Vue.js一系列项目中,vue-cli是一个非常重要的工具,对于Vue.js的开发和部署有着重要的作用。 vue-cli 3.0 新特性 vue-cli 3.0是一个全新的版本,这个版本有着重要的改进和新特性,使得用户可以更轻松的…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部