大家好,我是前端岚枫,一枚二线城市的程序媛,上篇主要跟分享了《VUE系列-Vue核心应用(二)》,今天主要跟大家分享我整理的vue的组件相关的,主要包括组件声明、组件种类、组件间的几种数据通信方式及一些常用的面试题,vue面试题相关的答案我后期会专门整理分享。
Vue中的组件是开发中非常重要的一部分,组件化的好处:方便维护、方便复用 、 减少不必要的渲染
一.组件的声明
1.1 全局组件
Vue.component('my-button',{
template:''
})
let vm = new Vue({
el:'#app'
})
1.2 局部组件
let vm = new Vue({
el:'#app',
components:{
'MyButton':{
template:''
}
}
});
HTML不支持自闭合的自定义元素,在DOM模板里永远不要使用自闭合组件,在HTML中也不支持MyButton的写法,所以组件调用全部使用短横线连接的方式!
二.组件的数据
在组件中的数据必须是函数的形式,目的为了保证每个组件间的数据数据相互独立
'MyButton':{
data(){
return {content:'按钮'}
},
template:''
}
三.组件的属性应用及校验
- 属性应用
components:{
'MyButton':{
props:['buttonContent'],
template:''
}
}
属性在组件标签上需要使用短横线命名法,在组件中声明需要采用驼峰命名法
- 属性校验
components:{
'MyButton':{
props:{
buttonContent:String,
arr:{
type:Array,
default:()=>([])
},
number:{
type:Number,
validator:(value)=>{
return typeof value == 'number'
}
},
},
template:''
}
}
四.Vue组件间的通信
快速原型开发: 可以快速识别.vue文件封装组件插件等功能,也是基于Vue-Cli
sudo npm install @vue/cli -g
sudo npm install -g @vue/cli-service-global
vue serve App.vue
4.1 Props传递数据
components
├── Grandson1.vue // 孙子1
├── Grandson2.vue // 孙子2
├── Parent.vue // 父亲
├── Son1.vue // 儿子1
└── Son2.vue // 儿子2
在父组件中使用儿子组件
父组件:{{mny}}
子组件接受父组件的属性
子组件1: {{mny}}
Document
{a:1,b:2,c:3}
4.2 $emit使用
子组件触发父组件方法,通过回调的方式将修改的内容传递给父组件
父组件:{{mny}}
子组件触发绑定自己身上的方法
子组件1: {{mny}}
这里的主要目的就是同步父子组件的数据,->语法糖的写法
.sync
v-model
子组件1: {{value}} // 触发的事件只能是input
4.3 parent 、children
继续将属性传递
孙子:{{value}}
如果层级很深那么就会出现parent.parent.....我们可以封装一个$dispatch方法向上进行派发
$dispatch
Vue.prototype.$dispatch = function $dispatch(eventName, data) {
let parent = this.$parent;
while (parent) {
parent.$emit(eventName, data);
parent = parent.$parent;
}
};
既然能向上派发那同样可以向下进行派发
$broadcast
Vue.prototype.$broadcast = function $broadcast(eventName, data) {
const broadcast = function () {
this.$children.forEach((child) => {
child.$emit(eventName, data);
if (child.$children) {
$broadcast.call(child, eventName, data);
}
});
};
broadcast.call(this, eventName, data);
};
4.4 listeners
$attrs
批量向下传入属性
儿子2: {{$attrs.name}}
孙子:{{$attrs}}
$listeners
批量向下传入方法
{this.mny = 500}">
4.5 Provide & Inject
Provide
在父级中注入数据
provide() {
return { parentMsg: "父亲" };
},
Inject
在任意子组件中可以注入父级数据
inject: ["parentMsg"] // 会将数据挂载在当前实例上
provide inject 和 context (可以在父组件中声明一个公共数据),在子组件中可以注入原理 (比较混乱,名称问题 他不会在业务代码中使用) 组件库 多级通信为了方便你可以使用provide
4.6 Ref使用
获取组件实例
ref 获取真实dom元素,如果放到组件上 代表的是 当前组件的实例 ,父组件中可以直接获取子组件的方法或者数据
mounted() { // 获取组件定义的属性
console.log(this.$refs.grand2.name);
}
4.7 EventBus
用于跨组件通知(不复杂的项目可以使用这种方式)
Vue.prototype.$bus = new Vue();
eventbus (children) 绑定on的那个组件来触发 (混乱)
Son2组件和Grandson1相互通信
mounted() {
this.$bus.$on("my", data => {
console.log(data);
});
},
mounted() {
this.$nextTick(() => {
this.$bus.$emit("my", "我是Grandson1");
});
},
五.面试题环节
- 组件间通信方式