[筆記] 打造支援遠端搜尋與鍵盤導航 Multi-Select 下拉選單元件 Vue3 + Tailwindcss

這回筆記下用 Vue3 + Tailwindcss 打造一個支援遠端搜尋項目和鍵盤選取的 Multi-Select 元件。

vue.js logo vue


內容

內外同步狀態

1. 下拉選單是否開啟;2. 已選擇的內容;3. 是否正在搜尋選項

內部狀態

1. 搜尋字串;2. 當前鍵盤選到哪一個;3. 是否正在用鍵盤導航;4. 外部傳入或是自伺服器取得過的選項列表

由於外部選項會因為搜尋的結果而改變,極高機率會與既有所選的項目不相干,因此用一個 Map 的結構來儲存,讓選項還是可以正常顯示

搜尋

加入 debounce 防止過度觸發搜尋

鍵盤導航

1. select 所在的根元件定為 index = 0
2. 由於 Dropdown 用 Teleport 定位到 body 下,因此在此 dom 觸發的鍵盤事件,要能夠定到 select 所在根元件位置
3. 全選功能用 Ctrl/Command + A 來實作

Teleport

運用 Vue3 的 <Teleport> 將下拉選單定位到 body,可避免 overflow:hidden 所造成的干擾,並用 updatePosition 去即時計算 top, left 和 width 位置。
另外在 resize, scroll 的時候都要觸發


程式碼

Github Commit

Demo 網址:https://andy922200.github.io/component-library-demo/#/multi-select

按讚加入粉絲團