【vue2面试题】vue2组件通信方式

92 阅读1分钟

vue2组件通信方式

  • 父子组件通信(props)

  • 子父组件通信($emit)

  • 兄弟组件通信(Event Bus)

  • vuex

  • provide/inject

父子组件通信

## Parent组件  ## Child组件
<div>
	<Child :strData="strData"></Child>
</div>
<script>
	export default {
        data() {
            return {
                strData: '我是父组件Parent中的数据'
            }
        }
    }
</script>


## Child
<div>
    <p>{{ strData }}</p>
</div>
<script>
	export default {
        props: {
            strData: {
                type: String,
                default: ''
            }
        }
    }
</script>

子父组件通信

## Parent  ## Child
<div>
    <Child @getChildData="updateChild"></Child>
</div>
<script>
	export default {
        methods: {
            updateChild(val) {
                console.log(val) // 子组件的数据
            }
        }
    }
</script>

## Child

<div>
    <button @click="btnFn">点击将数据广播到父组件</button>
</div>
<script>
	export default {
        data() {
            return {
                childData: '我是子组件中的数据'
            }
        },
        methods: {
            btnFn() {
                this.$emit('getChildData', this.childData)
            }
        }
    }
</script>

兄弟组件间通信

## Child1  ## Child2  ## bus.js
## bus.js
import Vue from 'Vue'
export default new Vue()

## Child1
<div>
    <button @click="toChild2">点击将我的数据传给child2组件</button>
</div>
<script>
    import bus from 'bus.js'
	export default {
        data() {
            return {
                child1Data: '我是child1组件数据'
            }
        },
        methods: {
            toChild2() {
                bus.$emit('getChild1Data', this.child1Data)
            }
        }
    }
</script>

## Child2
<div>
    <p>{{ str }}</p>
</div>
<script>
	import bus from 'bus.js'
    export default {
        data() {
            return {
                str: ''
            }
        },
        created() {
            bus.$on('getChild1Data', val => {
                console.log(val) // child1组件中定义的事件
                this.str = val
            })
        }
    }
</script>

vuex实现任意组件间通信

## Child1  ## Child2  ## store.js
## store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
export default new Vuex.Store({
	state: {
		globalMessage: ''
	},
	getters:{},
	mutations:{
		setMessage(state, message) {
			state.globalMessage = message
		}
	},
	actions:{}
})

## Child1
<div>
    <button @click="sendMessage">点击我给store中存数据</button>
</div>
<script>
	export default {
        methods: {
            sendMessage() {
                this.$store.commit('setMessage', 'I am globalMessage')
            }
        }
    }
</script>

## Child2
<div>
    <p>{{ $store.state.globalMessage }}</p>
</div>

provide/inject祖先和后代组件间通信

image.png

## Parent  ## Child
<div>
    <p>我是祖先组件</p>
</div>
<script>
	export default {
        provide() {
            return {
                val: '我是从祖先组件 provide下来的数据'
            }
        }
    }
</script>

## Child
<div>
    <p>{{ val }}</p>
</div>
<script>
	export default {
        inject: ['val']
    }
</script>