el-select 1.4.x版本實現2.x.x版本的reserve-keyword功能


今天在維護以前的項目時,發現了一個小bug,其實也不算是bug,只是客戶對這個控件的體驗不是很滿意。

我們在element 2.x.x的版本的官方文檔中可以發現el-select組件的屬性中比1.x.x的版本多了很多新的屬性,其中的reserve-keyword屬性,正好是客戶想要實現的效果。

 

1.x.x版本的el-select標簽在支持搜索和多選的情況下,輸入搜索關鍵字,在選中一個選項后仍會保留當前的搜索關鍵字。這個是客戶不想要的效果,而且也不能升級element的版本(怕出現其它的問題),那沒辦法只能改咯。

一開始我也沒什么頭緒,甚至還想過用css的樣式去控制什么的,最終形成的效果都不是很好。實在沒辦法只能去看el-select組件的源碼,看看能不能幫我找到靈感。

以下是我在網上找到的el-select組件的template源碼:

<template>
  <div>
    <!-- 多選 -->
    <div
      v-if="multiple"
      ref="tags">
      <!-- collapse tags 多選時是否將選中值按文字的形式展示 -->
      <span v-if="collapseTags && selected.length">
        <el-tag
          type="info"
          disable-transitions>
          <span class="el-select__tags-text">{{ selected[0].currentLabel }}</span>
        </el-tag>
        <el-tag
          v-if="selected.length > 1"
          type="info"
          disable-transitions>
          <span class="el-select__tags-text">+ {{ selected.length - 1 }}</span>
        </el-tag>
      </span>
      <!-- 多選,多個 el-tag 組成 -->
      <transition-group @after-leave="resetInputHeight" v-if="!collapseTags">
        <el-tag
          v-for="item in selected"
          :key="getValueKey(item)"
          type="info"
          disable-transitions>
          <span class="el-select__tags-text">{{ item.currentLabel }}</span>
        </el-tag>
      </transition-group>
      <!-- 可輸入文本的查詢框 -->
      <input
        v-model="query"
        v-if="filterable"
        ref="input">
    </div>
    <!-- 顯示結果框 read-only -->
    <el-input
      ref="reference"
      v-model="selectedLabel">
      <!-- 用戶顯示清空和向下箭頭 -->
      <i slot="suffix"></i>
    </el-input>
    <!-- 下拉菜單 -->
    <transition>
      <el-select-menu
        ref="popper"
        v-show="visible && emptyText !== false">
        <el-scrollbar
          tag="ul"
          wrap-class="el-select-dropdown__wrap"
          view-class="el-select-dropdown__list"
          ref="scrollbar"
          v-show="options.length > 0 && !loading">
          <!-- 默認項(創建條目) -->
          <el-option
            :value="query"
            created
            v-if="showNewOption">
          </el-option>
          <!-- 插槽,用於放 option 和 option-group -->
          <slot></slot>
        </el-scrollbar>
        <!-- loading 加載中文本 -->
        <p
          v-if="emptyText &&
            (!allowCreate || loading || (allowCreate && options.length === 0 ))">
          {{ emptyText }}
        </p>
      </el-select-menu>
    </transition>
  </div>
</template>

其中最重要的就是實現搜索功能的這一段代碼:

<!-- 可輸入文本的查詢框 -->
<input v-model="query" v-if="filterable" ref="input">

可以看到搜索文本框的值其實是綁定在query的屬性上,那就簡單多了,我只要每次選擇完下拉框選項中的某一項后,清空query屬性不就行了么。以下是實現代碼:

<el-select v-model="value" multiple placeholder="請選擇" filterable  @change="onSelectChange" ref="el-select">
      <el-option label="黃金糕" value="黃金糕"></el-option>
      <el-option label="龍須面" value="龍須面"></el-option>
      <el-option label="北京烤鴨" value="北京烤鴨"></el-option>
</el-select>
onSelectChange() {
       this.$refs['el-select'].query = '';
}

最重要的就是,取到通過vue的ref獲取到el-select這個組件對象,並在el-select的change回調函數中,將query的值設為空就行了。

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM