Vue 更新数据 Vue.set 的属性和方法

简介: Vue 更新数据 Vue.set 的属性和方法

在对象中新增属性时,页面不会自动更新。可以用 Vue.set 方法解决。

通过下标修改数组中的值,页面也不会自动更新。可以用数组的方法或 Vue.set 方法解决。

特注:Vue.set 不能给 vm 或根数据对象 data 添加属性!!!

修改对象时的问题:

<div id="APP">
  <h3>{{title}}:</h3>
  <p>{{info.name}}</p>
  <p>{{info.age}}</p>
  <button @click="editAge">修改学生年龄</button>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      title: "学生信息",
      info:{
        name: "张三",
        age: 20
      }
    }
  },
  methods:{
    editAge(){
      this.info.age = 26;
    }
  }
});

:当我们修改 data 中原有的数据时,Vue 可以识别到,并且自动更新页面的内容。

但是我们往对象中新增内容时,Vue 就识别不到了。

<div id="APP">
  <h3>{{title}}:</h3>
  <p>姓名:{{info.name}}</p>
  <p>年龄:{{info.age}}</p>
  <button @click="addAge">添加学生年龄</button>
</div>

:在页面输出一个对象中没有的属性,并不会发生报错。

const vm = new Vue({
  el: "#APP",
  data(){
    return {
      title: "学生信息",
      info:{
        name: "张三"
      }
    }
  },
  methods:{
    addAge(){
      this.info.age = 20;
    }
  }
});

:点击按钮后,学生年龄并没有渲染到页面中。但是我们在控制台输入 vm.info.age 时,可以看到 info 中确实已经添加了 age 属性。

 

原因:在控制台输入 vm.info 查看时可以发现,新增的属性没有 get 和 set 方法,所以 Vue 监听不到 age 的变化,也就不会自动渲染到页面中了。

使用 Vue.set 修改对象:

解决以上问题很简单,只需要用 Vue.set 方法添加属性就可以解决了。

<div id="APP">
  <h3>{{title}}:</h3>
  <p>姓名:{{info.name}}</p>
  <p>年龄:{{info.age}}</p>
  <button @click="addAge">添加学生年龄</button>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      title: "学生信息",
      info:{
        name: "张三"
      }
    }
  },
  methods:{
    addAge(){
      // 语法格式:Vue.set(要修改的对象, 属性名, 属性值);
      Vue.set(this.info, 'age', 20);
      // 也可以使用 this.$set 效果一致。
      // this.$set(this.info,'age',20);
    }
  }
});

:通过 Vue.set 方法添加的属性,Vue 是可以识别到的,它也会自动渲染到页面中。并且在控制台输入 vm.info 可以看到,新增的 age 属性也带有 get 和 set 方法。

 

需要注意的是,Vue.set 不能直接在 data 中添加属性。

<div id="APP">
  <h3>标题:{{title}}</h3>
  <p>姓名:{{info.name}}</p>
  <button @click="addTitle">添加标题</button>
</div>

:直接在页面中输入一个没有的属性时,会发生报错。

const vm = new Vue({
  el: "#APP",
  data(){
    return {
      info:{
        name: "张三"
      }
    }
  },
  methods:{
    addTitle(){
      Vue.set(this,'title','学生信息');
    }
  }
});

:直接在 data 中添加属性时,会发生报错!!!

 

总结:也就是说 Vue.set 只能给 data 中的某个对象添加属性,而不能直接给 data 添加属性。

修改数组时的问题:

<div id="APP">
  <h3>{{title}}:</h3>
  <ul>
    <li v-for="(item,index) in list" :key="index">{{item}}</li>
  </ul>
  <button @click="editList">修改第一个爱好</button>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      title: "爱好",
      list: ['草莓', '烧饼', '辣条']
    }
  },
  methods:{
    editList(){
      this.list[0] = '火锅';
    }
  }
});

:当我们通过下标修改数组中的内容时,Vue 也是监测不到的。这是因为 Vue 没有给数组中的每个值设置 get 和 set 方法。所以修改后页面不会发生任何变化。

 

不过 Vue 为我们重新封装了数组中的七个方法,供我们使用操作数组。他们分别是:

