深入理解vue中的$set

yizhihongxing

下面是关于“深入理解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日

相关文章

  • 详解Vue 普通对象数据更新与 file 对象数据更新

    详解Vue 普通对象数据更新与 file 对象数据更新 在Vue中,我们可以通过v-model指令来进行表单元素的双向数据绑定,其中包括普通对象数据更新和file对象数据更新。 1.普通对象数据更新 在Vue中,普通对象数据更新非常简单,只需要在Vue实例中定义data数据,然后在需要进行绑定的表单元素上使用v-model指令即可。以下是一个简单的示例,展示…

    Vue 2023年5月28日
    00
  • Vue父子模版传值及组件传值的三种方法

    下面是“Vue父子模版传值及组件传值的三种方法”的完整攻略: 1. 父子模板传值 1.1 props Vue中通过使用props来实现父子组件之间传递数据的功能。在父组件中,通过定义属性的方式将需要传递的数据绑定在子组件上;在子组件中,通过props选项来声明需要绑定哪些属性,最终父组件的数据会通过props传递给子组件。 下面是一个使用props传递数据的…

    Vue 2023年5月27日
    00
  • vue-cli3使用mock数据的方法分析

    vue-cli3使用mock数据的方法分析 什么是Mock数据 在前端开发中,当需要访问后端接口来获取数据时,如果后端接口还没有开发完成或者还没有部署到服务器中,前端开发人员就无法进行开发工作。而使用Mock数据可以解决这个问题。 Mock数据是指在前端开发中,为了模拟真实的后端接口数据而创建的一组模拟数据,可以使用一些工具快速生成,比如json-serve…

    Vue 2023年5月28日
    00
  • antfu大佬的v-lazy-show教我学会了怎么编译模板指令

    下面是详细讲解“antfu大佬的v-lazy-show教我学会了怎么编译模板指令”的完整攻略。 什么是v-lazy-show指令? v-lazy-show是一个自定义指令,它可以让我们实现懒加载元素的显示。在元素位于可视区域附近时,该元素会被显示出来。这个指令是由antfu大佬开发的,它的主要思路就是通过Intersection Observer API实现…

    Vue 2023年5月28日
    00
  • vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件

    使用vue-cli 3来集成vue-bootstrap-datetimepicker日期插件,需要使用以下步骤: 步骤一:安装依赖 在命令行中进入项目根目录,然后运行以下命令来安装需要的依赖: npm install vue-bootstrap-datetimepicker –save 步骤二:引入CSS和JS文件 在你的Vue组件之前,需要引入CSS和J…

    Vue 2023年5月29日
    00
  • JS去掉字符串末尾的标点符号及删除最后一个字符的方法

    下面是完整攻略: 方法一:使用正则表达式 我们可以使用正则表达式来匹配并删除字符串末尾的标点符号。具体步骤如下: 使用replace()方法来替换匹配到的最后一个标点符号。 为了匹配到字符串末尾的标点符号,可以使用正则表达式/[^\w\s]|_$/。该正则表达式可以匹配除字母、数字、下划线、空格以外的任何字符,或者任务末尾的下划线。 使用字符串方法slice…

    Vue 2023年5月27日
    00
  • vuejs element table 表格添加行,修改,单独删除行,批量删除行操作

    以下是“vuejs element table 表格添加行,修改,单独删除行,批量删除行操作”的攻略。 添加行 要添加行,首先需要在data中定义一个空的数组来存放表格数据。然后,在模板中使用el-table组件和el-table-column组件来渲染表格,并给el-table组件绑定数据源。 接下来,我们可以在模板中添加一个类似“添加行”的按钮,当用户点…

    Vue 2023年5月28日
    00
  • vue实现表格合并功能

    下面我将详细讲解如何用Vue实现表格合并功能。 步骤1:引入需求组件 首先,为了实现表格合并功能我们需要引入一个支持表格合并的Vue组件库。我这里推荐使用 vue-table-with-tree-grid 这个组件库,该组件库封装了表格组件和树形结构组件,支持表格合并功能,非常适用于对树形表格需求。 你可以在项目的 package.json 文件中引入该组件…

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