父組件監視子組件中checkbox的屬性

背景:
線上商城下訂單的時候,用戶選擇存在localstroge中的地址。
父組件:選擇地址的頁面。selectAdd下的index.vue
子組件:每一個地址。(CheckBox+地址)
在這裏插入圖片描述
要實現只能選擇一個地址確認。
我前後考慮了幾種做法。
第一種是用了一個計數器count,CheckBox的值改變時觸發change函數,給count加減。主要代碼如下:

 <van-checkbox v-model="checked" @change="select"></van-checkbox>
 data(){
            return{
                checked:false,
                count:0,
            }
        },

        methods:{
            select(checked){
                if (checked){
                    this.count+=1;
                }
                else{
                    this.count-=1;
                }


            }
        },

但是問題很奇怪,我確定每次改變都會觸發select函數,並且都執行了對count的操作,但是結果不會保存。
舉個例子:選擇了第一個地址輸出是this.count=1,選擇第二個地址輸出還是this.count=1,並且調試時發現,在第二次執行this.count+=1;之前,this.count的值爲0。減法也是。


第二種方法是change改變之後emit發送信號給父組件。但是父組件無法接收到信號。調試確定子組件執行了emit這一步。

this.$emit("change",{checked});

父組件:

        <AddItem v-for="(add,index) in List"
                 :key="index"
                 @change="handle" />

然後methods接收:

            handle(){
                console.log("1111");
            },

但是父組件就是無法接收。
第三種就是直接監視父組件,給父組件增加ref屬性,console.log的時候發現ref獲得的節點是有子組件的全部屬性,也就包括checked屬性:

        <AddItem v-for="(add,index) in List"
                 :key="index"
                ref="Item" />

點擊確認按鈕時觸發函數,問題解決:

backToOrder(){
                let items = this.$refs.Item;
                let count = 0;
                for (let i in items)
                    if (items[i].checked)
                        count++;
                if (count!=1)
                {
                    this.$dialog.alert({message:"您到底想要哪個地址呢~"});
                    console.log(count);
                }

不過前面到底是爲什麼不可以呢,有人遇到過相似的問題嗎。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章