Vue中radio單選框單擊取消選中狀態(tài)


? ? ? ?咳咳。。。如標(biāo)題所講,看起來好簡單的樣子,但是這個需求在一個Vue架構(gòu)的中大型項(xiàng)目中實(shí)現(xiàn)起來又貌似不是想象中的那么容易。以下是我的思路,愚見求各位大佬指教。

分析:

1、問題就是將input radio單選框改造成單擊可以取消其選中狀態(tài)

2、單純的對input radio進(jìn)行js控制行不通,因?yàn)閞adio是通過v-repeat出來的,有很多個,如果每一個都去獲取元素的話,執(zhí)行效率太低,failed

3、給radio添加click事件,判斷checked屬性,如果為true則取消checked,但由于radio每次click都會將自己的checked置為true(Vue的數(shù)據(jù)雙向綁定速度也是很快的),數(shù)據(jù)賦值速度之快以至于每次click獲取到的checked值都為true,failed

4、當(dāng)一個radio從未選中到選中狀態(tài),會先觸發(fā)click再觸發(fā)change事件,因此只要在click事件判斷當(dāng)前radio是否觸發(fā)了change事件,如果沒觸發(fā)change事件說明當(dāng)前radio是選中狀態(tài),此時(shí)則把該radio的checked置為false,就可以實(shí)現(xiàn)單擊選中狀態(tài)的radio取消其選中狀態(tài)

5、以上第4點(diǎn)有一個邏輯漏洞,因?yàn)閏lick先觸發(fā),change后觸發(fā),那如何在click中判斷當(dāng)前radio是否觸發(fā)了change呢?需要將click事件中的js判斷邏輯手動放到change觸發(fā)之后執(zhí)行,則將click中的邏輯放在setTimeout延遲0秒,手動將這段邏輯執(zhí)行排在了change事件隊(duì)列的后面

6、多說無益,打碼:


7、以上代碼中的changed就作為判斷依據(jù),因?yàn)檫@只是改造了原生的radio,所以是不會污染原來綁定的數(shù)據(jù),可以放心去擼后面的碼

8、下一步優(yōu)化就是把這段邏輯封裝到Vue中的directive作為公共radio組件,見以下代碼


9、組件分析:沒什么好說的,就是單純的把第6點(diǎn)的邏輯封裝在了一個公共的directive組件中(無奈,因?yàn)槭褂玫牡氖荲ue1,這個版本暫時(shí)還沒有虛擬DOM,其實(shí)更好的做法是把它做成一個虛擬DOM)

10、Vue中使用這個公共組件,只需要加'v-radio'屬性即可


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.安裝 可以簡單地在頁面引入Vue.js作為獨(dú)立版本,Vue即被注冊為全局變量,可以在頁面使用了。 如果希望搭建...
    Awey閱讀 11,278評論 4 129
  • 下載安裝搭建環(huán)境 可以選npm安裝,或者簡單下載一個開發(fā)版的vue.js文件 瀏覽器打開加載有vue的文檔時(shí),控制...
    冥冥2017閱讀 6,193評論 0 42
  • Vue 實(shí)例 屬性和方法 每個 Vue 實(shí)例都會代理其 data 對象里所有的屬性:var data = { a:...
    云之外閱讀 2,361評論 0 6
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,167評論 0 29
  • 2016年夏,北京石景山,我見到了人生最壯觀的槐花盛開,一片春回大地之象。 都說五月槐花開,現(xiàn)在都陰歷六月中了,小...
    承謙閱讀 544評論 0 0

友情鏈接更多精彩內(nèi)容