由于項目在vue的開發框架下,因此使用ElementUI組件庫進行實現。
我希望可選擇可編輯的下拉框右側有跟下拉框一樣的箭頭,并且在未輸入任何內容時,點擊該框體會出現選擇列表進行填充數據的選擇,點擊選中數據后列表消失,數據內容出現在框體中,并且點擊可編輯,編輯時不會再有任何列表出現,當清空框體后候選列表可出現。
但是ElemnetUI組件庫中并沒有完全符合需求的組件。
只有不可編輯的下拉框el-select(缺少可編輯功能)
或是只能編輯的el-input(缺少下拉選擇功能)
或是只有輸入出現匹配提示的el-autocomplete(缺少下拉箭頭和展開收起功能,點擊已有內容會再次出現候選列表)
網上也沒找到特別符合需求的,因此打算在輸入出現匹配提示的el-autocomplete基礎上進行修改。
在設計上增加了下拉框的箭頭,因此要根據候選列表的顯示和隱藏去綁定箭頭的方向,讓它們兩者互相聯動互相影響。
<el-autocompletev-model="form.processes":fetch-suggestions="queryProcesses"placeholder="請輸入進程數"clearable:style="{width: '100%'}"ref="processesAutocomplete"@focus="handleProcessesFocus"@blur="handleProcessesBlur"@clear="handleProcessesClear"class="processes-autocomplete":class="{ 'is-empty': !form.processes, 'is-dropdown-visible': isProcessesDropdownVisible }"@click.native="handleProcessesInputClick"
><islot="suffix":class="['el-input__icon', 'el-icon-arrow-down', 'processes-arrow', { 'is-reverse': isProcessesDropdownVisible }]"@click.stop="toggleProcessesDropdown"></i>
</el-autocomplete>
自定義下拉箭頭:
使用 <i> 元素作為后綴圖標,設置下拉箭頭
動態類綁定:
processes-autocomplete:基礎樣式類
'is-empty': !form.processes:當輸入框為空時添加 is-empty 類
'is-dropdown-visible': isProcessesDropdownVisible:當下拉列表顯示時添加該類
箭頭圖標控制:
processes-arrow:箭頭基礎樣式
'is-reverse': isProcessesDropdownVisible:當下拉列表顯示時旋轉180度
事件處理:
@click.native="handleProcessesInputClick":處理輸入框點擊
@click.stop="toggleProcessesDropdown":點擊箭頭切換下拉狀態
在data()中添加以下示例內容:
isProcessesDropdownVisible: false,processesOptions: [{ value: "30", label: '30' },{ value: "60", label: '60' },{ value: "120", label: '120' }],
Methods部分要增加以下內容:
控制只在輸入框為空時顯示預定義選項。???
queryProcesses(queryString, cb) {// 只顯示預定義的選項,不根據輸入內容過濾// 只有當輸入框為空時才顯示所有選項if (!queryString) {cb(this.processesOptions);} else {// 當有輸入內容時,不顯示任何建議列表cb([]);}},
延遲隱藏下拉列表,避免用戶點擊選項時立即隱藏。
handleProcessesBlur() {// 延遲隱藏下拉列表,避免點擊選項時立即隱藏setTimeout(() => {this.isProcessesDropdownVisible = false;}, 150);},
清空輸入內容時顯示下拉列表。
handleProcessesClear() {this.isProcessesDropdownVisible = true;},
? ?根據輸入框是否為空決定是否切換下拉狀態。
// 處理輸入框點擊事件handleProcessesInputClick() {// 如果輸入框有內容,只聚焦不切換下拉狀態if (this.form.processes) {return;}// 如果輸入框為空,切換下拉狀態this.toggleProcessesDropdown();},
控制下拉列表的顯示/隱藏,并相應地設置建議選項和焦點。
// 切換下拉列表顯示狀態toggleProcessesDropdown() {this.isProcessesDropdownVisible = !this.isProcessesDropdownVisible;this.$nextTick(() => {if (this.$refs.processesAutocomplete) {if (this.isProcessesDropdownVisible) {// 立即顯示下拉列表this.$refs.processesAutocomplete.suggestions = this.processesOptions;// 聚焦到輸入框this.$refs.processesAutocomplete.focus();} else {// 隱藏下拉列表并取消輸入框焦點// 清空建議列表來隱藏下拉菜單if (this.$refs.processesAutocomplete.suggestions) {this.$refs.processesAutocomplete.suggestions = [];}// 取消輸入框焦點this.$refs.processesAutocomplete.$el.querySelector('input').blur();}}});},
樣式文件如下:
<style scoped>.processes-autocomplete.is-empty ::v-deep .el-input__inner {padding-right: 30px;}.processes-arrow {transition: transform 0.25s ease-in-out;cursor: pointer;line-height: 30px;color: #C0C4CC;font-size: 14px;}.processes-arrow.is-reverse {transform: rotate(-180deg);}.processes-autocomplete:not(.is-empty) ::v-deep .processes-arrow {display: none;}/* 當鼠標按下時保持箭頭狀態不變 */.processes-arrow:active {transform: rotate(-180deg) !important;}</style>
箭頭方向與下拉狀態聯動:
下拉列表隱藏時:箭頭向下(默認狀態)
下拉列表顯示時:箭頭向上(通過 is-reverse 類實現)
箭頭顯示與輸入內容聯動:
輸入框為空時:顯示箭頭
輸入框有內容時:隱藏箭頭顯示清空圖標
用戶體驗優化:
點擊箭頭或空輸入框可切換下拉狀態
有內容時點擊輸入框不會改變下拉狀態
延遲隱藏避免誤操作
平滑的旋轉動畫效果