1. 概述
(1)组件能够扩大HTML元素,外部封装了能够复用的HTML、CSS、JS代码片段。(2)因为组件是可复用的Vue实例,所以它们与new Vue接管雷同的选项,例如data、computed、watch、methods以及生命周期钩子等。仅有的例外是像el这样根实例特有的选项。(3)组件相似于vue实例,组件外部有template属性,用于指定模板。 vue实例外部有el属性,用于指定模板。
2. 组件的特点
(1) 组件能够进行任意次数的复用(2) 组件的data必须是一个函数,确保每个实例能够保护一份被返回对象的独立的拷贝,也就是任何一个组件的扭转不会影响到其余组件。
3. 组件定义
let component = { data() { return { //返回对象值的惟一拷贝,保障复用的组件外部数据不会相互影响 msg: "我是组件的数据" } }, template: ` <div> <p>我是组件</p> <h1>{{ msg }}</h1> </div> `}
4. 组件注册
(1) 全局注册的组件,能够在任意vue实例或者组件外部应用(2) 部分注册的组件,只能在以后注册的实例或者组件外部应用(3) 相似于js中的全局变量、局部变量1、全局注册 Vue.component('my-com', component); 如果一个组件被多个其余组件调用,用全局注册较好。2、部分注册 如果一个组件在一个实例或者组件外部被屡次调用,用部分注册较好。 new Vue({ el: "#app", data: {}, components: { "my-com": component } })
5. 组件交互(通信)
(1) 父组件向子组件传参 父组件应用prop属性,向子组件传参。 <div id="app"> <my-com :title="title" msg="hello"></my-com> </div> 动静传参 没有:传递的常量字符串 有:传递boolean, number, 对象, 数组, 变量 子组件接管参数 let component = { props: ["title", "msg"] } props校验 let component = { props: { title: { type: String, // 验证数据类型 required: true, //该参数必须传递的参数 //根本数据类型间接写在default前面 default: "你好", //以后参数的默认值 // 援用数据类型,应用工厂函数的模式返回一个对象或者数组 default(){ return {} } validator(val){ //自定义的验证器 return val.lenth > 3 ; } } } }(2) 子组件向父组件传参 <div id="app"> <my-com @son-handler="fatherHandler" msg="hello"></my-com> </div> let component = { data(){ return { comMsg: "我是子组件数据" } }, template:` <div> <button @click="clickHandler">发送事件</button> </div> `, methods: { clickHandler(){ clickHandler(){ this.$emit("son-handler", this.comMsg) } } } } new Vue({ el: '#app', data: { fatherDate: '' }, methods: { fatherHandler(val){ //val 就是子组件发送事件时,携带的参数this.comMsg this.fatherDate = val } }, components: { myCom: component } })(3) 单向数据流 父级的prop数据的更新,会向下流动到子组件中,反过来不行 父组件可能批改子组件中的数据,而子组件不能间接批改父组件中的数据 作用: 避免子组件意外变更状态,会影响父组件中的状态或者数据。
6. 插槽
(1) 一般插槽 <my-com> hello vue </my-com> let com = { template: ` <div> <slot></slot> //默认插槽 </div> ` }(2) 具名插槽 <my-com> <template v-slot:header> 我是头部内容 </template> <template v-slot:default> <p>你好组件插槽</p> </template> <template v-slot:footer> 我是脚步内容 </template> </my-com> let com = { template: ` <div> <header><slot name="header"></slot></header> //具名插槽 <main> <slot name="default"></slot > </main> // 匿名插槽 <footer> <slot name="footer"> </slot> //具名插槽</footer> </div> ` }(3) 作用域插槽 <my-com> <template v-slot:header="scope"> {{ scope.msg }} //scope是作用域对象,外部封装了子组件传递上来的msg数据,能够应用对象的解构 我是头部内容 </template> <template v-slot:default> <h3>你好组件插槽</h3> </template> <template v-slot:footer>我是脚步内容 </template> </my-com> let com = { data(){ return { msg: "我是组件数据" } }, template: ` <div> <header><slot name="header" :msg="msg"></header> </div> ` }
7. 动静组件
(1) 动态组件 <component is="my-com1"><component>(2) 动静组件 <component :is="current"></component>