vue实现点击按钮input保持聚焦状态的示例代码

 更新时间:2025年06月06日 08:55:23   作者:雅痞yuppie  
这篇文章主要介绍了vue实现点击按钮input保持聚焦状态,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

主要功能:

  • 点击"停顿"按钮切换对话框显示状态
  • 输入框聚焦时保持状态
  • 点击对话框外的区域自动关闭

以下是代码版本:

<template>
  <div class="input-container">
    <el-input
      v-model="input"
      style="width: 240px"
      placeholder="Please input"
      ref="inputRef"
      class="input-ref"
      @focus="handleFocus"
    />
    <el-button 
      class="input-btn" 
      @click.stop="toggleDialog" 
      :disabled="!isFocused"
      :type="showDialog ? 'primary' : ''"
    >
      停顿 {{ isFocused ? 'ON' : 'OFF' }}
    </el-button>
    <transition name="fade">
      <div v-if="showDialog" class="dialog-wrapper" @click.stop>
        <dl class="dialog-content">
          <dt>插入内容</dt>
          <dd @click="closeDialog" style="cursor: pointer">插入btn</dd>
        </dl>
      </div>
    </transition>
  </div>
</template>
<script lang="ts" setup>
import { ref, onMounted, onBeforeUnmount } from "vue";
const showDialog = ref(false);
const input = ref("");
const inputRef = ref<HTMLInputElement>();
const isFocused = ref(false);
const handleDocumentClick = (e: MouseEvent) => {
  const target = e.target as HTMLElement;
  const clickedInside = target.closest(".input-container");
  if (!clickedInside && isFocused.value) {
    closeDialog();
  }
};
onMounted(() => {
  document.addEventListener("click", handleDocumentClick);
});
onBeforeUnmount(() => {
  document.removeEventListener("click", handleDocumentClick);
});
function closeDialog() {
  showDialog.value = false;
  if (inputRef.value) {
    inputRef.value.blur();
  }
  isFocused.value = false;
}
function handleFocus() {
  isFocused.value = true;
}
function toggleDialog() {
  showDialog.value = !showDialog.value;
  if (inputRef.value) {
    inputRef.value.focus();
  }
}
</script>
<style scoped>
.input-container {
  position: relative;
  display: inline-block;
}
.dialog-wrapper {
  position: absolute;
  top: 100%;
  left: 0;
  margin-top: 8px;
  padding: 12px;
  background: white;
  border: 1px solid #ebeef5;
  border-radius: 4px;
  box-shadow: 0 2px 12px 0 rgba(0,0,0,0.1);
  z-index: 2000;
}
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.2s;
}
.fade-enter-from, .fade-leave-to {
  opacity: 0;
}
</style>

主要优点:

更好的结构

  • 添加了容器元素 .input-container 方便定位
  • 使用 transition 实现平滑的对话框动画

安全的实现

  • 添加了类型定义 inputRef.value 为 HTMLInputElement
  • 使用生命周期钩子管理事件监听
  • 添加了点击对话框防止事件冒泡的 @click.stop

用户体验

  • 按钮状态更直观 (添加了 primary 样式)
  • 添加了过渡动画
  • 对话框样式更美观

代码组织

  • 重命名方法更语义化 (toggleDialog 替代 [pauseInput]
  • 分离了关闭逻辑到 closeDialog 方法

DOM 检查优化

  • 使用整个容器检查替代具体元素检查

到此这篇关于vue实现点击按钮input保持聚焦状态的文章就介绍到这了,更多相关vue实现点击按钮input保持聚焦状态内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue 修改 data 数据问题并实时显示操作

    vue 修改 data 数据问题并实时显示操作

    这篇文章主要介绍了vue 修改 data 数据问题并实时显示操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Vue自定义加水波纹效果指令实例代码

    Vue自定义加水波纹效果指令实例代码

    这篇文章主要给大家介绍了关于Vue自定义加水波纹效果指令的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Vue使用Axios请求拦截器的案例详解

    Vue使用Axios请求拦截器的案例详解

    在Vue项目中,Axios是一个非常流行的HTTP客户端,用于发送请求和接收响应,Axios拦截器是Axios的一个强大功能,它允许你在请求发送之前和响应返回之后对请求和响应进行处理和拦截,本文将结合实际案例,详细介绍如何在Vue中使用Axios拦截器,需要的朋友可以参考下
    2024-12-12
  • antd vue表格可编辑单元格以及求和实现方式

    antd vue表格可编辑单元格以及求和实现方式

    这篇文章主要介绍了antd vue表格可编辑单元格以及求和实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Vue源码解析之数据响应系统的使用

    Vue源码解析之数据响应系统的使用

    这篇文章主要介绍了Vue源码解析之数据响应系统的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue封装实现自动循环滚动的列表

    vue封装实现自动循环滚动的列表

    在做数据大屏开发的过程中,经常出现需要对列表进行自动滚动的需求,所以本文就来为大家介绍一下如何利用vue封装一个自动循环滚动的列表吧
    2023-09-09
  • Vue 拦截器对token过期处理方法

    Vue 拦截器对token过期处理方法

    下面小编就为大家分享一篇Vue 拦截器对token过期处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • vue中keep-alive组件实现多级嵌套路由的缓存

    vue中keep-alive组件实现多级嵌套路由的缓存

    本文主要介绍了vue中keep-alive组件实现多级嵌套路由的缓存,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 深入了解Vue3中侦听器watcher的实现原理

    深入了解Vue3中侦听器watcher的实现原理

    在平时的开发工作中,我们经常使用侦听器帮助我们去观察某个数据的变化然后去执行一段逻辑。在 Vue.js 2.x 中,你可以通过 watch 选项去初始化一个侦听器,称作 watcher。本文将详细为大家介绍一下侦听器的实现原理,需要的可以参考一下
    2022-04-04
  • vue使用keep-alive保持滚动条位置的实现方法

    vue使用keep-alive保持滚动条位置的实现方法

    这篇文章主要介绍了vue使用keep-alive保持滚动条位置的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论