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

相关文章
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
22 1
|
1月前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
2月前
|
JavaScript API
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
62 1
vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
|
2月前
|
监控 JavaScript 开发者
在 Vue 中,子组件为何不可以修改父组件传递的 Prop,如果修改了,Vue 是如何监控到属性的修改并给出警告的
在 Vue 中,子组件不能直接修改父组件传递的 Prop,以确保数据流的单向性和可预测性。如果子组件尝试修改 Prop,Vue 会通过响应式系统检测到这一变化,并在控制台发出警告,提示开发者避免这种操作。
|
3月前
|
缓存 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
|
2月前
|
JavaScript 前端开发 开发者
VUE学习一:初识VUE、指令、动态绑定、计算属性
这篇文章主要介绍了Vue.js的基础知识,包括初识Vue、指令如v-for、v-on的使用、动态属性绑定(v-bind)、计算属性等概念与实践示例。
65 1
|
2月前
|
缓存 JavaScript 前端开发
探索Vue.js中的计算属性与侦听器
【10月更文挑战第5天】探索Vue.js中的计算属性与侦听器
28 1
|
2月前
|
缓存 JavaScript
|
2月前
|
缓存 JavaScript Serverless
vue中computed计算属性、watch侦听器、methods方法的区别以及用法
vue中computed计算属性、watch侦听器、methods方法的区别以及用法
128 0
|
2月前
|
JavaScript 索引
Vue中对象或数组数据更新但视图不刷新问题的解决策略
Vue中对象或数组数据更新但视图不刷新问题的解决策略
134 0