18910140161

关于props单向绑定,不太理解

顺晟科技

2021-06-19 08:08:33

213

我看官方文档中这么说,红标的地方,上面和下面我该相信哪段话呢?是否自相矛盾呢?


顺晟科技:

不冲突。单向数据流是 Vue 的逻辑概念,而对象引用是 JS 语言的物理概念。

vue对于props可否修改的限制,只能限制基础类型,无法限制引用类型。

在这个问题上,你要区分两个概念对象:属性和状态。当属性引用了一个状态(而不是字面量)时,属性是子组件的,状态是父组件的。比如 <my-friend :name="fullName">name 是子组件 MyFriend 的属性,fullName 则是父组件的状态。

这两段话是不冲突的, props 数据流是单向的, 从父组件流向子组件,而子组件是不能通过 props 更新父组件的。JavaScript 中的基本类型完全符合上述单向数据流。 但是, 对于 JavaScript 中的引用类型, 因为父子组件引用的是同一个数据,当子组件修改数据以后, 会自然影响到父组件中的数据。所以, 如果想要断开这种引用关系, 可以在子组件中做一层深度复制, 这样引用就会断开。

一般的属性都是单层的,然后你可以设置一个多层的属性试一试。

表述的不是很好,希望对你有所帮助

单向数据流的意思是,你不能且不应该在子组件中修改父组件的状态:

嗯,理解了。谢谢大佬

js 数据类型分为两大类,一个是基础类型,比如number、string、bool等;一个是引用类型,比如对象、数组等。

好的呢,谢谢你的热心答复~

当你这么做时 Vue 会发出警告。

因为,在 Vue 看来,name 这个属性的值并没有发生变化,依然是 someone 引用的那个对象。elseone 复制了那个对象的引用,并没有改变引用本身,所以 Vue 无法识别出你在修改父组件的状态。

但是,如果状态值是一个 JS 对象,Vue 不会警告你:

这种结构的 props,然后你尝试修改一下各个属性,再看看父组件里面的对象的变化。

vue的父子组件数据流向就是这样,父级向子级传递数据,子级通过事件改变父级;js,对象,vue监听不到内部变化。

这个和js的数据类型的处理方式有关系。

这个是传值和传地址的本质问题,vue也无奈。

基础类型是传值的,引用类型是传递地址的。

这么做实际上破坏了单向数据流的设计,只是由于 JS 的语言限制无法有效检测和阻止这个行为。第二个红框就是提醒你注意这个问题。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航