vue原生指令v-model實現自定義樣式の多選與單選
說好的下篇來了~
看上邊這句話很唐突的朋友可以先移駕看看這篇文章的背景:
使用v-model和原生表單也可以實現這麼好看且達到需求的效果。
重要的是不用自己跟在使用者屁股後面屁顛屁顛的監聽人家到底何時用了點選事件,又把點選事件用在何處了!
效果圖如下,和之前的沒什麼兩樣呢!
具體實現我想,vue官網有關於繫結的講解和demo,事實上,我只要做到利用他的demo把我的資料和樣式調整一下就萬事大吉了!
沒有什麼比簡單解決一個功能更讓人開心的了!
說幹就幹,我直接在原來專案程式碼的基礎上動手:
之前的選項處理就一個li孤軍奮戰,資料渲染、樣式切換、包括點選事件都繫結在上邊,
ul.qus-list li(v-for="(item,index) in state.ExamInfo.QuestionAnswerCode" @click="choosed(index)" v-bind:class="{'li-focus' : chooseNum==index}" ref="liId") {{item.Code}}、{{item.Description}}
簡直忙到沒朋友啊有沒有!光他和ul的長度差距就說明了一切!
現在我們把他要做的事分解一下:
現在他只負責v-for迴圈資料渲染
ul.qus-list li(v-for="(item,index) in state.ExamInfo.QuestionAnswerCode" v-bind:class="{'li-focus' : chooseNum==index}")
內部生了兩個孩子:
input:radio/checkbox 和 label,這倆人一個負責點選後與資料的繫結,一個負責樣式。
這麼一說大神就明瞭了,好你可以走了,把沙發騰出來。
這倆人中,Input負責資料繫結,其實也就是利用v-model。具體原理直接看
input( type="radio" :value="item.Code" :id="'choice1'+index" v-model="picked")
然後label負責樣式。樣式也包括使用者看到的選項文字的展示:
label(:for="'choice1'+index" class="choice-item") {{item.Code}}、{{item.Description}}
至於他具體怎麼負責樣式?這個也利用了css的選擇器
主要是:checked選擇器和 相鄰兄弟選擇器+符號
/*普通樣式*/ .choice-item { display: block; margin: .2rem auto 0; padding: .3rem .3rem .34rem; color: $qusTxt; font-size: .34rem; text-align: center; @include boxStyle(1rem, .12rem, rgba(49, 32, 114, 0.16));}
/*input被選中時,label的樣式*/ input:checked + .choice-item { background: $purpleClr; color: #FFF; }
於是就有了這樣的樣式:
這裡可以看出,二者是相互成就的關係:
首先透過html那裡,label的for屬性和input的id屬性關聯,使得點選label的時候,input也就被選擇上了。
然後是css樣式這裡,label除了自己正常的樣式,還受input被選中狀態的影響,當input被選中後(input:checked),作為input在li爸爸內部的唯一兄弟元素(+選擇符),label的樣式就被重新更新了選中態。
因為選中展示的效果被label做了,那麼input也就可以歸隱山林,幽享田園生活了。所以直接設定樣式不可見即可。
這也就是為什麼我上一篇說,自己不會巧妙的利用每一個程式碼的特性。而這一篇的實現方式正是還算巧妙的利用了需要使用的多個知識點。他們結合後產生的化學反應,也就不再需要我自己吭哧吭哧搬磚似的往li身上繫結那個choose事件來監聽使用者點選了。程式碼自己給我們做了!甚至最後連使用者選了什麼都不用再做處理,直接將v-model繫結的變數傳給後端即可。
強大的v-model!
因為本需求有多選和單選,作為單頁應用,又因不需要渲染很多道題目,每次只渲染一道。所以我們可以最後根據選項判斷確定是需要多選還是單選,動態的切換這兩套就行了。
經過這個專案我更深刻地體會到了,巧妙的利用每一個程式碼的特性,你將不再光腳登山!上五樓不費勁兒的那種哦!做個輕鬆快樂的高效程式猿。
最後,由於整篇原始碼過多,而編輯器不支援程式碼摺疊,貼過來未免麻煩,有需要看原始碼與我討論或指導我程式碼的,可以留言我再單獨貼原始碼。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/758/viewspace-2805152/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- elementUI radio修改單選框多選框選中樣式及自定義其他樣式。UI
- Vue3.0實現原生高度可自定義選單元件vue3-menusVue元件
- 自定義 ActionBar 標題與選單中的文字樣式
- 自定義ActionBar標題與選單中的文字樣式
- C# 對選單進行自定義樣式C#
- 自定義View:側滑選單實現View
- Vue.js自定義下拉選單,如何實現在下拉選單區域外點選即可關閉下拉選單的功能Vue.js
- 自定義View:側滑選單動畫實現View動畫
- 自定義通過PopupWindow實現通用選單
- vue.js響應式原理解析與實現—實現v-model與{{}}指令Vue.js
- css自定義單選按鈕的樣式程式碼例項CSS
- vue-自定義指令-實現提示功能Vue
- 自定義右鍵選單實現過程詳解
- Flutter實現自定義篩選框Flutter
- UIWebView自定義選單欄UIWebView
- 自定義右鍵選單
- Vue JSX、自定義 v-modelVueJS
- 在Vue3中實現自定義指令Vue
- 自定義ViewGroup,實現Android的側滑選單ViewAndroid
- 使用PhotosKit自定義多選相簿
- [Vue.js2.x]可從外部關閉的下拉選單的自定義指令Vue.js
- 原生 JavaScript 如何實現通過自定義屬性定位/篩選節點JavaScript
- 利用純 CSS3 定製單選/多選框樣式CSSS3
- vue 自定義指令Vue
- Vue自定義指令Vue
- vue 自定義指令實現資料拉取更新Vue
- PHPCMS自定義表單樣式PHP
- jQuery自定義多選下拉框jQuery
- Asp.Net2.0實現自定義樣式ASP.NET
- 使用Vue實現下拉選單框批量新增選項Vue
- Android列表實現單選、多選、全選、取消、刪除Android
- Vue + WebRTC 實現音視訊直播(附自定義播放器樣式)VueWeb播放器
- Vue實現左右選單聯動實現(更新)Vue
- 自定義 Windows 右鍵選單項Windows
- 自定義下拉選單控制元件控制元件
- SQLserver自定義樣式主鍵-函式實現篇SQLServer函式
- Vue中自定義指令Vue
- vue如何自定義指令?Vue