最近一直在从头开始学习vue,顺手整理一下vue组件化的相关通讯方式,分析不到之处,还望各位指正。html
vue组件系统提供了⼀种抽象,让咱们可使⽤独⽴可复⽤的组件来构建⼤型应⽤,任意类型的应⽤界⾯均可以抽象为⼀个组件树。组件化能提⾼开发效率
,⽅便重复使⽤
,简化调试步骤
,提高项⽬可维护性
,便于多⼈协同开发
等。vue
父子组件通讯vuex
// 父组件
<template>
<div>
<span>{{ desc }}</span>
<child1 :msg="msg" @getEmit="getEmit"></child1>
</div>
</template>
<script>
import child1 from "@/components/child1";
export default {
components: { child1 },
data() {
return {
msg: "我是父组件的msg",
desc:"default"
};
},
methods: {
getEmit(data) {
this.desc = data;
}
}
};
</script>
复制代码
// 子组件 => child1
<template>
<div>
<span>我是父组件传来的{{ msg }}</span>
<button @click="getEmit"></button>
</div>
</template>
<script>
export default {
props: {
msg: String
},
data() {
return {
msg: "我是父组件的msg",
childMsg:"我是child1的msg"
};
},
methods: {
getEmit(data) {
this.$emit("getEmit",this.childMsg)
}
}
};
复制代码
兄弟组件通讯npm
准备条件能够分为两种方式
1. npm install vue-bus / main.js中引用
import Vue from 'vue';
import VueBus from 'vue-bus';
Vue.use(VueBus);
组件中直接使用this.$bug.on()和this.$bus.emit()来作相应的处理
2. 建立bus.js,该文件内写入
import Vue from "vue";
export default new Vue();
复制代码
// 子组件 => child2
// 这里采用了第二种建立bus.js的方法,而后在该组件内引用
<template>
<div>
<button @click="handleSendToChild3">{{ msg }}</button>
</div>
</template>
<script>
import Bus from "@/components/bus.js";
export default {
data() {
return {
msg: "点我向child3组件传参",
childMsg:"我是child1的msg"
};
},
methods: {
handleSendToChild3(data) {
Bus.$emit("getData",this.childMsg)
}
}
};
复制代码
// 子组件 => child3
// 这里采用了第二种建立bus.js的方法,而后在该组件内引用
<template>
<div>
<span>{{ msg }}</span>
</div>
</template>
<script>
import Bus from "@/components/bus.js";
export default {
data() {
return {
msg: "",
};
},
methods: {
handleSendToChild3(data) {
Bus.$on("getData",(data)=>{
this.msg = data
})
}
}
};
复制代码
父 => 子 => 孙组件通讯ide
其中子组件只作数据传递
多级组件嵌套须要传递数据时,若是仅仅是传递数据,而不作中间处理,可使用这种方法
$attrs:没有被子组件组册prop,$listener:子组件能够触发父组件的非.native事件
复制代码
// 父组件
<template>
<div>
<span>{{ desc }}</span>
<child1 :msg="msg" @getEmit="getEmit" v-on="$listener"></child1>
</div>
</template>
<script>
import child1 from "@/components/child1";
export default {
components: { child1 },
data() {
return {
msg: "我是父组件的msg",
desc:""
};
},
methods: {
getEmit(data) {
this.desc = data;
}
}
};
</script>
复制代码
// 子组件 => child1 => 相对于child2组件,该组件为兄弟组件
<template>
<div>
<child2 v-bind="$attrs"></child2>
</div>
</template>
<script>
import child2 from "@/components/child2
export default {
// inheritAttrs:false,不会把未被注册的 prop 呈现为普通的 HTML 属性 ,也就是:prop="data" prop不会做为html的新属性
inheritAttrs: false,
components: { child2 },
data() {
return {
msg: "我是父组件的msg",
childMsg:"我是child1的msg"
};
},
mounted(){
this.$emit("getEmit",this.childMsg);
}
};
复制代码
// 子组件 => child2 => 相对比child1组件,该组件为兄弟组件
<template>
<div>
<span>{{ msg }} {{ $attrs.msg }}</span>
</div>
</template>
<script>
export default {
data() {
return {
msg: "该组件拿到父组件经过child1组件传递过来的值 => ",
};
},
};
复制代码
父 => 子、父 => 孙组件通讯组件化
这种官方不推荐使用,可是,在咱们写UI组件库的时候就每每颇有用了,详见elementUI的部分源码(如form表单),这里我准备后续在此基础之上再进一步展开
复制代码
// 父组件
<template>
<div>
<span>{{ desc }}</span>
<child1 :msg="msg"></child1>
</div>
</template>
<script>
import child1 from "@/components/child1";
export default {
provide:{
desc:this.desc // 这里不接收动态传参,可是能够直接传this过去,从而实现动态响应式
}
components: { child1 },
data() {
return {
msg: "我是父组件的msg",
desc:"我是父组件的desc"
};
}
};
</script>
复制代码
// child1部分代码上面已经赘述过多,此处省略
复制代码
// 孙组件 => grandson1
<template>
<div>
<span>{{ desc }}</span>
</div>
</template>
<script>
export default {
inject:['desc'],
};
</script>
复制代码
父子组件通讯学习
// 父组件
<template>
<div>
<child1 ref="sendMsg"></child1>
</div>
</template>
<script>
import child1 from "@/components/child1";
export default {
components: { child1 },
data() {
return {
msg: "我是父组件的msg",
};
},
mounted() {
this.refs.sendMsg.handleSendToChild1(this.msg)
}
};
</script>
复制代码
// 子组件 => child1
<template>
<div>
<span>{{ msg }} </span>
</div>
</template>
<script>
export default {
data() {
return {
msg: "",
};
},
methods: {
handleSendToChild1(data) {
this.msg = data;
}
},
};
复制代码
vue的状态管理器,能够集中式储存各组件之间的状态this
// 该小节,我准备留在之后补充....
复制代码
这篇文章从开头到结尾,虽然篇幅很少,可是完成度是比较坎坷的,缘由是由于个人时间管理不够强,写着写着就又开始去学习其余的技术了(源码这种东西看多了,真的会上瘾),老是想着玉米西瓜一把抓,而忽略了一件事情从开始到闭环到重要性,但愿总结于此,之后应当引觉得戒。spa