github源码地址:详情点击
前提
vue/cli4
使用默认配置常见的项目,详情 点击components
的文件夹下新建名为Parent.vue
和ChildOne
分别充当父组件和子组件。App.vue
和Parent.vue
中映射成组件标签基本结构如下
Parent.vue
<template>
<div>
<h1>Parenth1>
<child-one>child-one>
div>
template>
<script>
import ChildOne from '@/components/ChildOne'
export default {
data () {
return {
}
},
components:{
ChildOne
}
}
script>
ChildOne.vue
<template>
<div>
<h1>ChildOneh1>
div>
template>
<script>
export default {
};
script>
通过组件标签传递属性进行通讯
Parent.vue
<div>
<h1>Parenth1>
<child-one :msgToChild="msg">child-one>
div>
data () {
return {
msg:'i am you father'
}
},
ChildOne.vue
<div>
<h1>ChildOneh1>
<div>接收到父亲传来的消息:{{msgToChild}}div>
div>
export default {
props:['msgToChild']
};
通过组件标签进行方法的传递,子组件$emit
触发方法
父组件:Parent.vue
<child-one :msgToChild="msg" @methodToChild="showMsg">child-one>
methods:{
/*定义方法*/
showMsg () {
alert('i am your father')
}
},
子组件:ChildOne.vue
<div>接收到父亲传来的消息:{{msgToChild}}div>
<button @click="needFatherMethod">place click mebutton>
props:{
/*接收方法*/
methodToChild:{
type:Function
}
},
methods:{
/*触发方法*/
needFatherMethod () {
this.$emit('methodToChild')
}
}
通过$parent来获取父组件的实例,从而获取父组件的属性和方法
子组件:ChildOne.vue
<button @click="$parentMethod">place $parentbutton>
/*定义后去父组件实例的方法*/
$parentMethod (){
console.log(this.$parent._data.msg)//i am you father
console.log(this.$parent.msg)//i am you father
this.$parent.showMsg()//调用方法
}
通过触发父组件的方法进行传递数据
参数
就是子组件的数据,emit
的第二个参数就是父组件想要的数据Parent.vue
<div>接收到子组件传来的消息: {{childMsg}}div>
<child-one @getChildMsg="getChildMsg" :msgToChild="msg" @methodToChild="showMsg">child-one>
data () {
return {
childMsg:''
}
},
/*1.定义得到子组件数据的方法,触发条件只能在子组件
* 2.在data中定义一个属性来保存子组件传递过来的数据
* */
getChildMsg (childMsg){
this.childMsg = childMsg
},
子组件:ChildOne.vue
<button @click="setParentMsg">place send parent msgbutton>
data (){
return {
/*子组件数据*/
msg:'i am your child'
}
},
/*触发父组件的方法,并传递参数*/
setParentMsg (){
this.$emit('getChildMsg',this.msg)
},
$refs
主动获取子组件方法和属性通过ref得到子组件的实例,进而得到子组件的方法和属性
父组件:Parent.vue
<button @click="getMyChildMsgAndMethod">作为父亲,我要主动拿到孩子的信息button>
<div>这是孩子的信息: {{childMsg}}div>
<child-one ref="myChild" @getChildMsg="getChildMsg" :msgToChild="msg" @methodToChild="showMsg">child-one>
data () {
return {
childMsg:''
}
},
/*得到子组件的方法和属性*/
getMyChildMsgAndMethod (){
this.childMsg = this.$refs.myChild.msg
this.$refs.myChild.methodToParent()
},
子组件:ChildOne.vue
/*父亲调用的方法*/
methodToParent (){
alert('i am you child')
},
$children
主动获取子组件方法和属性通过this.$children
得到的是一个子组件实例的数组
$refs
相同Parent.vue
<button @click="$childrenMsg">$children得到孩子信息button>
<div>这是孩子的信息: {{childMsg}}div>
$childrenMsg (){
/*this.$children得到是一个数组*/
const child = this.$children[0]
this.childMsg = child.msg
child.methodToParent()
},
父组件只充当邮递员的角色
components
文件夹下,新建ChildTwo.vue
文件,代码如下子组件:ChildTwo.vue
<template>
<div>
<h1>ChildTwoh1>
<div>{{commonMsg}}div>
div>
template>
export default {
props:['common-msg'],
name: "ChildTwo",
}
子组件:ChildOne.vue
<button @click="setBrotherMsg">place send brother msgbutton>
data (){
return {
/*定义数据*/
commonMsg:'i love you ,my brother'
}
},
props:{
//接收父亲传来的方法,主要用于拿到此组件的数据
poster:{
type:Function
},
},
/*调用方法传递数据*/
setBrotherMsg (){
this.$emit('poster',this.commonMsg)
},
父组件:Parent.vue
<child-one @poster="poster" ref="myChild" @getChildMsg="getChildMsg" :msgToChild="msg" @methodToChild="showMsg">child-one>
<child-two :common-msg="commonMsg">child-two>
data () {
return {
//定义保存数据的变量
commonMsg:''
}
},
methods:{
/*定义拿到数据的方法*/
poster (commonMsg){
this.commonMsg = commonMsg
},
}
EventBus相当于全局的$emit,$on
src
下新建了一个utils
的文件夹,然后在这个文件夹中新建event-bus.js
的文件,文件的内容如下import Vue from 'vue'
/*EventBus就是一个vue的实例,我们可以通过他来调用Vue的实例方法*/
export const EventBus = new Vue()
/*当然,你也可以将它在入口文件上加入到原形中
* Vue.prototype.$EventBus = new Vue()
* 使用的时候直接就可以 this.$EventBus
* */
EventBus.$emit
和EventBus.$on
来进行全局触发绑定事件了兄弟组件:ChildOne.vue
<button @click="busBrotherMsg">send brother msg by busbutton>
methods: {
/*使用EventBus出发事件*/
busBrotherMsg (){
EventBus.$emit('busSendMsg',this.commonMsg)
},
}
兄弟组件:ChildTwo.vue
<div>EventBus传来的消息:{{busMsg}}div>
data(){
return {
busMsg:''
}
},
/*在生命周期函数中绑定事件*/
mounted() {
/*使用EventBus绑定事件*/
EventBus.$on('busSendMsg',(busMsg) => {
this.busMsg = busMsg
})
}
PubSub是一个包,专门用于组件之间的通讯
PubSub.subsribe()
订阅(注册)事件PubSub.publish()
触发事件React
中用的较多使用
npm install pubsub-js --save
ChildOne.vue
引入兄弟组件:ChildOne.vue
<button @click="pubsubBrotherMsg">send brother msg by pubsubbutton>
import PubSub from 'pubsub-js'
methods: {
pubsubBrotherMsg (){
PubSub.subscribe('pubsubMsg',this.commonMsg)
},
}
ChildTwo.vue
引入兄弟组件:ChildTwo.vue
<div>PubSub传来的消息:{{pubsubMsg}}div>
import PubSub from 'pubsub-js'
data(){
return {
pubsubMsg:''
}
},
mounted() {
/*msg:回调函数第一个参数,必须传*/
PubSub.subscribe('pubsubMsg',(msg,data) => {
this.pubsubMsg = data
} )
}
Vuex是一个集中式的状态管理
Vuex
有关的博客。