vue中利用prop进行父子通信时的注意事项总结
注意点一
当在组件上传入一个普通的字符串时,我们可以直接这样写:
<one name="张三"></one>
需要注意的是,当我们想要传入数字时,我们需要使用v-bind绑定一个数字,否则无法识别数字,vue会认为你传入的是一个字符串数字。
特殊的值包括:向字符键传这些类型的数据时,都需要使用v-bind来告诉vue,我们传输的是静态的值。
- 数字
- 布尔值
- 数组
- 对象
<one name="张三" :age="1"></one>
注意点二
当我们想要把一个对象的所有属性传给子组件时,我们可以这样写:
//要传输的对象 post: { id: 1, title: 'My Journey with Vue' } //直接使用v-bind,将post对象的所有属性传递给子组件 <one v-bind='post'> </one>
子组件接收:
//直接接受父组件传过来的对象中的属性名即可 props: ["id", "title"],
注意点三:单项数据流
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。
额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。
这里有两种常见的试图变更一个 prop 的情形:
这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。 在这种情况下,最好定义一个本地的 data property 并将这个 prop 用作其初始值:
props: ['initialCounter'], data: function () { return { counter: this.initialCounter } }
这个 prop 以一种原始的值传入且需要进行转换。 在这种情况下,最好使用这个 prop 的值来定义一个计算属性:
props: ['size'], computed: { normalizedSize: function () { return this.size.trim().toLowerCase() } }
注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变变更这个对象或数组本身将会影响到父组件的状态。
注意点四
在使用组件时,如果我们在上面书写非props属性,那个这些属性会作为组件根元素上的自定义属性。 如果组件根元素上有同样属性,那个会被覆盖掉。使用组件时传入的值会作为最终的属性值。
class 和 style attribute 会稍微智能一些,即两边的值会被合并起来,从而得到最终的值。
如果我们不想让要这种默认将非props属性添加到组件的根元素上,我们可以在组件的选项中配置inheritAttrs: false
。设置完以后非props属性将不在默认添加到根元素上。
其次,我们还可以结合$attrs,就可以手动决定这些非Props属性会被赋予哪个元素。
例如:可以将所有的属性赋值到标签中。
<template> <div class="one"> <span v-bind="$attrs"></span> </div> </template>