Vue3 动态设置 ref

介绍

在一些场景,ref设置是未知的需要根据动态数据来决定,如表格中的input框需要我们主动聚焦,就需要给每一个input设置一个ref,进而进行聚焦操作。

Demo

点击下面截图中的编辑按钮,自动聚焦到相应的输入框中。

javascript 复制代码
<template>
  <!-- 动态ref -->
  <div class="test_ref">
    <div v-for="item in 9" :key="item">
      <span>{{ item }}</span>

      <!-- 动态设置ref -->
      <el-input
        v-model="inputVal"
        placeholder="Please input"
        :ref="(el:refItem) => handleSetInputMap(el, item)"
      />

      <el-button type="primary" :icon="Edit" @click="handleEdit(item)" />
    </div>
  </div>
</template>

<script lang="ts" setup>
import { ref } from "vue";
import { Edit } from "@element-plus/icons-vue";
import { ComponentPublicInstance } from "vue";
type refItem = Element | ComponentPublicInstance | null;
const inputVal = ref();
const inputRefMap = ref({});

/** 编辑 */
const handleEdit = (item: number) => {
  // 若输入框此时还没有渲染出来,如先隐藏再触发显示 需要使用nextTick进行聚焦
  inputRefMap.value[`Input_Ref_${item}`].input.focus();
};

/** 动态设置Input Ref */
const handleSetInputMap = (el: refItem, item: number) => {
  if (el) {
    inputRefMap.value[`Input_Ref_${item}`] = el;
  }
};
</script>

<style lang="scss" scoped>
.test_ref {
  padding: 50px;
  > div {
    width: 300px;
    margin: 0 auto;
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 20px;
    margin-bottom: 10px;
  }
}
</style>

效果

相关推荐
是罐装可乐12 小时前
前端架构知识体系:通过发布-订阅者模式解耦路由和请求
前端·架构·vue·路由
我叫张小白。14 小时前
Vue3 v-model:组件通信的语法糖
开发语言·前端·javascript·vue.js·elementui·前端框架·vue
IT教程资源D15 小时前
[N_130]基于springboot,vue校园社团管理系统
mysql·vue·前后端分离·springboot社团
小晗同学16 小时前
创建第一个Nuxt v4.x 应用
vue·vue3·nuxt·prettier·nuxt 4.x
by__csdn16 小时前
Ajax与Axios终极对比指南全方位对比解析
前端·javascript·ajax·okhttp·typescript·vue·restful
by__csdn16 小时前
Vue3+Axios终极封装指南
前端·javascript·vue.js·http·ajax·typescript·vue
不会写DN17 小时前
如何实现UniApp登录拦截?
前端·javascript·vue.js·typescript·uni-app·vue
by__csdn17 小时前
Axios封装实战:Vue2高效HTTP请求
前端·javascript·vue.js·ajax·vue·css3·html5
by__csdn1 天前
Vue2纯前端图形验证码实现详解+源码
前端·javascript·typescript·vue·状态模式·css3·canva可画
czc1311 天前
4K QPS 博客社区:CCBlog 全栈开源,Springboot项目实战,Docker一键部署
spring boot·redis·docker·开源·vue·rabbitmq