vue2基本响应式实现方式之让数组也变成响应式

让数组也变成响应式是Vue框架中非常重要的一块内容。下面我将详细讲解Vue2的基本响应式实现方式来实现这个功能。

Vue2基本响应式实现方式

Vue2使用了ES5 Object.defineProperty() 方法来实现数据的响应式。它会递归遍历对象所有的属性,并使用 Object.defineProperty() 方法把它们转换为 getter/setter,并在数据被访问/修改时触发通知,如下:

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get: function reactiveGetter() {
      /* 在属性被访问时调用 */
      console.log('getter执行了')
      return val
    },
    set: function reactiveSetter(newVal) {
      /* 当属性值被修改时调用 */
      console.log('setter执行了')
      if (newVal === val) return
      val = newVal
    }
  })
}

以上代码,实现一个基本的响应式getter/setter。可是,它并不能对数组进行响应式更新,但是我们可以通过修改数组的原型来实现对象的响应式更新。

修改数组的原型

修改数组的原型,是一种让数组实现响应式的方法。我们可以在 Vue 实例化时修改数组的原型,使得数组能够响应式更新。这样的代码如下:

const arrProto = Array.prototype
const arrayMethods = Object.create(arrProto)

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

methodsToPatch.forEach(function(method) {
    const original = arrProto[method]
    Object.defineProperty(arrayMethods, method, {
        value: function mutator(...args) {
            original.apply(this, args)
            console.log(`array ${method}更新了`)
        }
    })
})

const arr = []
arr.__proto__ = arrayMethods

arr.push(1)
console.log(arr[0])
// 1

上述代码我们通过修改数组的原型,针对数组常用的几种方法,增加方法(value属性)来监听数组的变化,遇到数组改变(执行了原生方法)就会通知到我们添加的方法,并打印出结果"array ${method}更新了" 。这种方式的缺点是需要在我们的Vue实例化时对我们的数组做出修改,如果移植到其他的项目中,可能会有一些问题。

除此之外,我们还可以使用Vue的observable方法来做到这一点,这样会更加方便,也会更加推荐。

使用Vue的observable方法

Vue2提供了observable方法来供我们创建一个响应式对象,我们可以借助这个方法来让数组实现响应式更新。方法具体实现如下:

const { observable } = Vue;
const a = observable( [] );
a.push( 1 );  // a变化,触发getter和setter
console.log( a[0] ); // 1

我们仍然使用 Array.prototype.push() 方法向数组中添加元素,在执行 push() 方法时,observable() 方法会监听数据变化,在数据更新后执行相应操作,因此我们每次改变数组时, getter/setter 都会更新。

示例说明

以上就是使用原生方法让数组变成响应式的俩种方式,下面我再介绍几个示例说明。

  1. 对象和数组都响应式更新
const mydata = { a: 1,b: 2,c: [1,2,3]}
const obsData = Vue.observable(mydata)
obsData.c.push(4)
console.log(obsData.c) // [1,2,3,4]

在这个示例中,我们创建了一个对象 mydata 和一个称之为obsData 的响应式对象。当我们将 obsData.c 修改 var a = 1量时,数组会自动更新并触发响应。整个数据的更新过程都是响应式的

  1. 数组替换
const mydata = { list: [1, 2, 3] }     // 定义了一个对象,包含数组 list 
const obsData = Vue.observable(mydata)  // 创建obsData响应式对象

obsData.list = [4, 5, 6]               // 替换数组 list
console.log(obsData.list)              // 返回值为 [4, 5, 6], 数据完成响应式更新

这个示例中,我们已经将obsData.list替换为另一个数组。整个数组的替换过程都是响应式的,也就是说当我们替换数组的时候,Vue会自动检测这个数组的变化并触发响应。

好了,以上就是使用Vue2的基本响应式实现方式之让数组也变成响应式的完整攻略。如有疑问,请提出。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue2基本响应式实现方式之让数组也变成响应式 - Python技术站

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

