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

相关文章
|
3月前
|
存储 数据采集 供应链
属性描述符初探——Vue实现数据劫持的基础
属性描述符还有很多内容可以挖掘,比如defineProperty与Proxy的区别,比如vue2与vue3实现数据劫持的方式有什么不同,实现效果有哪些差异等,这篇博文只是入门,以后有时间再深挖。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
124 18
|
9月前
|
JavaScript API
vue学习(13)监视属性
vue学习(13)监视属性
148 57
|
9月前
|
缓存 JavaScript
vue学习(12)计算属性
vue学习(12)计算属性
122 60
|
9月前
|
缓存 JavaScript
vue学习(12)计算属性
vue学习(12)计算属性
116 59
|
7月前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
8月前
|
JavaScript API
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
129 1
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
|
9月前
|
缓存 JavaScript 前端开发
vue-day02计算属性,v-bind,v-if,v-for
文章介绍了Vue.js中的计算属性、class与style的绑定、条件渲染和列表渲染的使用。通过示例代码展示了如何使用计算属性简化模板逻辑、如何通过v-bind动态绑定class和style、如何使用v-if进行条件渲染以及如何使用v-for进行列表渲染。这些特性使得Vue.js在构建动态用户界面时更加灵活和强大。
vue-day02计算属性,v-bind,v-if,v-for
|
8月前
|
监控 JavaScript 开发者
在 Vue 中,子组件为何不可以修改父组件传递的 Prop,如果修改了,Vue 是如何监控到属性的修改并给出警告的
在 Vue 中,子组件不能直接修改父组件传递的 Prop,以确保数据流的单向性和可预测性。如果子组件尝试修改 Prop,Vue 会通过响应式系统检测到这一变化,并在控制台发出警告,提示开发者避免这种操作。
|
8月前
|
JavaScript 前端开发 开发者
VUE学习一:初识VUE、指令、动态绑定、计算属性
这篇文章主要介绍了Vue.js的基础知识,包括初识Vue、指令如v-for、v-on的使用、动态属性绑定(v-bind)、计算属性等概念与实践示例。
106 1