1. 程式人生 > >組件基礎(非父子組件傳值)—Vue學習筆記

組件基礎(非父子組件傳值)—Vue學習筆記

cli back change 作用域 src 就是 示例 一行代碼 pla

最近幾天忙著寫Api去了,抽空把後面的內容下出來,然後再分享給大家web可以使用的api。

上次說了父子組件直接的傳值,這次看一下非父子組件之間的傳值(總線機制)

要實現非父子組件之間的傳值非常重要的一行代碼如下

Vue.prototype.young=new Vue();//在Vue實例上掛載一個為young的屬性(指向Vue實例),當然young使隨便取的。

先創建一個基礎框架

<body>
    <div id="app">
        <hello message="YoungAm"></hello>
        <hello 
message="Hi boy"></hello> </div> </body> <script> Vue.prototype.young=new Vue();//在Vue實例上掛載一個為young的屬性(指向Vue實例) Vue.component("hello",{ template:<div>{{message}}</div>, props:[message] }) var app=new Vue({ el:#app })
</script>

顯示效果如下:

技術分享圖片

現在我們需要實現點擊一個名字,讓另一個的內容變為點擊的內容。

前面我們給Vue.prototype掛載了一個young現在我們通過這個young來實現非父子組件之間的傳值。

給組件一個點擊事件,通過添加的young來實現向上傳遞事件‘change’並把當前組件的message值傳出去。

mounted為Vue自帶的生命周期鉤子,當組件被掛載時執行。

this.young.$on()用來監聽事件,這裏接受的是組件傳出來的change。

由於執行change事件時this的作用域發生了改變,

所以我們需要在還未改變時給他一個備份。var _this=this;

最後賦值就行了。

<script>
    Vue.prototype.young=new Vue();//在Vue實例上掛載一個為young的屬性(指向Vue實例)

    Vue.component("hello",{
        template:‘<div @click="handleClick">{{message}}</div>‘,
        props:[‘message‘],
        methods:{
            handleClick:function(){
                this.young.$emit(‘change‘,this.message);//向外觸發事件
            }
        },
        mounted:function(){//當組件被掛載時執行
            var _this=this;//this作用域發生改變,此處進行存儲為改變的this
            this.young.$on(‘change‘,function (ms) {
                _this.message=ms;
            })//監聽事件
        }
    })

    var app=new Vue({
        el:‘#app‘
    })
</script>

測試結果:

技術分享圖片

提醒:如果你為開發板會發現這樣一個警告!

技術分享圖片

這是由於Vue機制引起的。

Vue中規定子組件不得改變父組件的值。

所以我們可以改寫成這樣。

<script>
    Vue.prototype.young=new Vue();//在Vue實例上掛載一個為young的屬性(指向Vue實例)

    Vue.component("hello",{
        data:function(){
            return {selfMessage:this.message}
        },
        template:‘<div @click="handleClick">{{selfMessage}}</div>‘,
        props:[‘message‘],
        methods:{
            handleClick:function(){
                this.young.$emit(‘change‘,this.selfMessage);//向外觸發事件
            }
        },
        mounted:function(){//當組件被掛載時執行
            var _this=this;//this作用域發生改變,此處進行存儲為改變的this
            this.young.$on(‘change‘,function (ms) {
                _this.selfMessage=ms;
            })//監聽事件
        }
    })

    var app=new Vue({
        el:‘#app‘
    })
</script>

好了,非父子組件的傳值就是這樣,示例簡單,大家可自行練習。

再見,一夢一黃粱。

組件基礎(非父子組件傳值)—Vue學習筆記