vue组件
- 组件是自定义的HTML元素
- 组件扩展了HTML元素,封装了可重用的HTML代码
组件的使用
- 创建组件构造器
- Vue.extend(config:object)
- config参数
template:"<div>组件模板</div>"
- 创建组件构造器,而不上一个具体的组件实例,template表示要渲染成的结构
- 注册组件
- Vue.component()
- Vue.component("my-component",组件构造器)
- 这里才是创建一个组件的实例
- 组件的注册是全局的
- 局部注册用选项对象的components属性
- vue提供了语法糖,可以直接创建和注册Vue组件---
Vue.component('my-component',{template:"<div>渲染后的html结构</div>"})
- 当然使用局部注册方法同样可以
components:{'my-component':{template:"<div>...</div>"}}
- 使用组件
<my-component></my-component>
- 在html中要求标签正确的闭合,在.vue中可以单标签
- 组件就是对自定义的标签,先创建组件构造器,也是对Vue对象的扩展,构造器参数中的template就是组件渲染后的html结构,利用Vue.components进行注册,注册后才可以使用,然后new Vue(...)创建Vue实例,在Vue实例下可以使用注册的组件
- 父子组件
- 一个组件也就是一个Vue实例,多数Vue选项都可以在Vue.extend()中使用
- 子组件注册在父组件中,子组件在父组件的template中使用
- 分离template选项,不再把字符串写在js代码中
- 方法 1 使用script标签,修改type属性为"text/x-template",添加id,使用时template:"#模板id"
- 方法 2 使用
<template id="tpl">
组件
- 父组件向子组件传值 使用props选项 这里是在子组件中使用props
components:{
"my-component":{
template:"<div>{{myname}}</div>",
//在这里使用props选项可以把父组件的值传递到子组件中,
//当然模板中也可以是data中的值,但data中的不能和父组件通信
props:['myname']
}
}
- 组件作用域
- template属性使用
<template></template>
标签,h5的新标签,IE不支持
- 组件是有作用域的,组件的模板也是在作用域中编译的,这个作用域就是tempalte标签内的区域
- 父组件的数据只能在父组件的模板(作用域)内使用,子组件的数据只能在子组件的模板(作用域)内使用,如果父组件的数据要在子组件中使用,应该用props传递数据
- slot
- 自定义事件系统
- 独立于原生的dom事件
- 分为
$on()
监听事件
$emit()
触发事件
$dispatch()
派发事件,向上冒泡
$broadcast
向下广播事件
- 2.x取消了events选项,需要我们在created钩子中使用
$on()
来监听事件。
问题
- 在vue2.4中props的数据流是单项的,也就是说当父组件的属性发生变化时,将传到给子组件,反过来则不会,当你在子组件中操作props中的值时,vue会给予警告。但遇到的问题是,在子组件中操作props传过来的一个数组,不给警告,且操作成功。子组件修改了父组件的数据。
- 在官方文档中有说明,js中的数组和对象是引用类型的,指向是同一个内存空间的,当你修改子组件会影响父组件。