【antdesign select】下拉選擇-帶選擇序號
需求:下拉框在選中時能夠在check-icon後面顯示當前選中項的排序,以及當超過最大可選數時不允許繼續選中。
在Antdesign元件裡好像沒有控制可選數的option,這點真的讓人很奇怪誒~還得自己在onchange裡寫邏輯來控制。
一開始我能想到的簡單思路是:
1.通過在屬性options裡面塞個icon,自定義選項的展示
2.通過操作渲染好的下拉選單裡的dom元素
實踐後發現上述的都不太可行,最後只能採用了自定義下拉框內容(dropdownRender屬性)來實現。
放一下程式碼template
<template #dropdownRender="{list}">
<v-nodes :vnodes="list" />
<a-list :locale="{emptyText: notFoundContent}" @mousedown.prevent>
<li
v-for="item in filteredDataSource"
:key="item.id"
:value="item.id"
class="sort-select-list-item"
:class="{'disabled':item.disabled,'selected':item.selected}"
@click="handleClickItem(item)"
@mouseenter="handleMouseEnterItem(item)"
@mouseleave="handleMouseLeaveItem(item)"
>
{{ item.name }}
<a-icon v-if="item.selected" class=" check-icon check-icon-selected" type="check" />
<a-icon v-else v-show="item.hovered && !item.disabled" class=" check-icon check-icon-hovered" type="check" />
<span v-if="item.selected" :class="{'check-order-circle': item.selected}" class="check-icon-selected">
<span class=" check-order ">{{ item.order }}</span>
</span>
<span v-else v-show="item.hovered && !item.disabled" class="check-order-circle-hovered check-icon-hovered">
<span class=" check-order ">{{ item.order }}</span>
</span>
</li>
</a-list>
</template>
可以看到,實際上就是自定義下拉框用了個list元件,並且通過狀態屬性disabled、selected、hovered來控制這些選項的樣式。
這樣子改寫了antdesign的下拉選單展示後,就得重新寫一遍樣式和互動,才能保持和原有樣式一致。
現在說一下思路:
呼叫這個元件
傳入屬性:dataSource
獲取到dataSource後,不會直接用來渲染模板。需要處理成新的dataSource,給它新增些基礎狀態屬性。
// 新的dataSource(接收prop,新增相關屬性後的dataSource,主要用於資料處理)
get newDataSource() {
const data: any = this.dataSource.map((item: any) => {
return {
...item,
selected: false,
disabled: false,
hovered: false,
order: 1
}
})
this.filteredDataSource = data
return data
}
這裡還有個filteredDataSource變數,在上一張圖可以看到,實際模板最後渲染的list資料是來自filteredDataSource的。
這個就是為了允許這個下拉框可以有搜尋功能。
結合Antdesign的原生下拉元件中的search事件來實現
// 搜尋匹配相應的資訊
handleSearch(value: any) {
if (value) {
this.filteredDataSource = this.newDataSource.filter((item: any) => {
if (item.name.includes(value))
return true
})
} else {
this.filteredDataSource = this.newDataSource
}
}
之後就是針對滑鼠事件(點選、移入、移除)來修改對應的狀態屬性值,從而實現選中、hovered、和禁止選擇的樣式。
而對於選中事件,需要考慮的點相對複雜些。
- Antdesign的原生下拉元件,在點選選中時可以控制是否清空輸入框的輸入內容(不好實現)
- 點選項原本為選中,再次點選時就是取消點選
- 選中時更新下拉框的value,否則下拉選單和下拉框的選中項會不一致
- 選中後是否啟用禁用
遇到的問題:
問題1.當滑鼠點選下拉框,下拉選單出現,然後快速hover到列表項時會出現下拉選單抖動的問題,這我就很奇怪了,發現在這個過程中下拉選單漸現漸隱的動畫執行了兩遍。
之所以會被執行兩次,我猜測了下:應該是在這個hover過程中,我對下拉選單的hover列表項的狀態屬性修改了,對應的列表項時會有選中樣式以及序號icon,就導致下拉選單重新渲染,與此同時動畫執行了一半。又被重新執行了。
一開始是思考:
1.看看在hover事件時延時賦值,但這就導致整體功能看起來有卡頓延時。
2.在下拉框剛點選的幾秒內不允許hover,但這樣程式碼上,每個列表項就需要判斷什麼時候是下拉框點選的幾秒內。不太知道怎麼來判斷
最後嘗試性列印了antdesign的下拉框元素,神奇的發現有個控制動畫的屬性,於是思考能否將這個值置為空,成功解決了這個問題。
問題2.當下拉框允許搜尋且鍵入了搜尋關鍵字後,下拉選單項被過濾展示後,點選選中任一下拉項後,搜尋框的內容沒有被清空。
在antdesign下拉元件中是有這個屬性的設定,可以用於是否自動清空搜尋框的。
// 如果允許清空,清空輸入框輸入的內容(todo)
if (this.autoClearSearchValue) {
(this.$refs.sortSelect as any).$children[0].$children[0].setInputValue('')
}
相關文章
- 選擇select下拉選單網頁跳轉網頁
- ant design的Select下拉選擇器 帶搜尋功能
- Element原始碼分析系列7-Select(下拉選擇框)原始碼
- golang開發:select多路選擇Golang
- AlloyTouch之select選擇外掛
- select下拉選擇第一個選項為空白、option無法選中的解決辦法,
- select2 智慧補全模糊查詢select2的下拉選擇框使用
- AngularJS系列之select下拉選擇第一個選項為空白的解決辦法AngularJS
- selenium+python 下拉框選擇Python
- Select 選擇器使用注意事項
- el-select 選擇器相關
- HTML select 下拉選單HTML
- HTML select下拉選單HTML
- 求教:python+selenium 下拉框選擇Python
- Vue+Openlayer中使用select選擇要素Vue
- 002---選擇器(標籤選擇器、類選擇器、id選擇器、偽類選擇器、萬用字元選擇器)字元
- jQuery 美化select下拉選單jQuery
- 圓角select下拉選單
- 程式流程 (順序,選擇,迴圈)
- css 選擇器優先順序CSS
- jQuery選擇器介紹:基本選擇器、層次選擇器、過濾選擇器、表單選擇器jQuery
- css選擇器,帶例項CSS
- CSS 選擇器 - 帶例項CSS
- laravel-excel匯出excel下拉選擇框LaravelExcel
- tkinter中combobox下拉選擇控制元件(九)控制元件
- 帶有多選和突出顯示關鍵字的自定義下拉選擇框(靜態)
- excel下拉選擇項怎麼設定 excel怎麼新增下拉選項內容Excel
- 直播帶貨原始碼,日期時間選擇器 選擇範圍限制原始碼
- Winform 工具欄 ToolStripMenuItem下拉選擇項選中對勾不居中ORMUI
- select 下拉框選中事件事件
- CSS 選擇器的優先順序CSS
- 順序結構與選擇結構
- 清華尹成帶你實戰GO案例(59)Go 通道選擇SelectGo
- 選擇訊號分析 XPEHH 檢測
- CSS3新增選擇器(屬性選擇器、結構偽類選擇器、偽元素選擇器)CSSS3
- 短視訊直播系統,選擇選項時,點選出現下拉框
- 自定義周選擇元件、年選擇元件元件
- jQuery選擇器之層次選擇器jQuery