校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > js语言和框架 > 基本语法-if\show
题目

Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决?

解答
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<template>
    <div>
      <ul>
        <li v-for="value in obj" :key="value">
          {{value}}
        </li>
      </ul>
      <button @click="addObjB">添加obj.b</button>
    </div>
  </template>
  <script>
  export default {
    data () {
      return {
        obj: {
          a: 'obj.a'
        }
      }
    },
    methods: {
        addObjB () {
        this.obj.b = 'obj.b'
        console.log(this.obj)
      }
    }
  }

点击button会发现, obj.b 已经成功添加,但是视图并未刷新。

原因在于在Vue实例创建时, obj.b 并未声明,因此就没有被Vue转换为响应式的属性,自然就不会触发视图的更新,这时就需要使用Vue的全局api—— $set():

1
2
3
4
5
addObjB () {
        // this.obj.b = 'obj.b'
        this.$set(this.obj, 'b', 'obj.b')
        console.log(this.obj)
      }

$set() 方法相当于手动的去把 obj.b 处理成一个响应式的属性,此时视图也会跟着改变了

C 3条回复 评论
胡俟

太棒了,我也是从事开发工作近十年的程序员,现在主要带新手学Java

发表于 2023-03-30 21:00:00
0 0
Yates

在Vue创建实例时,新增属性并未被声明,因此就没有被Vue转换成响应式的属性,自然就不会触发视图的更新。
解决方法:使用$set()方法手动把新增的属性处理成响应式属性。

发表于 2020-10-19 11:06:05
0 0
酸柠檬啊

$set() 方法相当于手动的去把 obj.b 处理成一个响应式的属性,此时视图也会跟着改变了  

发表于 2020-10-06 11:50:54
0 0