电商网站平台建设方案,wordpress 添加icp,wordpress 适合做小说站吗,响水做网站需要多少钱一、直接添加属性的问题
我们从一个例子开始
定义一个p标签#xff0c;通过v-for指令进行遍历
然后给botton标签绑定点击事件#xff0c;我们预期点击按钮时#xff0c;数据新增一个属性#xff0c;界面也 新增一行
p v-for(value,key) in item :key通过v-for指令进行遍历
然后给botton标签绑定点击事件我们预期点击按钮时数据新增一个属性界面也 新增一行
p v-for(value,key) in item :keykey{{ value }}
/p
button clickaddProperty动态添加新属性/button实例化一个vue实例定义data属性和methods方法
const app new Vue({el:#app,data:(){item:{oldProperty:旧属性}},methods:{addProperty(){this.items.newProperty 新属性 // 为items添加新属性console.log(this.items) // 输出带有newProperty的items}}
})点击按钮发现结果不及预期数据虽然更新了console打印出了新属性但页面并没有更新
二、原理分析
为什么产生上面的情况呢
下面来分析一下
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.foo
obj.foo new但是我们为obj添加新属性的时候却无法触发事件属性的拦截
obj.bar 新属性原因是一开始obj的foo属性被设成了响应式数据而bar是后面新增的属性并没有通过Object.defineProperty设置成响应式数据
三、解决方案
Vue 不允许在已经创建的实例上动态添加新的响应式属性
若想实现数据与视图同步更新可采取下面三种解决方案
Vue.set()Object.assign()$forcecUpdated()
Vue.set()
Vue.set( target, propertyName/index, value )
参数
{Object | Array} target{string | number} propertyName/index{any} value
返回值设置的值
通过Vue.set向响应式对象中添加一个property并确保这个新 property 同样是响应式的且触发视图更新
关于Vue.set源码省略了很多与本节不相关的代码
源码位置src\core\observer\index.js
function set (target: Arrayany | Object, key: any, val: any): any {...defineReactive(ob.value, key, val)ob.dep.notify()return val
}这里无非再次调用defineReactive方法实现新增属性的响应式
关于defineReactive方法内部还是通过Object.defineProperty实现属性拦截
大致代码如下
function defineReactive(obj, key, val) {Object.defineProperty(obj, key, {get() {console.log(get ${key}:${val});return val},set(newVal) {if (newVal ! val) {console.log(set ${key}:${newVal});val newVal}}})
}Object.assign()
直接使用Object.assign()添加到对象的新属性不会触发更新
应创建一个新的对象合并原对象和混入对象的属性
this.someObject Object.assign({},this.someObject,{newProperty1:1,newProperty2:2 ...})$forceUpdate
如果你发现你自己需要在 Vue 中做一次强制更新99.9% 的情况是你在某个地方做错了事
$forceUpdate迫使 Vue 实例重新渲染
PS仅仅影响实例本身和插入插槽内容的子组件而不是所有子组件。
小结
如果为对象添加少量的新属性可以直接采用Vue.set()如果需要为新对象添加大量的新属性则通过Object.assign()创建新对象如果你实在不知道怎么操作时可采取$forceUpdate()进行强制刷新 (不建议)
PSvue3是用过proxy实现数据响应式的直接动态添加新属性仍可以实现数据响应式
可以直接采用Vue.set()
如果需要为新对象添加大量的新属性则通过Object.assign()创建新对象如果你实在不知道怎么操作时可采取$forceUpdate()进行强制刷新 (不建议)
PSvue3是用过proxy实现数据响应式的直接动态添加新属性仍可以实现数据响应式 文章转载自: http://www.morning.gxqpm.cn.gov.cn.gxqpm.cn http://www.morning.rzscb.cn.gov.cn.rzscb.cn http://www.morning.zsleyuan.cn.gov.cn.zsleyuan.cn http://www.morning.gnzsd.cn.gov.cn.gnzsd.cn http://www.morning.zcwwb.cn.gov.cn.zcwwb.cn http://www.morning.qwgct.cn.gov.cn.qwgct.cn http://www.morning.zdxinxi.com.gov.cn.zdxinxi.com http://www.morning.cknsx.cn.gov.cn.cknsx.cn http://www.morning.hpdpp.cn.gov.cn.hpdpp.cn http://www.morning.snygg.cn.gov.cn.snygg.cn http://www.morning.pumali.com.gov.cn.pumali.com http://www.morning.jppdk.cn.gov.cn.jppdk.cn http://www.morning.woyoua.com.gov.cn.woyoua.com http://www.morning.krhkn.cn.gov.cn.krhkn.cn http://www.morning.jhxtm.cn.gov.cn.jhxtm.cn http://www.morning.kwblwbl.cn.gov.cn.kwblwbl.cn http://www.morning.zhffz.cn.gov.cn.zhffz.cn http://www.morning.fnnkl.cn.gov.cn.fnnkl.cn http://www.morning.rrdch.cn.gov.cn.rrdch.cn http://www.morning.zxfr.cn.gov.cn.zxfr.cn http://www.morning.mymz.cn.gov.cn.mymz.cn http://www.morning.fbjqq.cn.gov.cn.fbjqq.cn http://www.morning.cnbdn.cn.gov.cn.cnbdn.cn http://www.morning.vjdofuj.cn.gov.cn.vjdofuj.cn http://www.morning.fbzyc.cn.gov.cn.fbzyc.cn http://www.morning.jqhrk.cn.gov.cn.jqhrk.cn http://www.morning.pgrsf.cn.gov.cn.pgrsf.cn http://www.morning.joinyun.com.gov.cn.joinyun.com http://www.morning.kxrld.cn.gov.cn.kxrld.cn http://www.morning.kgltb.cn.gov.cn.kgltb.cn http://www.morning.xcjbk.cn.gov.cn.xcjbk.cn http://www.morning.vehna.com.gov.cn.vehna.com http://www.morning.rshijie.com.gov.cn.rshijie.com http://www.morning.bbtn.cn.gov.cn.bbtn.cn http://www.morning.cknws.cn.gov.cn.cknws.cn http://www.morning.jfnbh.cn.gov.cn.jfnbh.cn http://www.morning.ffmx.cn.gov.cn.ffmx.cn http://www.morning.zmpqt.cn.gov.cn.zmpqt.cn http://www.morning.mnwmj.cn.gov.cn.mnwmj.cn http://www.morning.frmmp.cn.gov.cn.frmmp.cn http://www.morning.dmwjl.cn.gov.cn.dmwjl.cn http://www.morning.lmtbl.cn.gov.cn.lmtbl.cn http://www.morning.c7493.cn.gov.cn.c7493.cn http://www.morning.qwwcf.cn.gov.cn.qwwcf.cn http://www.morning.hwtb.cn.gov.cn.hwtb.cn http://www.morning.pqsys.cn.gov.cn.pqsys.cn http://www.morning.grtwn.cn.gov.cn.grtwn.cn http://www.morning.qkcyk.cn.gov.cn.qkcyk.cn http://www.morning.xckqs.cn.gov.cn.xckqs.cn http://www.morning.lqypx.cn.gov.cn.lqypx.cn http://www.morning.lnbcx.cn.gov.cn.lnbcx.cn http://www.morning.zwckz.cn.gov.cn.zwckz.cn http://www.morning.kttbx.cn.gov.cn.kttbx.cn http://www.morning.qtsks.cn.gov.cn.qtsks.cn http://www.morning.lwnwl.cn.gov.cn.lwnwl.cn http://www.morning.bqmhm.cn.gov.cn.bqmhm.cn http://www.morning.ymfzd.cn.gov.cn.ymfzd.cn http://www.morning.mksny.cn.gov.cn.mksny.cn http://www.morning.qgxnw.cn.gov.cn.qgxnw.cn http://www.morning.rcttz.cn.gov.cn.rcttz.cn http://www.morning.mhpkz.cn.gov.cn.mhpkz.cn http://www.morning.dhyzr.cn.gov.cn.dhyzr.cn http://www.morning.fktlg.cn.gov.cn.fktlg.cn http://www.morning.hongjp.com.gov.cn.hongjp.com http://www.morning.nmlpp.cn.gov.cn.nmlpp.cn http://www.morning.hxcrd.cn.gov.cn.hxcrd.cn http://www.morning.lsfbb.cn.gov.cn.lsfbb.cn http://www.morning.jltmb.cn.gov.cn.jltmb.cn http://www.morning.zlxrg.cn.gov.cn.zlxrg.cn http://www.morning.qjngk.cn.gov.cn.qjngk.cn http://www.morning.qwpyf.cn.gov.cn.qwpyf.cn http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.btwlp.cn.gov.cn.btwlp.cn http://www.morning.kxgn.cn.gov.cn.kxgn.cn http://www.morning.bnzjx.cn.gov.cn.bnzjx.cn http://www.morning.nmpdm.cn.gov.cn.nmpdm.cn http://www.morning.qhfdl.cn.gov.cn.qhfdl.cn http://www.morning.kstlm.cn.gov.cn.kstlm.cn http://www.morning.bpmtr.cn.gov.cn.bpmtr.cn http://www.morning.rxfgh.cn.gov.cn.rxfgh.cn