1. 程式人生 > >Vue2.0-元件間通訊、元件間傳遞資料方法總結(帶例子)

Vue2.0-元件間通訊、元件間傳遞資料方法總結(帶例子)

元件間通訊-傳遞資料

父元件給子元件傳遞資料,子元件需要設定props來宣告自己的預期資料,如果傳遞的資料有‘-’,子元件要用小駝峰形式接受:

<div id="app">
    <aaa></aaa>         
</div>
<template id='A'>
    <div>
        <h1>A元件{{num}}</h1>
        <bbb :num='num'></bbb>
    </div>
</template>
<template
id='B'>
<div> <h1>B元件
{{num}}</h1> </div> </template> <script> var vm=new Vue({ el:'#app', components:{ 'aaa':{ template:'#A', data:function(){ return { num:1
} }, components:{ 'bbb':{ template:'#B', props:['num'] } } } } })
</script>

傳遞的資料如果是引用型別的,父子元件就可以雙向控制

<div id
="app">
<aaa></aaa> </div> <template id='A'> <div> <input type="text" v-model="content.num" /> <h1>A元件
{{content.num}}</h1> <bbb :content='content'></bbb> </div> </template> <template id='B'> <div> <input type="text" v-model="content.num" /> <h1>B元件{{content.num}}</h1> </div> </template> <script> var vm=new Vue({ el:'#app', components:{ 'aaa':{ template:'#A', data:function(){ return { content:{ num:1 } } }, components:{ 'bbb':{ template:'#B', props:['content'] } } } } }) </script>

子元件要獲取父元件的資料也可通過$parent

var vm=new Vue({
    el:'#app',
    components:{
        'aaa':{
            template:'#A',
            data:function(){
                return {
                    content:{
                        num:1
                    }

                }
            },
            components:{
                'bbb':{
                    template:'#B',
                    data:function(){
                        return {
                            content:{
                                num:null
                            }
                        }
                    },
                    mounted(){
                        this.content.num=this.$parent.content.num
                    }
                }
            }
        }
    }
})

元件、例項上的this物件有parent,children,$root,就形成了viewmodel鏈,理論上來說,任何兩個元件之間的資料都可相互呼叫了

子元件更改父元件資料:父元件將自己更改資料的方法傳遞給子元件呼叫:

<div id="app">
    <aaa></aaa>
</div>
<template id="aaa">
    <div>            
        <p>這是父親(A)</p>
        <p>這是我兒子和我說的話:{{msg}}</p>
        <hr>
        <bbb :tell-dady="hearSonWord"></bbb>
    </div>
</template>

<template id="bbb">
    <div>  
        <p>這是兒子(B)</p>
        和爸爸說的話:<input type="text" v-model="msg">{{msg}}
    </div>
</template>
// 父元件可以將自己方法傳遞給子元件來呼叫,實現子元件更改父元件的資料
<script>
    Vue.component("bbb",{
        template:"#bbb",
        props:['tellDady'],
        data:function(){
            return {
                msg:''
            }
        },
        watch:{
            msg:function(){
                this.tellDady(this.msg)
            }
        },
        methods:{

        }

    })

    Vue.component("aaa",{
        template:"#aaa",
        data:function(){
            return {
                msg:''
            }
        },
        methods:{
            hearSonWord:function(word){
                this.msg = word
            }
        }
    })

    new Vue({
        el:"#app"
    })
</script>

子元件更改父元件資料:也可以父元件給子元件繫結一個事件,事件的處理程式可以是父元件的一個方法,當子元件自己觸發這個事件的時候會相當於呼叫了父元件的方法:

<div id="app">
    <aaa></aaa>
</div>
<template id="aaa">
    <div>            
        <p>這是父親(A)</p>
        <p>這是我兒子和我說的話:{{msg}}</p>
        <hr>
        <bbb @tell-dady="hearSonWord"></bbb>
    </div>
</template>

<template id="bbb">
    <div>  
        <p>這是兒子(B)</p>
        和爸爸說的話:<input type="text" v-model="msg">{{msg}}
    </div>
</template>
<script>
    Vue.component("bbb",{
        template:"#bbb",
        data:function(){
            return {
                msg:''
            }
        },
        watch:{
            msg:function(){
                this.$emit("tell-dady",this.msg)
            }
        },
        methods:{

        }

    })

    Vue.component("aaa",{
        template:"#aaa",
        data:function(){
            return {
                msg:''
            }
        },
        methods:{
            hearSonWord:function(word){
                this.msg = word
            }
        }
    })

    new Vue({
        el:"#app"
    })
</script>

父元件獲取子元件資料時可用$children,也可用ref:

<div id="app">
    <father></father>
</div>
<template id='Father'>
    <div>
        <button @click='get'>get</button>
        <p></p>
        <son ref='one'></son>
        <son></son>
        <son></son>
    </div>
</template>
<template id='Son'>
    <div>
        <input type="text" v-model='msg'/>
    </div>
</template>
<script>
    Vue.component('son',{
        template:'#Son',
        data:function(){
            return {
                msg:''
            }
        },
    })
    Vue.component('father',{
        template:'#Father',     
        methods:{
            get:function(){
                console.log(this.$refs.one.msg)
            }
        }
    })
    var vm=new Vue({
        el:'#app'
    })
</script>

非父子元件通訊:event bus:(適用於主動給資料)

父子元件通訊也可用,但是沒有必要

<div id="app">
    <aaa></aaa>
    <bbb></bbb>
</div>
<template id='aaa'>
    <div>
        <input  type="text" @keydown.enter='change'/>
    </div>
</template>
<template id='bbb'>
    <div class='box' :style="{background:color}">
    </div>
</template>
<script>
    var bus=new Vue() //建立一個空的 Vue 例項作為事件匯流排
    Vue.component('aaa',{
        template:'#aaa',
        data:function(){
            return {

            }
        },
        //給資料的一方觸發bus裡的函式並傳值
        methods:{
            change:function(e){
                console.log(e.target.value)
                bus.$emit('a-give',e.target.value)
            }
        }
    })
    Vue.component('bbb',{
        template:'#bbb',
        data:function(){
            return {
                color:'red'
            }
        },
        //接收資料的元件在鉤子函式裡繫結函式
        mounted:function(){
            let that = this
            bus.$on('a-give',function(res){
                that.color=res
            })
        }
    })
    var vm=new Vue({
        el:'#app'
    })
</script>