1. 程式人生 > >Vue父子傳值與非父子傳值

Vue父子傳值與非父子傳值

父傳子:主要是通過 子元件使用 props() 方法來接收 父元件傳遞過來的值

Vue.component('father',{
            template:`
                    <div>
                        <p>我是father,我給我son取得名字叫{{sonName}}</p>
                        <son :myName="sonName"></son>
                    </div>
            `,
            data(){
                return {
                    sonName:'Juliet'
                }
            },
            components:{
                son:{
                    // 子元件通過 props 來接收組元件傳過來的值
                    props:['myName'],
                    template:`
                            <div>
                                <p>我是son,我father給我取名字叫{{myName}}</p>
                            </div>
                    `,
                }
            }
        })

子傳父: 使用 $emit('一個事件的名稱' ,'需要傳遞的資料') 方法  傳遞需要傳遞的資料 

Vue.component('father',{
            template:`
                    <div>
                        <p >我是father,son告訴我他叫{{sonName}}</p>
                        <son @tellfatherMyName="mysonName"></son>
                    </div>
            `,
            methods:{
                // 這個函式有一個引數 就是傳遞過來的資料
                mysonName(data){
                    // console.log(data)
                    this.sonName = data
                }
            },
            data(){
                return {
                    sonName:'???'
                }
            },
            components:{
                son:{
                    template:`
                            <div>
                                <button @click="tellfatherMyName">我是son ,我告訴father 我新取得名字叫{{myName}}</button>
                            </div>
                    `,
                    data(){
                        return {
                            myName:'Juliet'
                        }
                    },
                    methods:{
                        tellfatherMyName(){
                            // 子元件傳值給父元件用 $emit() 方法 
                            // 這個方法可以穿兩個值 
                            // 一個事件名稱 一個就是需要傳遞的資料
                            this.$emit('tellfatherMyName',this.myName)
                        }
                    }
                }
            }
        })

非父子傳值:傳值的一方通過使用 $emit() 把資料傳到事件匯流排  接收資料的一方再通過 $on() 方法來接收傳遞過來的資料

 // 建立一個新的Vue例項  作為事件匯流排
        var eventbus = new Vue()
        Vue.component('father',{
            template:`
                    <div>
                        <son></son>
                        <daughter></daughter>
                    </div>
            `,
            components:{
                son:{
                    template:`
                            <div>
                                <p>我是son daughter告訴我她名字叫{{daughterName}}</p>
                            </div>
                    `,
                    data(){
                        return {
                            daughterName:'???'
                        }
                    },
                    mounted() {
                        // 通過 $on() 方法來監聽兄弟節點傳遞的資料
                        // 這個方法有兩個引數 一個是時間的名稱 一個是函式 這個函式的預設值就是傳遞過來的資料
                        eventbus.$on('TellsonMyName',data => {
                            // console.log(data)
                            this.daughterName = data
                        })
                    },
                },
                daughter:{
                    template:`
                            <div>
                                <button @click="TellsonMyName">點選告訴son 我的名字叫{{myName}}</button>
                            </div>
                    `,
                    data(){
                        return {
                            myName:'Juliet'
                        }
                    },
                    methods:{
                        TellsonMyName(){
                            eventbus.$emit('TellsonMyName',this.myName)
                        }
                    }
                }
            }
        })