Vue3 + TypeScript + Element Plus + el-input 輸入框列表按回車聚焦到下一行

應用效果:從第一行輸入1,按回車,聚焦到第二行輸入2,按回車,聚焦到第三行……

一、通過元素 id,聚焦到下一行的輸入框

關鍵技術點:

1、動態設置元素 id 屬性為::id="`input-apply-amount-${(option as IReagentOption).id}`"

2、設置回車監聽:@keyup.enter.native="onEnterPressDown((option as IReagentOption).id)"

                <el-input......:id="`input-apply-amount-${(option as IReagentOption).id}`"@keyup.enter.native="onEnterPressDown((option as IReagentOption).id)" />

3、通過 document.getElementById 獲取到指定元素

4、focus 和?select,聚焦、全選

// 通過元素 id,聚焦到下一行的輸入框
const focusNextRowByElementId = (objId: number) => {// 通過 objId 獲取當前行索引let currentRowIndex = selectedOptionIds.value.indexOf(objId);// 下一行的輸入框let nextInput: HTMLInputElement;if (currentRowIndex + 1 < selectedOptionIds.value.length) {// 下一行索引的 objIdlet nextRowObjId = selectedOptionIds.value[currentRowIndex + 1];nextInput = document.getElementById(`input-apply-amount-${nextRowObjId}`) as HTMLInputElement;} else {// 最后一行聚焦到申領用途輸入框nextInput = document.getElementById("transfer-right-footer-purpose-input") as HTMLInputElement;}nextInput?.focus();nextInput?.select();
};

二、通過元素 ref,聚焦到下一行的輸入框

關鍵技術點:

1、動態設置元素 ref 屬性為::ref="`input-apply-amount-${(option as IReagentOption).id}`"

2、設置回車監聽:@keyup.enter.native="onEnterPressDown((option as IReagentOption).id)"

                <el-input......:ref="`input-apply-amount-${(option as IReagentOption).id}`"@keyup.enter.native="onEnterPressDown((option as IReagentOption).id)" />

3、通過?getCurrentInstance() 獲取當前組件實例,再通過?refs 獲取到元素列表

4、focus 和?select,聚焦、全選

<script setup lang="ts" name="ReagentApplyDialog">
......
import { getCurrentInstance } from "vue";// 當前組件實例,相當 vue2 的this
const thisInstance = getCurrentInstance();// 通過元素 ref,聚焦到下一行的輸入框
const focusNextRowByElementRef = (objId: number) => {if (!thisInstance) return;// 獲取輸入框實例 Recordlet refs = thisInstance.refs as Record<string, HTMLInputElement>;// 通過 objId 獲取當前行索引let currentRowIndex = selectedOptionIds.value.indexOf(objId);if (currentRowIndex + 1 < selectedOptionIds.value.length) {// 下一行索引的 objIdlet nextRowObjId = selectedOptionIds.value[currentRowIndex + 1];// 聚焦到下一行的輸入框refs[`input-apply-amount-${nextRowObjId}`].focus();refs[`input-apply-amount-${nextRowObjId}`].select();} else {// 最后一行聚焦到申領用途輸入框refs["transfer-right-footer-purpose-input"].focus();refs["transfer-right-footer-purpose-input"].select();}
};
......
</script>

實例完整代碼:

<script setup lang="ts" name="ReagentApplyDialog">
......
import { getCurrentInstance, nextTick, onMounted, ref, watch } from "vue";// 當前組件實例,相當 vue2 的this
const thisInstance = getCurrentInstance();// 按回車,申領數量輸入框按回車
const onEnterPressDown = (objId: number) => {// 奇數if (objId % 2 === 1) {// 通過元素 id,聚焦到下一行的輸入框focusNextRowByElementId(objId);}// 偶數else {// 通過元素 ref,聚焦到下一行的輸入框focusNextRowByElementRef(objId);}
};// 通過元素 id,聚焦到下一行的輸入框
const focusNextRowByElementId = (objId: number) => {// 通過 objId 獲取當前行索引let currentRowIndex = selectedOptionIds.value.indexOf(objId);// 下一行的輸入框let nextInput: HTMLInputElement;if (currentRowIndex + 1 < selectedOptionIds.value.length) {// 下一行索引的 objIdlet nextRowObjId = selectedOptionIds.value[currentRowIndex + 1];nextInput = document.getElementById(`input-apply-amount-${nextRowObjId}`) as HTMLInputElement;} else {// 最后一行聚焦到申領用途輸入框nextInput = document.getElementById("transfer-right-footer-purpose-input") as HTMLInputElement;}nextInput?.focus();nextInput?.select();
};// 通過元素 ref,聚焦到下一行的輸入框
const focusNextRowByElementRef = (objId: number) => {if (!thisInstance) return;// 獲取輸入框實例 Recordlet refs = thisInstance.refs as Record<string, HTMLInputElement>;// 通過 objId 獲取當前行索引let currentRowIndex = selectedOptionIds.value.indexOf(objId);if (currentRowIndex + 1 < selectedOptionIds.value.length) {// 下一行索引的 objIdlet nextRowObjId = selectedOptionIds.value[currentRowIndex + 1];// 聚焦到下一行的輸入框refs[`input-apply-amount-${nextRowObjId}`].focus();refs[`input-apply-amount-${nextRowObjId}`].select();} else {// 最后一行聚焦到申領用途輸入框refs["transfer-right-footer-purpose-input"].focus();refs["transfer-right-footer-purpose-input"].select();}
};
......
</script><template>
......<el-transfer......><!-- 自定義列表數據項的內容 --><template #default="{ option }">......<el-inputv-if="selectedOptionIds.includes((option as IReagentOption).id)":ref="`input-apply-amount-${(option as IReagentOption).id}`":id="`input-apply-amount-${(option as IReagentOption).id}`"class="input-apply-amount"style="width: 85px; text-align: center"v-model="(option as IReagentOption).applyAmount"placeholder="輸入申領數量"size="small"clearable@input="(option as IReagentOption).applyAmount = Number(formatToNumber($event, 0))"@keyup.enter.native="onEnterPressDown((option as IReagentOption).id)" />......</template></el-transfer>
......
</template>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84137.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84137.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84137.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FramePack 全面測評:革新視頻生成體驗

