当前位置: 首页 > ai >正文

vue实现点击按钮input保持聚焦状态

主要功能:

  1. 点击"停顿"按钮切换对话框显示状态
  2. 输入框聚焦时保持状态
  3. 点击对话框外的区域自动关闭
    在这里插入图片描述

以下是代码版本:

<template><div class="input-container"><el-inputv-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>

主要优点:

  1. 更好的结构

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

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

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

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

    • 使用整个容器检查替代具体元素检查
http://www.xdnf.cn/news/11790.html

相关文章:

  • Oracle实用参考(13)——Oracle for Linux静默安装(1)
  • springboot 微服务 根据tomcat maxthread 和 等待用户数量,达到阈值后,通知用户前面还有多少用户等待,请稍后重试
  • 低代码采购系统搭建:鲸采云+能源行业订单管理自动化案例
  • Electron打包前端和后端为exe
  • el-table 树形数据,子行数据可以异步加载
  • 破解HTTP无状态:基于Java的Session与Cookie协同工作指南
  • 618浴室柜推荐,小户型浴室柜怎么选才省心?
  • 江科大睡眠,停止,待机模式hal库实现
  • MySQL范式和反范式
  • Windows安装docker desktop
  • 【使用JAVA调用deepseek】实现自能回复
  • Devops自动化运维---py基础篇一
  • Appium如何支持ios真机测试
  • CppCon 2014 学习:Mixins for C++
  • 基于行为分析的下一代安全防御指南
  • webPack基本使用步骤
  • Cocos creator游戏开发面试题
  • Windows+Linux安装redis教程
  • Qt 中,设置事件过滤器(Event Filter)的方式
  • Java面试专项一-准备篇
  • 【2025】使用docker compose一键部署项目到服务器(4)
  • 【Web应用】若依框架:基础篇14 源码阅读-后端代码分析-课程管理模块前后端代码分析
  • WINDOWS11安装ipython3
  • sql入门语句-案例
  • ‘pnpm‘ 不是内部或外部命令,也不是可运行的程序
  • DrissionPage调试工具:网页自动化与数据采集的革新利器
  • Kafka消息队列
  • 洛谷 P1758 [NOI2009] 管道取珠(DP)
  • 小型民用AUV用途与研究
  • Linux RPC 和 NFS 教程