// 尾部新增 push
数组.push(要新增的值);
// 尾部删除 pop
数组.pop();
// 头部新增 unshift
数组.unshift(要新增的值);
// 头部删除 shift
数组.shift();
// 数组指定删除 splice
数组.splice(从哪开始删除, 删除几个);
// 数组指定添加 splice
数组.splice(在第几个之前添加, 0, 要添加的值);
// 数组指定替换 splice
数组.splice(替换掉第几个内容, 1, 替换后的值);
// 颠倒数组 reverse
数组.reverse();
// 排序数组 sort
数组.sort((a,b) => { return a-b; });

:只有能修改原数组的方法才可以被 Vue 监听。当使用数组的其他方法时,需要将修改后的值重新赋给原数组。

所以,以上的问题我们就可以使用 splice 方法来解决。

<div id="APP">
  <h3>{{title}}:</h3>
  <ul>
    <li v-for="(item,index) in list" :key="index">{{item}}</li>
  </ul>
  <button @click="editList">修改第一个爱好</button>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      title: "爱好",
      list: ['草莓', '烧饼', '辣条']
    }
  },
  methods:{
    editList(){
      this.list.splice(0, 1, '火锅');
    }
  }
});

:通过 splice 方法修改数组中的内容后,Vue 就可以识别到,并更新页面中的内容。

 

使用 Vue.set 修改数组:

<div id="APP">
  <h3>{{title}}:</h3>
  <ul>
    <li v-for="(item,index) in list" :key="index">{{item}}</li>
  </ul>
  <button @click="editList">修改第一个爱好</button>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      title: "爱好",
      list: ['草莓', '烧饼', '辣条']
    }
  },
  methods:{
    editList(){
      // 语法格式:Vue.set(要修改的数组, 下标, 修改后的值);
      Vue.set(this.list, 0, '火锅');
    }
  }
});

:用 Vue.set 方法也可以通过下标修改数组中的内容。

 

原创作者: 吴小糖

创建事件:2023.3.16

相关文章
|
1月前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
40 6
|
1月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
41 3
|
12天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
11天前
|
Java Windows
IDEA不使用lombok,如何快速生成get和set方法
【11月更文挑战第10天】在 IntelliJ IDEA 中生成 `get` 和 `set` 方法有多种方式:通过菜单操作、使用快捷键或自定义模板。菜单操作包括选择“Code”菜单中的“Generate...”,快捷键为“Alt + Insert”。自定义模板可在“File”-&gt;“Settings”-&gt;“Editor”-&gt;“Code Style”-&gt;“Java”中设置。批量生成时,可多选变量一次性生成。
|
21天前
|
JavaScript 数据管理 Java
在 Vue 3 中使用 Proxy 实现数据双向绑定的性能如何?
【10月更文挑战第23天】Vue 3中使用Proxy实现数据双向绑定在多个方面都带来了性能的提升,从更高效的响应式追踪、更好的初始化性能、对数组操作的优化到更优的内存管理等,使得Vue 3在处理复杂的应用场景和大量数据时能够更加高效和稳定地运行。
39 1
|
21天前
|
JavaScript 开发者
在 Vue 3 中使用 Proxy 实现数据的双向绑定
【10月更文挑战第23天】Vue 3利用 `Proxy` 实现了数据的双向绑定,无论是使用内置的指令如 `v-model`,还是通过自定义事件或自定义指令,都能够方便地实现数据与视图之间的双向交互,满足不同场景下的开发需求。
44 1
|
29天前
|
Rust Java
set 方法是坏味道?
【10月更文挑战第19天】
27 5
|
28天前
|
API
vue3知识点:响应式数据的判断
vue3知识点:响应式数据的判断
27 3
|
29天前
|
存储 缓存 JavaScript
vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解
vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解
47 2
|
1月前
|
Java
Java Set以其“不重复”的特性,为我们提供了一个高效、简洁的处理唯一性约束数据的方式。
【10月更文挑战第16天】在Java编程中,Set接口确保集合中没有重复元素,每个元素都是独一无二的。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet则基于红黑树实现,不仅去重还能自动排序。通过这两个实现类,我们可以轻松处理需要唯一性约束的数据,提升代码质量和效率。
38 2
下一篇
无影云桌面