在 AI 視頻生成領域&#xff0c;FramePack 自問世便備受矚目&#xff0c;它憑借獨特的技術架構&#xff0c;號稱能打破傳統視頻生成對高端硬件的依賴&#xff0c;讓普通電腦也能產出高質量視頻。此次測評&#xff0c;我們將全方位剖析 FramePack&#xff0c;探究它在實際應用中…

html中的table標簽以及相關標簽

表格標簽可以通過指定的標簽完成數據展示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格標簽</title> </head> <body><table border"2"><!-- tr是表行 r…

springboot+vue3+vue-simple-uploader輕松實現大文件分片上傳Minio

最近在寫視頻課程的上傳&#xff0c;需要上傳的視頻幾百MB到幾個G不等&#xff0c;普通的上傳都限制了文件的大小&#xff0c;況且上傳的文件太大的話會超時、異常等。所以這時候需要考慮分片上傳了&#xff0c;把需要上傳的視頻分成多個小塊上傳到&#xff0c;最后再合并成一個…

AI 重構代碼實戰:如何用飛算 JavaAI 快速升級遺留系統?

在企業數字化進程中&#xff0c;遺留系統如同陳舊的基礎設施&#xff0c;雖承載著重要業務邏輯&#xff0c;但因技術落后、架構復雜&#xff0c;升級維護困難重重。飛算 JavaAI 的出現&#xff0c;為遺留系統的二次開發帶來了新的轉機&#xff0c;其基于智能分析與關聯項目的技…

鴻蒙運動開發實戰:打造專屬運動視頻播放器

##鴻蒙核心技術##運動開發##Media Kit&#xff08;媒體服務&#xff09;# 在當今數字化時代&#xff0c;運動健身已經成為許多人生活的一部分。今天我將在應用中添加視頻播放器&#xff0c;幫助用戶在運動前、運動后更好地進行熱身和拉伸。這篇文章將從代碼核心點入手&#xf…

一個包含15個界面高質量的電商APP客戶端UI解決方案

一個包含15個界面高質量的電商APP客戶端UI解決方案 您可以將其用于電商APP應用項目。包含一系列完整的界面設計元素&#xff0c;包括歡迎頁、登錄、注冊、首頁、產品分類、產品詳情、尺碼選擇、購物車、訂單、支付&#xff0c;覆蓋電商APP的大部分界面。每個部分都精心設計&…

執行 PGPT_PROFILES=ollama make run下面報錯,

執行 PGPT_PROFILESollama make run 下面報錯&#xff0c; File "/home/powersys/.cache/pypoetry/virtualenvs/private-gpt-ZIwX6JeM-py3.11/lib/python3.11/site-packages/qdrant_client/http/api_client.py", line 108, in send_inner raise ResponseHandling…

【Docker基礎】Docker核心概念:命名空間(Namespace)之User詳解

目錄 引言 1 基礎概念回顧 1.1 命名空間概述 1.2 命名空間的類型 2 User命名空間詳解 2.1 基本概念 2.2 工作原理 User命名空間的工作流程 User命名空間架構 3 應用場景 4 配置與使用 5 總結 引言 隨著容器化技術的廣泛應用&#xff0c;Docker已成為現代軟件開發、…

DIDCTF-應急響應

