真奇怪当我在顶层定义 bool(boolean) 属性showModal
时,vue.js只会忽略它。这是我在做什么:
//Component:
export default {
props:['rating', 'showModal'],
data: function data () {
return {
rating: this.rating,
showModal: this.showModal
};
}
};
调用 View :
const sharedRating = {
title: '',
remark: ''
};
let showModal = false;
new Vue({
el: '#rating-edit-container',
data: {
showModal: showModal,
rating: sharedRating
}
});
showModal = true;
然后将两个值都传递给组件:
<rating-edit
:rating="rating"
:show-modal="showModal"></rating-edit>
但是,当我更改
showModal
的值时,什么也没有发生。如果我在评级对象中传递
showModal
并使用该嵌套属性,则一切正常:const sharedRating = {
showModal: false,
title: '',
remark: ''
};
new Vue({
el: '#rating-edit-container',
data: {
rating: sharedRating
}
});
sharedRating.showModal = true;
难道“独立” bool(boolean) 属性也可以在Vue中使用,还是总是需要“包装”它们?
最佳答案
好吧,首先,我不确定您的组件中正在发生什么,因为您要使用相同的名称来命名属性和数据值。如果不进行测试,则不确定哪一个获胜,但看起来好像是data属性。您不应将同一属性命名为属性和数据值。该属性将始终对您可用。
在组件中定义数据函数时,同样重要的是要记住,只有在创建组件时才调用数据函数。设置地点
showModal: this.showModal
(暂时忽略我上面所说的这不是一个好主意)showModal data属性仅设置一次。除非您在组件内部对其进行更新,否则它将永远不会被更新。它不会收到对
showModal
属性的更改。如果您希望组件从外部获取
showModal
的更新,并且要在组件外部反射(reflect)对组件中showModal
的更改,则需要以不同的方式进行处理。Vue组件由props down, events up结构组成。
export default {
props:['rating', 'showModal'],
data: function data () {
return {
rating: this.rating,
};
},
computed:{
show:{
get(){ return this.showModal; }
set(v){ this.$emit('input', v) }
}
}
};
然后修改在模板中使用它的方式:
rating-edit
:rating="rating"
v-model="showModal"></rating-edit>
以这种方式编写组件时,组件外部对
showModal
的任何更新都将在组件内部反射(reflect)为show
,并且组件内部对show
的任何更改都将发送给父对象。然后,因为v-model
侦听input
事件,所以父级中的showModal
将使用新值进行更新。现在您可能会问到这一点,但是当
showModal
是对象的属性时,为什么它可以工作?当您将对象从顶层向下传递到组件中时,在Vue外部,根Vue和组件都在使用同一对象。任何这些地方对
showModal
属性的任何更改都将反射(reflect)在所有这些地方。但是,如果要通过创建一个新的showModal
对象来更新sharedRating
,您将看到与使用 bool(boolean) 值时类似的行为。 Vue中的属性是不可变的,这意味着您对原始javascript值(字符串,数字, bool(boolean) 值等)所做的任何更改都不会反射(reflect)在组件外部,实际上,如果您使用的是Vue,Vue会发出警告开发版本。但是,JavaScript中的对象和数组是通过引用传递的。该引用是不可变的,但是可以更改对象的属性和数组的内容。