相关文章

  • 浅析Vue 和微信小程序的区别、比较

    浅析Vue和微信小程序的区别、比较 Vue和微信小程序都是前端技术,目的都是为了提供更好的用户体验。但是Vue和微信小程序的开发、使用方式和运行环境等方面有所不同,下面将对它们进行简单的比较和分析。 开发方式 Vue和微信小程序的开发方式有很大的不同。 Vue使用Vue CLI和其他构建工具来创建和管理项目,使用Vue组件化开发,采用MVVM模式,提供更加灵…

    Vue 2023年5月27日
    00
  • 详解vue.js的devtools安装

    详解vue.js的devtools安装 简介 Vue.js Devtools 是一款专门针对 Vue.js 进行开发者调试的浏览器插件,可以用于检查 Vue 组件层次结构、所有的活动组件、组件的数据、组件事件等,Vue.js Devtools 安装之后,可以大大提高我们的代码调试效率。 安装步骤 步骤一:Chrome 网上应用商店下载 在 Chrome 应用…

    Vue 2023年5月27日
    00
  • 详解Vue中的自定义指令

    关于Vue中自定义指令的详解攻略,可以分为以下几个部分: 1. 什么是自定义指令? 自定义指令是Vue提供的一种扩展其现有工具的方法,用于在元素上添加复杂的行为。自定义指令可以用于修改元素的行为、样式或者某种功能的实现,基本上可以在任何需要直接操作DOM的场合使用。Vue提供了注册、钩子函数等多种方式来编写自定义指令。 2. 如何在Vue中定义自定义指令? …

    Vue 2023年5月27日
    00
  • JS基于递归实现倒计时效果的方法

    当我们需要倒计时的效果时,JS基于递归实现倒计时就是一种很不错的方案了。接下来我将为大家讲解如何使用JS实现基于递归的倒计时效果。 步骤一:准备样式 通过CSS设置我们的倒计时样式,使页面表现更加美观。这里我们假设我们的倒计时样式类名为 countdown。 .countdown { font-size: 24px; color: #666; } 步骤二:编…

    Vue 2023年5月28日
    00
  • vue在html标签{{}}中调用函数的方法总结及对比

    下面是详细讲解“vue在html标签{{}}中调用函数的方法总结及对比”的完整攻略。 问题描述 在vue中,我们可以使用{{}}这样的语法来渲染数据到HTML标签中。但是如果我们需要在渲染的时候执行一些函数,该怎么处理呢?比如,如果我们有一个计算方法,需要将结果插入到HTML标签中,应该怎么做呢? 解决方案 方法一:使用计算属性 在vue中,我们可以使用计算…

    Vue 2023年5月28日
    00
  • vue项目无法删除的问题及解决

    当我们在使用Vue开发项目时,有时候会出现Vue项目无法删除的情况。这种情况往往是因为项目中的一些文件或者进程仍在运行,阻止了我们删除整个项目。接下来,我将为大家提供一份完整的攻略,帮助大家解决这一问题。 问题描述 当我们使用命令行删除Vue项目时,可能会出现以下错误提示: rmdir “xxx:被占用的文件夹无法删除”。 这个错误提示通常是因为该文件夹正在…

    Vue 2023年5月29日
    00
  • Vue3源码分析侦听器watch的实现原理

    下面是关于“Vue3源码分析侦听器watch的实现原理”的完整攻略。 理论基础 在学习 Vue3 的侦听器 watch 实现原理之前,我们需要先了解一下 Vue2 中的侦听器实现原理。在 Vue2 中,我们使用 Object.defineProperty 方法为组件实例对象上的数据属性设置 get 和 set 方法,从而实现了对某个数据属性的侦听。但是这种方…

    Vue 2023年5月29日
    00
  • Vue中的组件注册方法及注意事项

    下面让我来为大家详细讲解一下“Vue中的组件注册方法及注意事项”的攻略。 组件注册方法 在 Vue 中,我们要使用组件,首先需要通过 Vue.component()方法来注册组件。该方法接受两个参数,第一个参数是组件名称,第二个参数是组件定义对象。具体方式如下: Vue.component(‘my-component’, { // 组件定义对象 }) 除了全…

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