所以我想将道具传递给 Vue 组件,但我希望这些道具将来会从该组件内部更改,例如当我使用 AJAX 从内部更新该 Vue 组件时。所以它们仅用于组件的初始化。
我的 cars-list
Vue 组件元素,我将具有初始属性的道具传递给 single-car
:
// cars-list.vue
<script>
export default {
data: function() {
return {
cars: [
{
color: 'red',
maxSpeed: 200,
},
{
color: 'blue',
maxSpeed: 195,
},
]
}
},
}
</script>
<template>
<div>
<template v-for="car in cars">
<single-car :initial-properties="car"></single-car>
</template>
</div>
</template>
我现在这样做的方式是在我的 single-car
组件中,我将 this.initialProperties
分配给我的 this.data.properties
在 created()
初始化上。它有效并且是反应性的。
// single-car.vue
<script>
export default {
data: function() {
return {
properties: {},
}
},
created: function(){
this.data.properties = this.initialProperties;
},
}
</script>
<template>
<div>Car is in {{properties.color}} and has a max speed of {{properties.maxSpeed}}</div>
</template>
但我的问题是我不知道这是否是正确的方法?这不会给我带来一些麻烦吗?或者有更好的方法吗?
原文由 Dominik Serafin 发布,翻译遵循 CC BY-SA 4.0 许可协议
感谢这个 https://github.com/vuejs/vuejs.org/pull/567 我现在知道答案了。
方法一
将初始道具直接传递给数据。就像更新文档中的示例一样:
但是请记住,如果传递的 prop 是在父组件状态中使用的对象或数组,则对该 prop 的任何修改都将导致该父组件状态的更改。
警告:不推荐使用此方法。它会让你的组件变得不可预测。如果您需要从子组件设置父数据,请使用 Vuex 之类的状态管理或使用“v-model”。 https://v2.vuejs.org/v2/guide/components.html#Using-v-model-on-Components
方法二
如果您的初始道具是一个对象或数组,并且您不希望子状态的更改传播到父状态,那么只需使用例如
Vue.util.extend
[1] 来制作道具的副本,而不是将其直接指向儿童数据,如下所示:方法三
您还可以使用扩展运算符来克隆道具。 Igor 答案中的更多详细信息: https ://stackoverflow.com/a/51911118/3143704
但请记住,旧版浏览器不支持传播运算符,为了更好的兼容性,您需要转换代码,例如使用
babel
。脚注
[1] 请记住,这是一个内部 Vue 实用程序,它可能会随着新版本而改变。您可能想使用其他方法来复制该道具,请参阅 如何正确克隆 JavaScript 对象? .
我在哪里测试它的小提琴: https ://jsfiddle.net/sm4kx7p9/3/