gpt4 book ai didi

javascript - 在 Vue.js 2 中将 Prop 作为初始数据传递的正确方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 02:53:24 26 4
gpt4 key购买 nike

所以我想将 props 传递给 Vue 组件,但我希望这些 props 将来会从该组件内部发生变化,例如当我使用 AJAX 从内部更新该 Vue 组件时。因此它们仅用于组件的初始化。

我的 cars-list Vue 组件元素,我在其中将具有初始属性的 Prop 传递给 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.propertiescreated() 初始化 Hook 上。它有效并且是响应式(Reactive)的。

// 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>

但我的问题是我不知道这样做是否正确?不会给我路上添麻烦吧?或者有更好的方法吗?

最佳答案

多亏了这个https://github.com/vuejs/vuejs.org/pull/567我现在知道答案了。

方法一

将初始属性直接传递给数据。就像更新文档中的示例一样:

props: ['initialCounter'],
data: function () {
return {
counter: this.initialCounter
}
}

但请记住,如果传递的 prop 是在父组件状态中使用的对象或数组,对该 prop 的任何修改都会导致该父组件状态发生变化。

警告:不推荐使用此方法。它将使您的组件不可预测。如果您需要从子组件设置父数据,请使用 Vuex 之类的状态管理或使用“v-model”。 https://v2.vuejs.org/v2/guide/components.html#Using-v-model-on-Components

方法二

如果您的初始 Prop 是一个对象或数组,并且您不希望子状态的更改传播到父状态,那么只需使用例如Vue.util.extend [1] 制作 Prop 的副本,而不是直接将其指向子数据,如下所示:

props: ['initialCounter'],
data: function () {
return {
counter: Vue.util.extend({}, this.initialCounter)
}
}

方法三

您还可以使用扩展运算符来克隆 Prop 。 Igor 答案中的更多详细信息:https://stackoverflow.com/a/51911118/3143704

但请记住,旧浏览器不支持扩展运算符,为了更好的兼容性,您需要转换代码,例如使用 babel

脚注

[1] 请记住,这是一个内部 Vue 实用程序,它可能会随着新版本而改变。您可能想使用其他方法复制该 Prop ,请参阅 How do I correctly clone a JavaScript object? .

我测试它的 fiddle : https://jsfiddle.net/sm4kx7p9/3/

关于javascript - 在 Vue.js 2 中将 Prop 作为初始数据传递的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40408096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com