前言 最近在學長分享應急響應與電子取證的知識&#xff0c;又恰逢期末周沒有課&#xff0c;記錄自己在取證道路的成長。 linux-basic-command 下載附件&#xff0c;得到Apache 服務器訪問日志文件&#xff0c;根據題目要求找出排名前五的ip&#xff0c;題目提示寫腳本&#…

MybatisPlus深入學習

今天深入的學習了一下mp&#xff0c;從頭開始學習&#xff01;哈哈哈哈哈 本節只講干的&#xff01; 我們上來先看一段代碼&#xff0c;不知道你能不能看明白&#xff01; package com.itheima.mp.mapper;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapp…

安卓9.0系統修改定制化____安卓9.0系統精簡 了解系統app組件構成 系統app釋義 常識篇 一

在安卓 9.0 系統的使用過程中,許多用戶都希望能夠對系統進行深度定制,讓手機系統更加貼合個人需求。而系統精簡作為定制化的重要一環,不僅能夠釋放手機存儲空間,還能提升系統運行速度,優化資源分配。想要安全有效地對安卓 9.0 系統進行精簡,深入了解系統 app 組件的構成是…

2.4 Windows Conan編譯FFmpeg 4.4.1

Conan的安裝與使用參考之前的文章&#xff1a;Conan簡單使用 一、Conan編譯ffmpeg 1.1 Conan的配置文件 創建配置文件&#xff1a;C:\Users\wujh\.conan2\profiles\vs2019 [settings] archx86_64 build_typeRelease compilermsvc compiler.cppstd14 compiler.runtimedynami…

社群經濟視域下開源鏈動2+1模式與AI智能名片賦能S2B2C商城小程序的創新發展研究

摘要&#xff1a;在數字經濟蓬勃發展的背景下&#xff0c;社群經濟作為連接用戶情感與價值反哺的新型經濟形態&#xff0c;正通過技術創新與模式重構實現深度演化。本文基于社群經濟“創造有價值連接”的本質特征&#xff0c;系統探討“開源鏈動21模式”“AI智能名片”與“S2B2…

【計算機網絡】——reactor模式高并發網絡服務器設計

&#x1f525;個人主頁&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收錄專欄&#x1f308;&#xff1a;計算機網絡 &#x1f339;往期回顧&#x1f339;&#xff1a;【計算機網絡】非阻塞IO——epoll 編程與ET模式詳解——(easy)高并發網絡服務器設計 &#x1f516;流水不…

Uniapp跨端兼容性全方位解決方案

在當今多端融合的移動互聯網時代&#xff0c;Uniapp作為一款優秀的跨平臺開發框架&#xff0c;已成為許多開發者的首選。然而&#xff0c;真正的挑戰在于如何優雅地處理不同平臺之間的差異。本文將全面剖析Uniapp跨端開發的兼容性處理方案&#xff0c;提供從基礎到高級的完整解…

迅為RK3576開發板NPUrknn-toolkit2環境搭建和使用docker環境安裝

開發板采用核心板底板結構&#xff0c;在我們的資料里提供了底板的原理圖工程以及PCB工程&#xff0c;可以實現真正意義上的裁剪、定制屬于自己的產品&#xff0c;滿足更多應用場合。 迅為針對RK3576開發板整理出了相應的開發流程以及開發中需要用到的資料&#xff0c;并進行詳…

什么是 OpenFeigin ?微服務中的具體使用方式

什么是Feign&#xff1f; Feign 是一種聲明式的 HTTP 客戶端框架&#xff0c;主要用于簡化微服務架構中服務之間的遠程調用&#xff0c;也可以通過定義接口和注解的方式調用遠程服務&#xff0c;無需手動構建 HTTP 請求或解析響應數據。Spring Cloud 對 Feign 進行了增強&…

對抗性提示:進階守護大語言模型

人工智能模型正快速進化 —— 變得更具幫助性、更流暢&#xff0c;并且更深入地融入我們的日常生活和商業運營中。但隨著其能力的提升&#xff0c;風險也在增加。在維護安全可信的人工智能方面&#xff0c;最緊迫的挑戰之一是對抗性提示&#xff1a;這是一種微妙且通常富有創意…

運營商頻段

以下是三大運營商&#xff08;中國移動、中國電信、中國聯通&#xff09;及中國廣電的 5G 主要頻段 及其所屬運營商的整理表格&#xff1a; 運營商頻段上行頻率 (MHz)下行頻率 (MHz)帶寬備注廣電n28703-733758-788230MHz移動共享n794900-4960-60MHz-移動n412515-2675-160MHz-n7…

項目拓展-Apache對象池,對象池思想結合ThreadLocal復用日志對象

優化日志對象創建以及日志對象復用 日志對象上下文實體類 traceId 請求到達時間戳 請求完成時間戳 請求總共耗費時長 get/post/put/delete請求方式 Http狀態碼 原始請求頭中的所有鍵值對 請求體內容 響應體內容 失敗Exception信息詳細記錄 是否命中緩存 package c…