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

yizhihongxing

让数组也变成响应式是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日

相关文章

  • mpvue中使用flyjs全局拦截的实现代码

    mpvue是一个能够基于Vue.js快速开发小程序的框架。与Vue.js类似,mpvue的语法和API几乎与之相同,开发者可以在短时间内熟练掌握其使用。而flyjs是一个优秀的基于Promise的HTTP请求库,能够支持拦截器等高级功能。本文将详细讲解在mpvue中使用flyjs全局拦截的实现代码,以及两个示例说明。 安装和使用flyjs 首先,在mpvue…

    Vue 2023年5月28日
    00
  • 一步步讲解Vue如何启动项目

    作为Vue项目的作者,我很乐意为您介绍如何启动Vue项目。下面是一步步讲解的完整攻略: 步骤一:安装 Node.js Vue.js 是一个基于Node.js构建的应用程序框架,因此,为了启动 Vue 项目,首先需要安装 Node.js。请访问 Node.js 官网 下载并安装 Node.js 的最新版本。 步骤二:使用 Vue CLI 快速创建一个 Vue …

    Vue 2023年5月28日
    00
  • 如何在vue3+ts项目中使用query和params传参

    在Vue3 + TypeScript项目中,我们可以通过组合使用 params 和 query 来实现路由传参。下面是具体的步骤: 1. 安装路由 首先,我们需要通过 npm 或者 yarn 来安装 vue-router 路由插件。可以使用以下命令进行安装: npm install vue-router yarn add vue-router 2. 创建路由…

    Vue 2023年5月27日
    00
  • Vue.js实现可排序的表格组件功能示例

    当我们开发一些管理性质的网站时,表格是非常基本的需求。常见的表格功能有分页、排序、搜索等,其中销售额这类的表格,排序功能尤其重要。 Vue.js是一种渐进式JavaScript框架,具有轻量级、高效率、易上手等优点,因此成为了前端开发中的热门工具。下面介绍如何通过Vue.js实现可排序的表格组件功能示例。 第一步:拆分组件 首先将一个整体的表格组件拆分成多个…

    Vue 2023年5月29日
    00
  • vue多环境配置之 .env配置文件详解

    Vue多环境配置之.env配置文件详解 什么是.env配置文件 .env配置文件是对不同环境下的应用程序进行配置的文件。它不应该存在于版本控制系统中,因为该文件可能包含敏感信息,比如数据库密码、API密钥等。 在Vue项目中,.env是一个前缀为名字的文件,其中的变量可以在应用程序中访问。在不同环境下,可以创建不同的.env文件。Webpack在打包过程中,…

    Vue 2023年5月28日
    00
  • 基于vue实现多引擎搜索及关键字提示

    实现基于Vue的多引擎搜索及关键字提示主要包括以下步骤: 构建基础页面结构 在HTML文件中,构造基础的页面结构,包括搜索框和搜索按钮等必要的组件。同时,引入Vue.js库和相关依赖。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> …

    Vue 2023年5月27日
    00
  • 如何用webpack4带你实现一个vue的打包的项目

    下面是如何用webpack4带你实现一个vue的打包的项目的完整攻略。 一、安装和配置webpack 首先安装webpack和webpack-cli依赖: npm install webpack webpack-cli –save-dev 然后在项目根目录下创建webpack.config.js文件,并写入如下配置: module.exports = { …

    Vue 2023年5月28日
    00
  • vscode配置vue下的es6规范自动格式化详解

    下面给您详细讲解“VSCode配置Vue下的ES6规范自动格式化”攻略。 1. 安装必要插件 在使用VSCode编写Vue项目时,需要安装以下插件: Vetur:Vue语法高亮及格式化 Prettier – Code formatter:代码格式化工具 ESLint:代码语法及规范检查插件 这三个插件的作用分别是:Vue语法高亮及格式化、自动代码格式化、代码…

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