问题描述: 将对象字面量作为道具的Vue.js子组件在其父组件呈现时意外更新。
回答: 在Vue.js中,当子组件接收到一个对象字面量作为道具时,在其父组件呈现时可能会发生意外更新。这是由于Vue.js的响应式系统的工作原理所导致的。
在Vue.js中,对象和数组是引用类型,当对象或数组发生变化时,其引用不会改变,但内部的属性或元素可能会发生变化。当一个对象字面量作为道具传递给子组件时,如果在父组件中修改了该对象字面量的属性,Vue.js会检测到该变化并触发重新渲染子组件。
解决这个问题的方法有两种:
以下是一个示例代码:
// 父组件
<template>
<div>
<ChildComponent :propsObj="getPropsObject"></ChildComponent>
</div>
</template>
<script>
export default {
data() {
return {
propsObject: {
key1: 'value1',
key2: 'value2'
}
};
},
computed: {
getPropsObject() {
return Object.assign({}, this.propsObject);
}
}
};
</script>
// 子组件
<template>
<div>
<p>{{ propsObj }}</p>
</div>
</template>
<script>
export default {
props: {
propsObj: {
type: Object,
required: true
}
}
};
</script>
在这个示例中,父组件通过计算属性getPropsObject
返回一个新的对象,而不是直接传递propsObject
对象字面量给子组件。这样可以避免在父组件中修改propsObject
属性时触发子组件的重新渲染。
领取专属 10元无门槛券
手把手带您无忧上云