Vue——04-01用$set给对象添加属性

简介: 用$set给对象添加属性

由于 Vue 会在初始化实例时进行双向数据绑定,使用Object.defineProperty()对属性遍历添加 getter/setter 方法,所以属性必须在 data 对象上存在时才能进行上述过程 ,这样才能让它是响应的。如果要给对象添加新的属性,此时新属性没有进行过上述过程,不是响应式的,所以会出想数据变化,页面不变的情况。此时需要用到$set。

由于 JavaScript 的限制,Vue 不能检测数组和对象的变化。

例:这里想点击按钮时添加一个新元素,用JavaScript新增元素

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  </head>
  <body>
  <div id="app">
            <h2>{{person.name}}</h2>
      <h2>{{person.age}}</h2>
    <h2 v-show="person.sex">{{person.sex}}</h2>
    <button @click="add">增加性别</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
  <script>
    const app = new Vue({
    el: "#app",
    data(){
      return {
      person:{
        name:'张三',
        age:30,
      }
      }
    },
    methods: {
                 add(){
      this.person.sex = '女'
      console.log(this.person);
     }
    },
    })
  </script>
  </body>
</html>

这里并不会渲染到浏览器中,只会出现在控制台

6913c56241e24c518d49131258120f37.png

对于已经创建的实例,Vue 不允许动态添加根级别的响应式 property。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式 property。例如,对于:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  </head>
  <body>
  <div id="app">
            <h2>{{person.name}}</h2>
      <h2>{{person.age}}</h2>
    <h2 v-show="person.sex">{{person.sex}}</h2>
    <button @click="add">增加性别</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
  <script>
    const app = new Vue({
    el: "#app",
    data(){
      return {
      person:{
        name:'张三',
        age:30,
      }
      }
    },
    methods: {
                 add(){
      Vue.set(this.person,'sex','女')    //
     }
    },
    })
  </script>
  </body>
</html>

输出效果:

c888f5a4760f47a6ab7f61e788c5749d.png

也可以通过this.$set(object, propertyName, value)实例方法,例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
</head>
<body>
  <div id="app">
  <h2>{{person.name}}</h2>
  <h2>{{person.age}}</h2>
  <h2 v-show="person.sex">{{person.sex}}</h2>
  <button @click="add">增加性别</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
  <script>
  const app = new Vue({
    el: "#app",
    data() {
    return {
      person: {
      name: '张三',
      age: 30,
      }
    }
    },
    methods: {
    add() {
      this.$set(this.person, 'sex', '女')//this.$set(object, propertyName, value)
    }
    },
  })
  </script>
</body>
</html>

这里也是可以渲染出来的

ba08417246c34a918ac51b57a59c74b4.png

相关文章
|
12天前
|
JavaScript API
Vue3中的计算属性能否动态修改
【9月更文挑战第5天】Vue3中的计算属性能否动态修改
42 10
|
27天前
|
JavaScript 前端开发 索引
vue之$set
vue之$set
|
12天前
|
JavaScript API
如何使用Vue3的可计算属性
【9月更文挑战第5天】如何使用Vue3的可计算属性
44 13
|
4天前
|
缓存 JavaScript
vue学习(12)计算属性
vue学习(12)计算属性
15 3
|
4天前
|
缓存 JavaScript
vue学习(12)计算属性
vue学习(12)计算属性
15 2
|
20天前
|
JavaScript 前端开发
vue获取元素属性
vue获取元素属性
34 3
|
1月前
|
JavaScript 开发工具 git
Vue学习之--------脚手架的分析、Ref属性、Props配置(2022/7/28)
这篇文章分析了Vue脚手架的结构,并详细讲解了`ref`属性和`Props`配置的基础知识、代码实现和测试效果,展示了如何在Vue组件中使用`ref`获取DOM元素或组件实例,以及如何通过`Props`传递和接收外部数据。
Vue学习之--------脚手架的分析、Ref属性、Props配置(2022/7/28)
|
1月前
|
缓存 JavaScript
Vue学习之--------计算属性(2022/7/9)
这篇文章通过代码实例和效果测试,详细讲解了Vue计算属性的概念、实现方式、优势以及与插值语法和methods的区别。
Vue学习之--------计算属性(2022/7/9)
|
1月前
|
JavaScript 数据处理
如何使用 Vue.js 将数据对象的值放入另一个数据对象中?
如何使用 Vue.js 将数据对象的值放入另一个数据对象中?
|
1月前
|
JavaScript
Vue学习之--------监视属性(2022/7/10)
这篇博客文章详细介绍了Vue框架中的监视属性(watch)功能,通过天气案例展示了监视属性的基础知识、代码实例、测试效果、深度监视、监视属性简写以及在项目中的实际应用。