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

我的cars-list Vue组件元素,我将初始属性的props 传递到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分配给created()初始化钩子上的this.data.properties.它是有效的,是react 性的.

// 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,我现在知道答案了.

Method 1

将初始props 直接传递给数据.如更新文档中的示例:

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

但是要记住,如果传递的props 是在父组件状态中使用的对象或数组,对该props 的任何修改都将导致父组件状态的更改.

Warning:不建议使用这种方法.这将使您的组件不可预测.如果需要从子组件设置父数据,请使用Vuex之类的状态管理或使用"v-model".https://vuejs.org/v2/guide/components.html#Using-v-model-on-Components

Method 2

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

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

Method 3

您还可以使用spread操作符克隆props .更多细节见Igor答案:https://stackoverflow.com/a/51911118/3143704

但请记住,旧浏览器不支持spread运算符,为了更好地兼容,您需要传输代码,例如使用babel.

Footnotes

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

我测试小提琴的地方:

Vue.js相关问答推荐

Vuetify从同一方向旋转传送带下一个项目和上一个项目

vue : 多个样式的类绑定在一个

Vue Datepicker 不会在渲染时显示默认日期

处理多张卡片中的按钮

在Vue cli项目中,Laravel api app放在哪里以及如何在vue js中调用api?

如果 Vuetify 自动完成没有匹配的结果,则保留输入的文本

使用带有 v-date-picker 的 new Date() 不起作用

即使响应为 200,也会调用 Axios Catch

Vue.js 如何计算总数?

使用 VueJS 在 v-for 中转换

带有子菜单的 Vuetify 导航抽屉

Vue.js 处理多次点击事件

在 .vue 文件中使用 Vue.set() 和 Vue.use()

如何从 keep-alive 中销毁缓存的 Vue 组件?

构建 Vue.js 应用程序时 JavaScript 堆内存不足

emit更新数组不起作用

Vue路由在新页面上回到顶部

使用 Vue 的点击编辑文本字段

Vuetify 过渡:如何设置过渡速度

Vue Cli 3:定义的输出路径