iView‐Radio Button 取消選取的問題 - daniel-qa/Vue GitHub Wiki
無法解決取消重覆點擊的問題,下面是紀錄
watch / computed 也無法幫忙,因為重複點擊不會改變 v-model → watch 不觸發
換句話說,要正確抓重複點擊,需要用 純 click 事件 + 手動控制選中值 的方式,不依賴 v-model 自動更新。
「使用者點擊的這個值,什麼時候才抓得到?」
答案是:就是在 DOM click 事件發生的那一刻。
但在 click 裡直接改 v-model,會被 iView 的內部更新覆蓋掉
==> 值永考不會更新
方法 1:綁在 RadioGroup 的 @on-click(官方事件)
iView 官方提供了 RadioGroup @on-click:
<Radio-group v-model="button1" type="button" @on-click="handleClick">
<Radio label="北京">北京</Radio>
<Radio label="上海">上海</Radio>
</Radio-group>
iView Radio 的「硬限制」你踩到了
官方行為(設計如此,不是你寫錯)
Radio-group 一定會保證「永遠有一個值或空值」
但 點擊已選中的 Radio,不會幫你清空
v-model 的更新時機 在 click 之後
當 v-model 在 click 之後才更新時,你在 click handler 裡看到的值,一定是「舊的」。
你現在踩到的 bug,99% 都是從這裡長出來的
只要 v-model 是「click 之後才更新」,那就「不要在 click handler 裡處理狀態判斷」
- 方法(最推薦):你自己控制狀態的地方
👉 換句話說:不要用 v-model
Radio-group 用 :value
狀態變更只在你自己的 method 裡發生
<Radio-group :value="selectedSchoolId">
<Radio
v-for="school in schools"
:key="school.id"
:label="school.id"
@click.native.stop="toggleSchool(school.id)"
>
{{ school.name }}
</Radio>
</Radio-group>
toggleSchool(id) {
this.selectedSchoolId =
this.selectedSchoolId === id
? ''
: id
}
為什麼這是王道?
你不依賴元件內部時序
沒有「舊值 / 新值」問題
行為完全可預期
UX 規則 = 業務邏輯(而不是 UI hack)
👉 99% 這類需求都該走這條