背景:
線上商城下訂單的時候,用戶選擇存在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);
}
不過前面到底是爲什麼不可以呢,有人遇到過相似的問題嗎。