Vue动态添加属性到data的实现
更新时间:2022年08月05日 11:21:07 作者:饭啊饭°
在vue中请求接口中,一个请求方法可能对应后台两个请求接口,所以请求参数就会有所不同。需要我们先设置共同的参数,然后根据条件动态添加参数属性
一、场景例子
<body> <div id="app"> <p v-for="(value,key) in item" :key="key"> {{value}} </p> <button @click="addProperty">动态添加新属性</button> </div> </body> </html> <script> new Vue({ el:'#app', data:{ item:{ oldProperty:"旧属性" } }, methods: { addProperty(){ this.item.newProperty = "新属性"; console.log(this.item); } }, }) </script>
效果:点击按钮后,输出的结果中有新添加的新属性,但是页面没有显示新属性。
二、原理分析
vue2使用Object.defineProperty实现数据响应式;
const obj = {} Object.defineProperty(obj, 'foo', { get() { console.log(`get foo:${val}`); return val }, set(newVal) { if (newVal !== val) { console.log(`set foo:${newVal}`); val = newVal } } }) }
- 当访问foo属性,或者设置foo值的时候都能触发setter与getter;
- 但是为obj添加新属性的时候,却无法触发事件属性的拦截
bj.bar = '新属性'
原因是一开始obj的foo属性被设成了响应式数据,而bar是后面新增的属性,并没有通过Object.defineProperty设置成响应式数据
三、解决方案
有三种解决方案:
- Vue.set()
- Object.assign()
- $forcecUpdated()
常用的就是Vue.set(),语法为:Vue.set( target, propertyName/index, value )
<script> new Vue({ el:'#app', data:{ item:{ oldProperty:"旧属性" } }, methods: { addProperty(){ Vue.set(this.item,"newProperty","新属性") console.log(this.item); } }, }) </script>
到此这篇关于Vue动态添加属性到data的实现的文章就介绍到这了,更多相关Vue动态添加属性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解vuex数据传输的两种方式及this.$store undefined的解决办法
这篇文章主要介绍了vuex数据传输的两种方式 及 this.$store undefined的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-08-08
最新评论