Vue element下拉菜單實現鍵盤事件上下移

需求

提高用戶體驗感,輸入框自動聚焦并鍵盤控制下拉菜單的選項上下移
效果如圖:


初期使用的el-dropdown下拉菜單,組件默認可鍵盤上下移

<el-dropdown
              v-if="authoritys.length > 0"
              trigger="click"
              @visible-change="toggleSchoolDrop"
              @command="_changeSchool"
            >
            <el-dropdown-menu slot="dropdown">
                <el-input
                  v-model="searchSchoolName"
                  clearable
                  class="school-input"
                  size="mini"
                  :placeholder="$t('el.input.placeholder')"
                  @input="searchSchool"
                />
                <div class="school-menu-list">
                  <el-dropdown-item
                    v-for="(s,i) in authoritysList"
                    v-show="!s.isHide"
                    :key="i"
                    :command="s.id"
                  >
                    {{ i < 9 ? `0${i + 1}` : i + 1 }}. {{ s.name }}
                  </el-dropdown-item>
                </div>
              </el-dropdown-menu>
 </el-dropdown> 

但是鍵盤按上下移不生效.
可能因為我的el-dropdown-item是由數組遍歷出來的,文檔的菜單是寫死的.
換成el-popover組件,內部用ul和li實現遍歷菜單.

 <el-popover
    v-if="authoritys.length > 0"
    v-model="visible"
    trigger="click"
    @visible-change="toggleSchoolDrop"
  >
 <el-input
      v-model="searchSchoolName"
      clearable
      class="school-input mr-b-m"
      size="mini"
      :placeholder="$t('el.input.placeholder')"
      @input="searchSchool"
    />
    <ul
      id="school-menu-list"
      class="school-menu-list"
    >
      <li
        v-for="(s,i) in authoritysList"
        v-show="!s.isHide"
        :key="i"
        class="result-option"
        :class="{'is-active': i===activeIndex,'selectActive': i===selectIndex}"
        @mouseover="_handleMouseOver(i)"
        @click="_changeSchool(s.id,i)"
      >
      {{ i < 9 ? `0${i + 1}` : i + 1 }}. {{ s.name }}
      </li>
    </ul>
  </el-popover>

后續(xù)需要在input框自動聚焦后再觸發(fā)鍵盤上下移事件.
實現自動聚焦,首先想到的方法是 給el-input 添加ref,獲取后調用focus()

<el-input
      placeholder="請輸入內容"
      v-model="value"
      clearable
      @keyup.enter.native="confirm"
      ref="sInput"
    >
this.$refs.sInput.focus()

但是不生效,
后續(xù)查看element官方文檔可用popover的show event手動給el-input獲取焦點

<el-popover placement="bottom" width="200" trigger="manual" v-model="visible" @show="onShow">
    <el-input
      placeholder="請輸入內容"
      v-model="value"
      clearable
      @keyup.enter.native="confirm"
      ref="sInput"
    >
</el-popover>

methods: {
      onShow () {
        this.$refs.sInput.focus()
      }
}

還是不生效,
對焦需要下拉打開后執(zhí)行,也就是dom更新后所以添加 this.$nextTick生效

methods: {
      onShow () {
          this.$nextTick(() => {
              this.$refs.sInput.focus()
           });
      }
}

完成搜索輸入框的自動對焦后添加鍵盤事件,
添加的鍵盤事件讓用戶看到選擇的選項樣式變化以外,滾輪是不會變動的,
繼續(xù)提升用戶體驗感,需要讓滾輪隨著用戶的操作而滑動

 <el-input
      ref="searchSchool"
      v-model="searchSchoolName"
      clearable
      class="school-input mr-b-m"
      size="mini"
      :placeholder="$t('el.input.placeholder')"
      @input="searchSchool"
      @keyup.enter.native="_handleEnter(selectIndex)"
      @keyup.up.native="_handleUp"
      @keyup.down.native="_handleDown"
    />
methods: {
    _handleUp(){
            //  實現對樣式的替換
            this.selectIndex = this.selectIndex === 0 ? this.authoritysList.length - 1 : this.selectIndex - 1;

            let selectNum = this.selectIndex + 1;
            let schoolMenuList = document.getElementById("school-menu-list");
            let intervalTop = schoolMenuList.scrollTop;

            //  實現在用戶操作是,滾輪隨著上下移的動
            if (selectNum * 35 <= intervalTop){

                schoolMenuList.scrollTop = (selectNum - 1) * 35;

            } else if (selectNum * 35 <= intervalTop + schoolMenuList.offsetHeight){

                schoolMenuList.scrollTop = intervalTop;

            } else if (selectNum * 35 > intervalTop){

                schoolMenuList.scrollTop = selectNum * 35;
            }

        },
    _handleDown(){
            this.selectIndex = this.selectIndex < this.authoritysList.length - 1 ? this.selectIndex + 1 : 0;

            let selectNum = this.selectIndex + 1;
            let schoolMenuList = document.getElementById("school-menu-list");
            let intervalTop = schoolMenuList.scrollTop;

            if (selectNum * 35 <= intervalTop){

                schoolMenuList.scrollTop = (selectNum - 1) * 35;

            } else if (selectNum * 35 <= intervalTop + schoolMenuList.offsetHeight){

                schoolMenuList.scrollTop = intervalTop;

            } else if (selectNum * 35 > intervalTop){

                schoolMenuList.scrollTop = selectNum * 35 - schoolMenuList.offsetHeight;
            }

        }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末牲剃,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子颠黎,更是在濱河造成了極大的恐慌滞项,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件过椎,死亡現場離奇詭異戏仓,居然都是意外死亡亡鼠,警方通過查閱死者的電腦和手機敷待,發(fā)現死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勾哩,“玉大人,你說我怎么就攤上這事思劳》列桑” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵威兜,是天一觀的道長森瘪。 經常有香客問我牡属,道長扼睬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任措伐,我火速辦了婚禮军俊,結果婚禮上,老公的妹妹穿的比我還像新娘粪躬。我一直安慰自己担败,他們只是感情好镰官,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布泳唠。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拓哺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天闲孤,我揣著相機與錄音础淤,去河邊找鬼。 笑死币砂,一個胖子當著我的面吹牛,可吹牛的內容都是我干的决摧。 我是一名探鬼主播凑兰,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姑食!你這毒婦竟也來了?” 一聲冷哼從身側響起则拷,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤曹鸠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后彻桃,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡眠屎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年组力,在試婚紗的時候發(fā)現自己被綠了抖拴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡阿宅,死狀恐怖,靈堂內的尸體忽然破棺而出洒放,到底是詐尸還是另有隱情蛉鹿,我是刑警寧澤往湿,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站他膳,受9級特大地震影響绒窑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜些膨,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肢预。 院中可真熱鬧洼哎,春花似錦烫映、人聲如沸谱净。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽李请。三九已至,卻和暖如春导盅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背白翻。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岛琼,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓熙涤,卻偏偏與公主長得像困檩,于是被迫代替她去往敵國和親祠挫。 傳聞我的和親對象是個殘疾皇子悼沿,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內容