“我正在参加「掘金·启航计划」”
data
在非 new Vue 的组件(局部组件)中,data 必须为函数,函数返回值必须是一个对象,作为组件的最终 data (为避免共用同一个对象)
为什么局部组件data必须为函数,且返回值必须是一个对象?
因为组件的复用性,如果局部组件中用的是对象,则多个组件可能用的是同一个对象。为解决多个组件可能会共用data中的同一个对象问题,局部组件中,data是一个函数,返回值是一个对象。每次实例化一个局部组件时都会去调用一次data()方法,方法再返回一个对象,这样每个组件得到的数据结构是一样的,但是都是通过一个新的函数调用生成的,所以各个组件之间产生的对象就不会冲突。
而根组件只有一个,所以data不会冲突。
props
组件中内部私有数据存储中组件 data 中,通过外部传入的数据,则通过 props 选项接收。
注意:
自定义组件不能用自结束标签形式(如,)
如果传入的 props 值为一个表达式,则必须使用 v-bind。如果直接传入值则不需要;
组件中的 data 和 props 数据都可以通过组件实例进行直接访问
data 中的 key 与 props 中的 key 不能冲突
组件通信
注意:不要修改 props
传入的数据
父组件通过 props 传入数据到子组件内部,但是子组件内部不要修改外部传入的 props,vue 提供了一种事件机制通知父级更新,父级中使用子组件的时候监听对应的事件绑定对应的处理函数即可
props数据的在子组件中的两种用法:
在子组件中直接展示;
如果组件的数据是要变化的,则通过data存储。如果子组件需要改变props中传入的值,可以将props作为data的初始值。如props: ['quantity'], c_quantity: this.quantity
$emit()
vue
为每个组件对象提供了一个内置方法 $emit()
,它等同于自定义事件中的 new Event
,trigger
等
this.$emit('自定义事件名称', 事件数据)
- 事件数据就是中触发事件的同时携带传递的数据 -
event
- 父级在使用该组件的过程中,可以通过
@事件名称
来注册绑定事件函数 - 事件函数的第一个参数就是事件数据。如,incrementSum(v)的参数v。
组件双绑的实现
虽然并不推荐在组件内部修改 props ,但是,有的时候确实希望组件内部状态变化的时候改变 props ,我们可以通过子组件触发事件,父级监听事件来达到这个目的,不过过程会比较繁琐,vue 提供了一些操作来简化这个过程
插槽
相当于react中的this.props.children。
默认情况下,组件模板解析后会替换整个组件内容,如果我们想在组件引用被包含的内容,可以通过 vue
提供的内置组件 slot
来获取。