组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码,内部封装了可复用的HTML、CSS、JS代码片段。在较高层面上,组件是自定义元素,Vue的编译器为它添加特殊功能。在有些情况下,组件也可以表现为用is特性进行了扩展的原生 HTML 元素。组件注册的时候需要为该组件指定各种参数。组件类似于vue实例,组件内部有template属性,用于指定模板,vue实例内部有el属性,用于指定模板。
组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。
let component = {
data() {
return {
// 返回对象值的唯一拷贝,保证复用的组件内部数据不会相互影响
msg: '我是组件的数据'
}
},
template: `
我是组件
{{msg}}
`
}
注意:一个组件的 data 选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝
Vue.component('my-com', component);
如果一个组件被多个其他组件调用,用全局注册较好。
new Vue({
el: '#app',
data: {},
components: {
'my-com': component
}
})
如果一个组件在一个实例或者组件内部被多次调用,用局部注册较好。
介绍:在 Vue 中,父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息。
父组件使用prop属性,向子组件传参
"
动态传参:prop 可以通过v-bind动态赋值。传递什么类型的变量就可以将该类型变量直接进行赋值,也可以赋常量。如果不使用v-bind就只能传递字符串。
1. 传入一个数字
2. 传入一个布尔值
3. 传入数组
4. 传入一个对象
子组件接受参数例子:
let component = {
props: ['title','msg'],
}
props校验:
let component = {
props: {
// 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
title: {
type: String, // 验证数据类型
required: true, // 该参数必需传递的参数
// 基本数据类型直接写在default后面
default: '你好', // 当前参数的默认值
// 引用数据类型,使用工厂函数的形式返回一个对象或者数组
default() {
return { message: 'hello'}
}
// 自定义验证函数
validator(val) { // 自定义的验证器
return ['success', 'warning', 'danger'].indexOf(value) !== -1 }
}
}
},
}
"
let component = {
data() {
return {
comMsg: '我是子组件数据'
}
},
template:`
`,
methods: {
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
}
})
父级的prop数据的更新,会向下流动到子组件中,但是反过来不行。
父组件能够修改子组件中的数据,而子组件不能直接修改父组件中的数据
作用:防止子组件意外变更状态,会影响父组件中的状态或者数据。
事件名大小写严格区分。
hello vue
let com = {
template: `
// 默认插槽
`
}
子组件
父组件
Your Profile
注意:当组件渲染的时候,
简写 #header
我是头部内容
hello component
你好组件插槽
我是脚部内容
let com = {
template: `
// 具名插槽
// 匿名插槽
`
}
{{scope.msg}} // scope是作用域对象,内部封装了子组件传递上来的msg数据,可以使用对象的解构,为了让父组件可以访问
我是头部内容
hello component
你好组件插槽
我是脚部内容
let com = {
data() {
return {
msg: '我是组件数据'
}
}
template: `
// 具名插槽
// 匿名插槽
`
}
缩写:与v-bind、v-on类似,v-slot也具有缩写形式,即把参数之前的所有内容 (v-slot:) 替换为字符 #。例如: v-slot:header 可以被重写为 #header
// 静态组件
// 动态组件
注意:默认情况下,当组件在切换的时候都会重新创建组件,但是有些时候我们希望组件实例能够被在它们第一次被创建的时候缓存下来。为了解决这个问题,我们可以用一个