vue.js prop array / object vs literal

时间:2018-01-28 11:46:21

标签: binding vue.js

顺便提一下,vue.js中的道具是一种绑定方式:

https://vuejs.org/v2/guide/components.html#One-Way-Data-Flow

“请注意,JavaScript中的对象和数组是通过引用传递的,因此如果prop是一个数组或对象,那么在子进程内改变对象或数组本身会影响父状态。”

所以我想知道,prop.sync只适用于“litteral”(即;字符串,数字,日期),或者我必须将它与对象/数组一起使用?

我已经使用了没有同步的对象,所有工作都很顺利,但是我担心这不是做“vue.js”方式的好方法吗?

所以我的问题是:我可以在道具中使用对象/数组,没有同步,没有问题吗?

2 个答案:

答案 0 :(得分:2)

在某些情况下,我们可能需要对道具进行“双向绑定”。不幸的是,真正的双向绑定可能会造成维护问题,因为子组件可以使父项发生变异,而在父项和子项中均不明显该变异的来源。 因此,我们建议以update:myPropName模式发出事件。例如,在带有标题属性的假设组件中,我们可以传达以下意图分配新值:

this.$emit('update:title', newTitle)

如果直接在子组件中对prop进行突变,则会出现错误。因此从这个意义上讲,不安全。原因是父级将覆盖子级设置的所有内容。

答案 1 :(得分:0)

是的,您可以使用对象和数组作为道具值。但是,一个区别是当为类型为object或array的props提供默认值时,必须定义一个工厂函数来返回默认值。

主要区别在于sync修饰符是语法糖,它扩展为v-on侦听器。子组件在值更改时向父组件发出事件,允许父组件相应地更新。

子组件必须显式发出事件。

// example from docs
this.$emit('update:foo', newValue)