Vue使用Props绑定Object并且传参
问题:通过Props 给子组件传变量,变量是对象时,子组件无法在首次打开时获取到传入对象数据,并且在父组件中改变对象的属性,子组件也是无法监听。
设定子组件绑定并且减少
//绑定
props: {
// {"id":"随机数","type":"sel/upd","url":"","post":""}
pre_postjson:{ type:Object,default:()=>{
var o={};
o.id=0;
o.title='默认标题';
o.type='未设置';
o.url='';
o.post='';
this.post_json=o;
} },
},
//通过watch监视对象变化
watch:{
pre_postjson(val){
console.log('监听**********************');
if(String(val)!=''){
this.post_json={};
this.post_json=val;
/* 执行相关方法 */
}
}
},
父组件绑定设置
<per-exceldown :pre_postjson="postjson" />父组件默认执行方法
build_data:function(type){
console.log('type='+type);
var oo={};
oo.id=Math.random()+'';
oo.url='/Data_Back';
oo.type=type;
oo.post='';
this.postjson=oo;
console.log(this.postjson); //这里正常
},然后测试,结果发现,当页面第一次加载的时候,无法在子组件里收到父组件默认的构造对象。这就呵呵了,字符串是可以这样的。
官方资料这样说滴
受现代 JavaScript 的限制 (而且Object.observe 也已经被废弃 ),vue 无法检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化,所以属性必须在 data 对象上存在才能让 Vue 将它转换为响应式的。例如:
var vm = new Vue({
data:{
a:1
}
})
// `vm.a` 是响应式的
vm.b = 2
// `vm.b` 是非响应式的对于已经创建的实例,Vue 不允许动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性。例如,对于:
Vue.set(vm.someObject, 'b', 2)您还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名:
this.$set(this.someObject,'b',2)有时你可能需要为已有对象赋值多个新属性,比如使用 Object.assign() 或 _.extend()。但是,这样添加到对象上的新属性不会触发更新。在这种情况下,你应该用原对象与要混合进去的对象的属性一起创建一个新的对象。
// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })===================================================================================
既然如此,那就修改下声明方式
this.postjson1=Object.assign({},this.postjson1,{
title:'',
type:t,
url:'/Data_Back',
post:'123',
t_keyword:this.key_word,
t_searchword:this.t_searchword,
});这样修改后,经测试,在子组件中确实可以通过watch 来监听。但是,但是,还有个问题。那就是如果是第一次打开的默认加载
还是undefined啊。纠结了,最后用了 不是办法的办法,先把问题解决了再说。
mounted(){
this.$nextTick(function () {
// 其中postjson是父组件的绑定变量,虽然问题暂时解决了,但是这样的话 耦合度 就老高了
// console.log(this.$parent.postjson);
// this.post_json=this.$parent.postjson;
});
},数组的更新检测:vue提供了观察数组的变异方法,当以下方法调用时,视图会响应式更新
//push() pop()
//shift() unshift()
//splice() sort()
//reverse()
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!