VUE 动态给对象增加属性,并触发视图更新。
在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。
根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。
Vue 不允许在已经创建的实例上动态添加新的根级响应式属性 (root-level reactive property)。然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上。
我们编写如下代码测试给一个对象动态添加属性:
<div id="app">
<input v-model="form.amount" />
<input type="button" @click="demoSet()" value="setName">
</div>
<script type="text/javascript">
var vm=new Vue({
el: "#app",
data: {
i:0,
form:{}
},
methods:{
demoSet(){
this.form.amount=this.i++;
//this.$set(this.form,"amount",this.i++);
}
}
});
</script>
这种方式可以给form增加一个属性,但是不会界面不会响应更新。
正确的做法:
<div id="app">
<input v-model="form.amount" />
<input type="button" @click="demoSet()" value="setName">
</div>
<script type="text/javascript">
var vm=new Vue({
el: "#app",
data: {
i:0,
form:{}
},
methods:{
demoSet(){
this.$set(this.form,"amount",this.i++);
}
}
});
</script>
这样就可以给对象添加amount 属性了。
这个有什么应用场景呢,比如 data.form 属性很多,其中大部分是不需要要的,这时候,可以使用这种方法实现动态添加需要的属性。
需要注意的是,这种方式是不能给根数据添加属性的,比如:
<div id="app">
<input v-model="name" />
<input type="button" @click="demoSet()" value="setName">
</div>
<script type="text/javascript">
var vm=new Vue({
el: "#app",
data: { },
methods:{
demoSet(){
this.$set(this,"name","ray");
}
}
});
</script>
这种方式给data 增加一个 name 属性是无效的。
VUE 动态给对象增加属性,并触发视图更新。的更多相关文章
- Vue.set 向响应式对象中添加响应式属性,及设置数组元素触发视图更新
一.为什么需要使用Vue.set? vue中不能检测到数组和对象的两种变化: 1.数组长度的变化 vm.arr.length = 4 2.数组通过索引值修改内容 vm.arr[1] = ‘aa’ Vu ...
- Vue动态新增对象属性
Vue.set( target, key, value ) 参数: {Object | Array} target {string | number} key {any} value 返回值:设置的值 ...
- vue数组对象修改触发视图更新
直接修改数组元素是无法触发视图更新的,如 this.array[0] = { name: 'meng', age: 22 } 修改array的length也无法触发视图更新,如 this.array. ...
- 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】
方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; priva ...
- Vue 动态修改data 值 并触发视图更新
Vue 动态修改data 值 并触发视图更新 this.$set(obj, key, '') // Vue 动态修改或者添加data key 并触发视图更新
- problem:vue之数据变更没有触发视图更新问题
前言: 数据变更之后,vue如何渲染dom? 实际场景: 更新数据之后,再设置滚动条的位置为什么设置无效? 为什么将隐藏的元素设置为显示状态之后,读取元素状态读取不到? 改变了对象/数组中的值,页面没 ...
- vue动态添加对象属性,视图不渲染
发现数据确实改变了.但是视图没有渲染.原因是赋值的问题,应该这样动态增加属性 vm.$set(vm.template.titleAttachInfoDetail,newKey,newVal) vm 当 ...
- vue 动态添加对象属性
昨天使用vue发现直接给对象添加属性,并不能触发响应更新,后来看文档发现要通过this.$set 函数动态添加才可用,eg: this.$set( obj, key, data)
- python动态获取对象的属性和方法 (转载)
首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding:utf-8 import sys def foo():pass class Cat(object): def __init__ ...
随机推荐
- 虚拟机安装centOs+网络配置(完整说明)
1.新建虚拟机(标准) 选择 (我以后下安装操作系统) 选择Linux 操作系统 版本为CentOS(32位) 虚拟机的名称和位置任意 磁盘容量如下即可 设 ...
- Android SDK + Appium 环境搭建
一.JDK 安装 说明:JDK是包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具,所以必须最先安装. 链接: https://pan.baidu.com/s/1NfNK_K7vukF ...
- 第一篇、Python初识
1.Python文件后缀是否可以任意? 单独执行的时候没关系,但当文件需要导入(即导入模块)的时候,如果不是py后缀的,会出错. 2.执行方法 1) python +文件路径 python + fil ...
- 前端-toggleClass(效果切换,如果存在移除,如果不存在展示)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Delphi RTTI的应用(一)
1.获取DbgrdiEH 某一个选项的属性.加载到ComBox procedure TForm1.FormCreate(Sender: TObject); var PropInfo: PPropInf ...
- 群晖上使用kvm(qemu)笔记[原创]
1.今日偶然逛github里发现一个项目:https://github.com/bsdcpp/synoKVM 下载spk后手工安装,马上可以使用 2.新建XP实例后发现xp的安装盘不认识qemu的vi ...
- JVM系列2:垃圾收集器与内存分配策略
垃圾收集是一个很大话题,本文也只是看了深入理解Java虚拟机总结了下垃圾收集的知识. 首先按照惯例,先上思维导图: 垃圾收集简而言之就是JVM帮我们清理掉内存区域不需要的数据.它主要负责清理堆中实例对 ...
- TensorFlow Android Camera Demo 使用android studio编译安装和解决Execution failed for task ':buildNativeBazel'报错
可以参考官网:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android#android-stud ...
- oracle中文乱码的解决方法
select userenv('language') from dual; NLS_LANG AMERICAN_AMERICA.AL32UTF8
- R语言-地图
1.maps包的map()函数 >map('world', fill = TRUE,col=heat.colors(10)) #世界地图 >map("state", i ...