3. $set() 与 Vue.set() 的使用
3.1 通过 Vue.set() 改写
语法:
Vue.set( target, propertyName/index, value )
{Object | Array} target
{string | number} propertyName/index
{any} value
返回值:设置的值。
向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新。
它必须用于向响应式对象上添加新 property,因为 Vue 无法探测普通的新增 property (比如 this.myObject.newProperty = 'hi')
对象不能是 Vue 实例,或者 Vue 实例的根数据对象。
<template>
<div class="home">
<div>{{student}}</div>
<div v-for="(item,index) in items" :key="index">{{item}}</div>
<button @click="btn()">修改</button>
</div>
</template>
<script>
import Vue from 'vue' // 别忘了引入
export default {
name: 'Home',
data(){
return{
student:{
name:'张三',
items:[1, 2, 3],
methods:{
btn(){
Vue.set(this.student, 'age', 18);
Vue.set(this.items, 1, 'two');
console.log(this.student,this.items);
</script>
当点击按钮后页面:
当点击按钮后控制台:
3.2 通过 $set() 改写
语法:
vm.$set( target, propertyName/index, value )
{Object | Array} target
{string | number} propertyName/index
{any} value
返回值:设置的值。
这是全局 Vue.set 的别名。
参考:Vue.set
<template>
<div class="home">
<div>{{student}}</div>
<div v-for="(item,index) in items" :key="index">{{item}}</div>
<button @click="btn()">修改</button>
</div>
</template>
<script>
export default {
name: 'Home',
data(){
return{
student:{
name:'张三',
items:[1, 2, 3],
methods:{
btn(){
this.$set(this.student, 'age', 18);
this.$set(this.items, 1, 'two');
console.log(this.student,this.items);
</script>
当点击按钮后页面:
当点击按钮后控制台:
3.3 Vue.set() 和 this.$set() 的区别
Vue.set() 源码:
import { set } from '../observer/index'
Vue.set = set
this.$set() 源码
import { set } from '../observer/index'
Vue.prototype.$set = set
可以发现 Vue.set() 和 this.$set() 这两个 api 的实现原理基本一模一样,都是使用了set函数。
set 函数是从 …/observer/index 文件中导出的。
区别: Vue.set( ) 是将 set 函数绑定在 Vue 构造函数上,this.$set() 是将 set 函数绑定在 Vue原型上。