vue组件化
Vue组件化
组件化的诞生
由于之前的传统页面编写方式存在的问题:
- 依赖关系混乱不好维护
- 代码复用性低
所以Vue提供了组件化的方式: 每个组件有自己相应的css、html、js等代码,体现了组件的封装,解决了传统方式存在的问题
组件化的基本使用
具体步骤:
- 使用组件构造器创建组件
- 注册组件
- 使用组件
1 | <div id="app"> |
语法糖写法:
Vue.component('mycpn',{template:
我是标题
})
组件的嵌套
1 | <body> |
模板的抽离
1 | <!-- 抽离模板 --> |
父子组件的通信
父组件向子组件通信
通过props向子组件传递数据
1 | //子组件利用props属性接收 |
子组件向父组件通信
通过自定义事件向父组件发送数据
子组件:
1 | <template> |
父组件:
1 | <template> |
父子组件之间的访问
父组件访问子组件
使用$children或$refs
this.$children
获得子组件数组this.refs
获取标有ref属性的子组件数组,若是原生DOM则获取的是原生DOM元素
子组件访问父组件
使用$parent
this.$parent
获得父组件(不常用)
访问根组件
使用$root
this.$root
获得根组件
组件之间的访问
全局事件总线
可以任意组件间进行通信
总线特点:
1. 对于所有组件都可见
2. 可以调用$on、$off、$emit
Vue的原型对象刚好符合(最好放在这里)
在main.js中布局全局事件总线
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//关闭Vue的生产提示
Vue.config.productionTip = false
// const demo = Vue.extend({})
// Vue.prototype.x = new demo()
//创建vm
const vm = new Vue({
el:'#app',
render: h => h(App),
beforeCreate(){
Vue.prototype.$bus = this //布局全局事件总线
}
})进行组件间通信
组件1(接收方,给总线绑定事件)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32<template>
<div class="stu">
<h2>学生名:{{name}}</h2>
<h2>性别:{{sex}}</h2>
</div>
</template>
<script>
export default {
name:'Student',
data(){
return{
name:'张三',
sex:'男'
}
},
mounted(){
this.$bus.$on('hello',((data)=>{
console.log('我是Student组件,收到了数据',data)
}))
},
beforeDestroy(){
this.$bus.$off('hello')
}
}
</script>
<style>
.stu{
background-color: aquamarine;
}
</style>组件2发送数据方(调用接收方给总线绑定的事件)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31<template>
<div class="school">
<h2>学校名称:{{schoolName}}</h2>
<h2>学校地址:{{address}}</h2>
<button @click="sendSchoolName">把学校名给student组件</button>
</div>
</template>
<script>
export default {
name:'School',
data(){
return{
schoolName:'家里蹲',
address:'屋头'
}
},
methods:{
sendSchoolName(){
this.$bus.$emit('hello', this.schoolName)
}
}
}
</script>
<style>
.school{
background-color: aquamarine;
}
</style>消息订阅与发布
同样用于任意组件间通信
基于pubsub-js
安装pubsub-js : npm i pubsub-js
引入js :import pubsub from ‘pubsub-js’
接收数据方需要订阅消息:
1
2
3
4
5
6
7
8mounted(){
this.pubId = pubsub.subscribe('hello',(msgName,data)=>{
console.log('有人发布了'+msgName+'消息',+data)
})
},
beforeCreate(){
pubsub.unsubscribe(this.pubId)
}发送数据方需要发布消息:
1
2
3
4
5methods:{
sendSchoolName(){
pubsub.publish('hello',666)
}
}nextTick
语法:
this.$nextTick('xxx',数据)
作用:在下一次DOM更新结束后执行其指定的回调
slot插槽
插槽的作用:
- 组件的插槽也是为了让我们封装的组件更加具有扩展性。
- 让使用者可以决定组件内部的一些内容到底展示什么。
1.默认插槽
子组件:
1 | <template> |
父组件:
1 | <template> |
2.具名插槽
子组件中的插槽加个name,以便引用
1 | <slot name="center">我是一些默认值,当使用者没有传递具体结构时,我会出现1</slot> |
父组件中的组件用slot属性指明插入哪个插槽(同样可以用v-slot:center)
1 | <Category title="美食" > |
3.作用域插槽
子组件可以通过slot向插槽使用者传输数据
1 | <template> |
父组件 必须用template标签包裹,不然接收不到数据
1 | <template> |
mixin混入
混合js文件
1 | export const mixin = { |
局部混合
1
2
3
4
5
6
7
8
9
10
11
12//引入混合(局部混合)
import {mixin} from '../mixin'
export default {
name:'Student',
data(){
return{
name:'张三',
sex:'男'
}
},
mixins:[mixin]
}全局混入
1
2
3//全局混合
import {mixin} from './mixin'
Vue.mixin(mixin)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 goMars的学习随记!
评论