深入理解vue中的$set

下面是关于“深入理解Vue中的$set”的完整攻略。

什么是$set

在 Vue.js 中,我们经常需要在已有的数据对象中添加新的属性,但是这样做是响应式的吗?答案是否定的。因为 Vue.js 在初始化实例时将属性转化为 getter/setter,所以属性必须在初始化时存在才能让 Vue.js 转化它为响应式的数据。但是,Vue提供了一种方法来帮助我们完成动态添加响应式数据的操作,那就是Vue.set$set 方法。

在代码中加入 Vue.set 或者 this.$set,可以通过 Vue.set 或者 this.$set 来将一个对象的属性设为响应式属性,这样当新属性被添加时,Vue会通知所有的依赖它的组件进行渲染更新。

什么时候使用$set

当我们想要改变原有数组或对象的某个属性时,Vue.js 无法监听到这种变化。这时候,我们一般有以下两种方式:

  1. 直接使用数组的变异方法,例如 push,splice 等,对象直接使用属性值的变化。
  2. 通过set方法更新

方式一虽然会改变原有变量的值,但是 Vue.js 无法更新它的 DOM,也就是说,如果想要更新页面中的数据,我们需要使用$set。

方式二是当我们想要更新一个对象的属性,而又不想全量覆盖对象时。下面我们通过两个示例来具体了解这个方法。

示例1

(1)我们先创建一个包含数组的对象:

var data = { arr: [1, 2, 3] };

(2)现在我们想要向这个数组中添加一个元素。此时我们可以使用push

data.arr.push(4);

但是这样做是不会响应式的。也就是说,虽然我们更新了数据,但是页面中并不会更新:

<div id="app">
  <ul>
    <li v-for="item in arr" :key="item">{{ item }}</li>
  </ul>
</div>

但是,我们可以使用this.$set方法来完成响应式更新:

this.$set(data.arr, 3, 4);

这样就可以实现响应式更新了。

示例2

(1)我们先创建包含一个对象的数组:

var data = { arr: [{ name: "Tom", age: 18 }] };

(2)我们现在需要修改这个对象中的某个属性,比如说,将其age改为20。使用直接赋值的方式修改时,虽然对象中的属性已经被修改,但是页面并没有更新:

data.arr[0].age = 20;

(3)如果我们使用 Vue.set 或 this.$set 方法来修改数据对象中的属性,则可以实现响应式更新:

this.$set(data.arr[0], "age", 20);

这样就可以实现响应式更新了。

总结

  • 使用 Vue.js 时,尽量避免在对象上直接新添加属性。
  • 在添加新的属性时,应使用 Vue.set 或 this.$set 方法。
  • 使用 Vue.set 或 this.$set 方法,可以实现全局响应式更新,而普通的赋值则不能做到。
  • 对于修改数组元素、直接修改对象属性值的操作,Vue.js 无法捕获到,不会触发数据更新视图,可以使用 Vue.set 或 this.$set 方法来实现响应式更新。

希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解vue中的$set - Python技术站

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

相关文章

  • 详解windows下vue-cli及webpack 构建网站(四) 路由vue-router的使用

    接下来我将详细讲解“详解windows下vue-cli及webpack 构建网站(四) 路由vue-router的使用”的完整攻略。 标题和前言 标题 “详解windows下vue-cli及webpack 构建网站(四) 路由vue-router的使用” 前言 当我们的网站变得越来越复杂时,我们需要将页面拆分为多个模块和页面,通过路由跳转实现,在这篇文章中,…

    Vue 2023年5月28日
    00
  • vue实现PC端录音功能的实例代码

    Vue实现PC端录音功能的实例代码需要通过JS录音库来实现,常用的开源录音库有Recorder.js和RecordRTC,这两个库都可以用于Vue项目的录音。 下面是实现步骤及示例代码: 步骤一:安装录音库 使用npm安装Recorder.js或RecordRTC npm install recorderjs npm install recordrtc 步骤…

    Vue 2023年5月28日
    00
  • vue+element-ui+axios多文件上传的实现并显示整体进度

    下面我会详细讲解“vue+element-ui+axios多文件上传的实现并显示整体进度”的完整攻略,具体分为以下几个步骤: 第一步:安装所需依赖 在使用这种方式进行文件上传时,我们需要用到vue、element-ui和axios这几个主要的依赖。因此,首先需要在项目中安装它们: npm install vue element-ui axios –save…

    Vue 2023年5月28日
    00
  • Vue2 响应式系统之异步队列

    当我们修改 Vue 实例数据时,Vue 会根据监听的数据属性触发响应式更新。Vue 2.x 的响应式系统包含依赖追踪和异步队列两个部分,其中异步队列主要负责缓存数据变更并批量更新 DOM,以最小代价更新视图。具体来说,异步队列可以将同一事件循环中的数据变更缓存起来,避免了对于同一数据进行多次 DOM 更新,降低了性能消耗。而且通过微任务让 DOM 更新在下一…

    Vue 2023年5月29日
    00
  • 详解Vue3的响应式原理解析

    详解Vue3的响应式原理解析 什么是响应式原理 Vue3的核心原理之一是响应式原理。简单来说,响应式原理是让运用了Vue3的项目能够在数据发生改变时实时进行视图更新的机制。 响应式原理的实现 Vue3的响应式原理通过Proxy实现。Proxy是ES6引入的一种代理机制,类似于Object.defineProperty(),但是比defineProperty更…

    Vue 2023年5月27日
    00
  • Vue + Axios 请求接口方法与传参方式详解

    下面是详细讲解 “Vue + Axios 请求接口方法与传参方式详解” 的完整攻略。 简介 Vue 是一个渐进式框架,许多 web 应用程序使用它来构建 UI。Axios 是一个基于 promise 的 HTTP 库,可以用于进行数据请求。在 Vue 中,我们可以结合 Axios 在应用程序中轻松地发送数据请求。 本攻略将为您提供如何使用 Vue + Axi…

    Vue 2023年5月27日
    00
  • three.js 利用uv和ThreeBSP制作一个快递柜功能

    下面我将详细讲解通过利用uv和ThreeBSP制作一个快递柜功能的完整攻略。 1. 什么是ThreeBSP ThreeBSP是一种能够用于对Three.js中的3D模型进行布尔运算(Union、Intersection、Difference)的工具。有了 ThreeBSP,我们就可以用简单的API调用对3D模型的形状进行编辑、剖分、重组等操作,非常方便。 2…

    Vue 2023年5月28日
    00
  • vue-ajax小封装实例

    下面我将为您详细讲解”vue-ajax小封装实例”的完整攻略。 介绍 在Vue.js中,我们经常需要通过ajax向服务端请求数据或提交数据,而Vue.js并没有提供自带的ajax函数。因此,我们需要自己针对Vue.js进行封装ajax函数,以便能够在Vue.js中更好地使用ajax请求。 axios与vue-resource选择 目前,市面上流行的封装Aja…

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