Vue- 组件详解
组件与复用
Vue 组件需要注册后才可以使用,注册有全局注册和局部注册两种方式
要在父实例中使用这个组件,必须要在实例创建前注册,之后就可以用<my-component></my-component>
的形式来使用组件
template
的 DOM 结构必须被一个元素包含,缺少<div></div>
会无法渲染并报错
在 Vue 实例中,使用components
选项可以局部注册组件,注册后的组件只在该实例作用域下有效
组件中也可以使用components
选项来注册组件,使组件可以嵌套
Vue 组件的模板在某些情况下会受到 HTML 的限制,比如<table>
内规定只允许是<tr>
、<td>
、<th>
等这些表格元素,所以在<table>
内直接使用组件时无效的。这种情况下,可以使用特殊的is
属性来挂载组件
常见的限制元素还有<ul>
、<ol>
、<select>
除了template
选项外,组件中还可以像 Vue 实例那样使用其他的选项,比如data
、computed
、methods
等
但是在使用data
时,data
必须是函数,然后将数据return
出去
JavaScript 对象是引用关系,如果return
的对象引用了外部的一个对象,那这个对象就是共享的,任何一方修改都会同步
使用Props
传递数据
组件不仅要把模板的内容进行复用,更重要的是组件间进行通信。
通常父组件的模板中包含子组件,父组件要正向地向子组件传递数据或参数,子组件接收后根据参数的不同渲染不同的内容或者执行操作。这个正向传递数据的过程通过props
来实现。
在组件中,使用选项props
声明需要从父级接收的数据,props
的值可以是两种,一种是字符串数组,一种是对象
props
中声明的数据与组件data
函数中return
的数据主要区别就是props
的数据来自父级,而data
中的是组件自己的数据,作用域是组件本身,这两种数据都可以在模板template
及计算属性computed
和方法methods
中使用。
由于 HTML 特性不区分大小写,当使用 DOM 模板时,驼峰命名的props
名称要转为短横线分割命名
有时候,传递的数据并不是直接写死,而是来自父级的动态数据,这时可以使用指令v-bind
动态绑定props
的值,当父组件的数据变化时,也会传递子组件
v-model
绑定了父级的数据parentMessage
,当通过输入框任意输入时,子组件接收到的props["message"]
也会实时响应,并更新组件模板
数组验证
当prop
需要验证时,需要对象写法,一般当组件需要提供给别人使用时,推荐都进行数据验证。比如某个数据必须是数字类型,如果传入字符串,就会在控制台弹出警告
验证的type
类型可以是:String
,Number
,Boolean
,Object
,Array
,Function
自定义事件
当子组件需要向父组件传递数据时,就要用到自定义事件,v-on
除了监听 DOM 事件外,还可以用于组件之间的自定义事件
Vue 组件的子组件用$emit()
来触发事件,父组件用$on()
来监听子组件的事件
父组件也可以直接在子组件的自定义标签上使用v-on
来监听子组件触发的自定义事件
Slot 插槽
在子组件内使用特殊的<slot>
元素就可以为这个组件开启一个slot
(插槽),在父组件模板里,插入在子组件标签内的所有内容将替代子组件的<slot>
标签及它的内容,子组件的模板内定义了一个<slot>
元素,并且用一个<p>
作为默认的内容,在父组件没有使用slot
时,会渲染这段默认的文本;如果写入了slot
,就会替换整个<slot>
给<slot>
元素指定一个name
后可以分发多个内容,具名slot
可以与单个slot
共存,如果没有指定默认的匿名slot
,父组件内多余的内容都将被抛弃
版权声明: 本文为 InfoQ 作者【格斗家不爱在外太空沉思】的原创文章。
原文链接:【http://xie.infoq.cn/article/319457be4ad717649f65624cf】。文章转载请联系作者。
评论