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

Vue3+Ts封装input组件时遇到的问题

使用input事件监听输入框变化时,如果当前使用的输入法是中文,他也会触发input事件,正常来说,中文没有输入完毕是不用触发事件的。

控制台打印时发现:

那么我们应该怎么去规避这件事呢?

其实input还有几个事件:

  • compositionstart:事件在用户开始使用输入法输入时触发。
  • onCompositionUpdate:事件在用户正在使用输入法输入时触发
  • compositionend: 事件在用户完成使用输入法输入时触发

 我们可以建立一个全局变量

const isComposing = ref(false);

在handleCompositionStart和handleCompositionEnd的事件中更改这个全局变量

const handleCompositionStart = () => {isComposing.value = true;
};const handleCompositionEnd = (event: Event) => {isComposing.value = false;
};

在input事件中判断是否是中文输入法输入中的状态

const input = (event: Event) => {if (isComposing.value) {return;}const value = (event.target as HTMLInputElement).value;emit("update:modelValue", value);emit("change", value); // 添加此行代码
};

最后在handleCompositionEnd事件中添加如下代码:

const handleCompositionEnd = (event: Event) => {isComposing.value = false;const value = (event.target as HTMLInputElement).value;emit("update:modelValue", value);emit("change", value);
};

最后即可解决这个问题!

最后附上我封装的input组件(若觉得组件功能不完善,可以自行扩展组件)

MyInput.vue

<template><div class="input-wrapper" :class="{ 'is-focused': isFocused }"><span class="prefix"><slot name="prefix"></slot></span><input:type="type"@input="input":placeholder="placeholder":disabled="disabled":readonly="readonly":maxlength="maxlength"@focus="handleFocus"@blur="handleBlur"@compositionstart="handleCompositionStart"@compositionend="handleCompositionEnd"/><span class="suffix"><slot name="suffix"></slot></span></div>
</template><script setup lang="ts">
import { ref } from "vue";const isFocused = ref(false);
const isComposing = ref(false);const props = defineProps<{type?: string;modelValue: string;placeholder?: string;disabled?: boolean;readonly?: boolean;maxlength?: number;
}>();const handleFocus = () => {isFocused.value = true;
};const handleBlur = () => {isFocused.value = false;
};const emit = defineEmits<{(e: "update:modelValue", value: string): void;(e: "change", value: string): void;
}>();// 监听是否是中文输入事件
const handleCompositionStart = () => {isComposing.value = true;
};const handleCompositionEnd = (event: Event) => {isComposing.value = false;const value = (event.target as HTMLInputElement).value;emit("update:modelValue", value);emit("change", value);
};const input = (event: Event) => {if (isComposing.value) {return;}const value = (event.target as HTMLInputElement).value;emit("update:modelValue", value);emit("change", value);
};
</script><style scoped>
.input-wrapper {display: flex;align-items: center;justify-content: center;padding: 1px 11px;border-radius: 10px;box-shadow: 0 0 0 1px #b5b5b5 inset;
}
.input-wrapper.is-focused {box-shadow: 0 0 0 2px #2478f2 inset;
}
input {width: 100%;flex-grow: 1;padding: 0;outline: 0;border: none;background: 0 0;box-sizing: border-box;outline: 0;font-size: 14px;line-height: 30px;
}input:disabled {background-color: #000000;cursor: not-allowed;
}input[readonly] {background-color: #000000;cursor: default;
}
.prefix {margin-right: 8px;
}
.suffix {margin-left: 8px;
}
</style>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#高级进阶---关于插件开发(初版)
  • 在Ubuntu 16.04上安装MongoDB的方法
  • MySQL多表查询,找出包含全部标签的邮件,包含任意标签的邮件
  • 【Go - 特殊导入包方式 . 和 _】
  • mybatis-plus中Swagger 模式和Kotlin 模式是什么?
  • matlab 计算矩阵元素的标准差
  • 条件拼接 - 根据入参生成where条件
  • 15 种高级 RAG 技术 ——从预检索到生成
  • zabbix对接Grafana
  • turtlebot 测试 Gazebo Harmonic ROS Jazzy
  • 新安装的mariadb 对应的my.cnf 对应的配置
  • 配置PXE预启动执行环境:使用PXE装机服务器网络引导装机
  • uni-app - - - - - 自定义状态栏
  • 基于STM32与INA219的智能充电桩方案:实时电压监测、费用计算及MySQL云端数据管理的全面技术解析(代码示例)
  • 网络应用层之(2)DNS协议
  • 10个确保微服务与容器安全的最佳实践
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Facebook AccountKit 接入的坑点
  • Java Agent 学习笔记
  • Java应用性能调优
  • k8s如何管理Pod
  • leetcode46 Permutation 排列组合
  • nfs客户端进程变D,延伸linux的lock
  • Node 版本管理
  • Objective-C 中关联引用的概念
  • Python学习之路16-使用API
  • 不上全站https的网站你们就等着被恶心死吧
  • 前端存储 - localStorage
  • 前端性能优化——回流与重绘
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • Android开发者必备:推荐一款助力开发的开源APP
  • elasticsearch-head插件安装
  • Linux权限管理(week1_day5)--技术流ken
  • 大数据全解:定义、价值及挑战
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #QT项目实战(天气预报)
  • (35)远程识别(又称无人机识别)(二)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (论文阅读11/100)Fast R-CNN
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (三)mysql_MYSQL(三)
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)Google的Objective-C编码规范
  • (转)linux 命令大全
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET程序员迈向卓越的必由之路
  • .NET实现之(自动更新)
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .NET正则基础之——正则委托
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • [ C++ ] 类和对象( 下 )