输入框input事件compositionstart和compositionend的妙用

news2024/11/28 6:35:13

现象:

在将输入输入法切换到中文的时候,在打拼音的过程中也会触发oninput事件,如下:

const Demo=()=>{
  const [value,setValue]=useState("");
  return (
    <>
      <input onInput={(e)=>{
        console.log("value:",e.target.value)
        setValue(e.target.value)
      }}/>
      <span>{value}</span>
    </>
  )
}

在这里插入图片描述

这样带来的一个问题就是在输入中文的过程中输入框可能会抖动,如何解这个问题呢
input提供了compositionstart和compositionend两个事件,参考MDN链接。

在这里插入图片描述

解法:

对上述代码进行优化

const Demo = () => {
  const [value, setValue] = useState("");
  return (
    <>
      <input
        onCompositionStart={(e) => {
          console.log("onCompositionStart")
          e.target.composing = true
        }}
        onCompositionEnd={(e) => {
          console.log("onCompositionEnd",e.target.value)
          if(!e.target.composing)return;
          (e.target.composing = false)
          setValue(e.target.value);
        }}
        onInput={(e) => {
          if(e.target.composing) return;
          console.log("value:", e.target.value);
          setValue(e.target.value);
        }}
      />
      <span>{value}</span>
    </>
  );
};

在这里插入图片描述
在这里插入图片描述
这样就完全解决了中文输入的时候输入框问题。


以上解决思路其实来源于vue源码v-model的指令实现的时候对输入框事件做了的处理

const directive = {
  inserted (el, binding, vnode, oldVnode) {
    if (vnode.tag === 'select') {
      // #6903
      if (oldVnode.elm && !oldVnode.elm._vOptions) {
        mergeVNodeHook(vnode, 'postpatch', () => {
          directive.componentUpdated(el, binding, vnode)
        })
      } else {
        setSelected(el, binding, vnode.context)
      }
      el._vOptions = [].map.call(el.options, getValue)
    } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {
      el._vModifiers = binding.modifiers
      if (!binding.modifiers.lazy) {
        el.addEventListener('compositionstart', onCompositionStart)
        el.addEventListener('compositionend', onCompositionEnd)
        // Safari < 10.2 & UIWebView doesn't fire compositionend when
        // switching focus before confirming composition choice
        // this also fixes the issue where some browsers e.g. iOS Chrome
        // fires "change" instead of "input" on autocomplete.
        el.addEventListener('change', onCompositionEnd)
        /* istanbul ignore if */
        if (isIE9) {
          el.vmodel = true
        }
      }
    }
  },
function onCompositionStart (e) {
  e.target.composing = true
}
 
function onCompositionEnd (e) {
  // prevent triggering an input event for no reason
  if (!e.target.composing) return
  e.target.composing = false
  trigger(e.target, 'input')
}
 
function trigger (el, type) {
  const e = document.createEvent('HTMLEvents')
  e.initEvent(type, true, true)
  el.dispatchEvent(e)
}

由此看出鱿大大,在写vue框架的时候是多么细心,这些细节都考虑到了

参考链接:
输入框事件compositionstart和compositionend的妙用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【多种优化算法比较】混沌引力搜索算法(CGSA)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

byte字节值与ASCII表中char之间的转换

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

三款小游戏功能:让孩子在运动中享受智力挑战

最近看到一款很有趣的小玩具&#xff0c;是一种专门为儿童设计的益智训练器&#xff0c;功能很丰富&#xff0c;可以为孩子带来不少乐趣&#xff0c;起到一些体能和智力训练的作用。这款叫做益智感统摸高训练器的小工具&#xff0c;主要功能就是帮助儿童进行摸高训练&#xff0…

C/C++内存管理详解

去年的今日&#xff0c;博主第一次发文&#xff0c;那时初出茅庐&#xff0c;没什么经验。时隔一年&#xff0c;更加优质的博文献上&#xff0c;希望可以帮助到更多的人❤️❤️❤️ 文章目录 &#x1f4ac; 前言一、C/C内存分布二、C语言中动态内存管理方式三、C内存管理方式1…

AlexNet实战

前言&#xff1a;之前学了挺多卷积神经网络模型&#xff0c;但是都只停留在概念。代码都没自己敲过&#xff0c;肯定不行&#xff0c;而且这代码也很难很多都看不懂。所以想着先从最先较简单的AlexNet开始敲。不过还是好多没搞明白&#xff0c;之后逐一搞清楚。 文章目录 Alex…

Spark弹性分布式数据集

1. Spark RDD是什么 RDD&#xff08;Resilient Distributed Dataset&#xff0c;弹性分布式数据集&#xff09;是一个不可变的分布式对象集合&#xff0c;是Spark中最基本的数据抽象。在代码中RDD是一个抽象类&#xff0c;代表一个弹性的、不可变、可分区、里面的元素可并行计…

BottomNavigationView(自带角标)无法添加角标的解决问题

android studio的报错提示&#xff1a;java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant). 解决&#xff0c;改主题&#xff1a;

跨境平台做测评、采退、Lu卡、lu货要怎么做安全?

大家好&#xff0c;我是珑哥测评&#xff0c;今天和大家聊聊比较小众的圈子&#xff0c;也就是测评衍生出来的分支&#xff0c;采购和退款。因为最近也有很多客户咨询这个问题&#xff0c;由于沃尔玛风控升级了&#xff0c;很多客户下不成功的问题。 大家都知道无论是做测评还是…

BPM流程引擎适用于哪些类型企业管理系统

看到标题的童鞋们&#xff0c;估计在搜索办公软件系统时都会留意到BPM&#xff0c;那BPM到底是何方神圣&#xff1f;它与管理系统有什么区别呢&#xff1f;今天我们一一解答。 什么是BPM&#xff1f; BPM&#xff08;即业务流程管理&#xff09;&#xff0c;是企业信息化发展的…

[网络] ifconfig down掉的网口,插上网线网口灯依然亮?

1、软硬件环境 环境1&#xff1a; 硬件&#xff1a; 飞腾E2000Q ARM64 平台 YT8521SH (phy) 软件&#xff1a; linux 4.19.246 环境2&#xff1a; 硬件&#xff1a; NXP T1042 PowerPC 平台 YT8521SH (phy) 软件&#xff1a; linux 4.1.35 备注&#xff1a; 1、环境1的网…

Rdkit|分子可视化

Rdkit|分子可视化 Github&#xff1a; 地址 单个展示 从mol对象到图片&#xff1a;MolToImage(mol, size, kekulize, wedgeBonds, fitImage, …) mol&#xff1a;mol对象 size&#xff1a;图片尺寸&#xff0c;默认(300, 300) kekulize&#xff1a;是否展示kekule形式&#…

Apikit 自学日记:新建 API 请求

进入流程测试用例详情页&#xff0c;点击添加测试步骤&#xff0c;在下拉菜单中选择 添加API请求 &#xff0c;系统会自动进入API测试步骤编辑页面&#xff0c;接下来你可以编辑API的请求参数、返回结果、校验规则等内容。 设置 API 测试步骤 API测试步骤设置分为以下几个部分…

react笔记_07类组件

目录 复习展开运算符 组件什么叫做组件&#xff1f;分类类组件es6新增构造函数语法类组件渲染类组件的this指向类组件的三大属性state作用语法-初始化数据语法-修改state数据语法-获取state中的数据案例 propspropTypes属性(prop-types库)defaultProps属性 refs[1] 字符串形式的…

搞定HashMap

搞定HashMap 1.Map是个啥&#xff1f; HashMap隶属于Java中集合这一块&#xff0c;我们知道集合这块有list&#xff0c;set和map&#xff0c;这里的HashMap就是Map的实现类&#xff0c;那么在Map这个大家族中还有哪些重要角色呢&#xff1f; 上图展示了Map的家族&#xff0c;…

Cernox 温度传感器碳陶瓷基体结构

Cernox 温度传感器具有高灵敏度、稳定性好、遵循单一电阻与温度曲线&#xff0c;磁场性能优良和耐辐射等特性。适用于低温系统中1.5-375K范围内的测量。传感器在及其严格的质量控制下制造&#xff0c;并在强磁场、中子伽马辐射、热循环和机械耐久条件下证明长期稳定性。与其他可…

基于springboot+mysql+jsp高校社团管理系统

基于springbootmysqljsp高校社团管理系统 一、系统介绍二、所用技术三、功能展示三、其它系统四、获取源码 一、系统介绍 管理员&#xff1a;登录注册、个人中心&#xff08;个人信息、密码修改、注销&#xff09;、近期活动&#xff08;所有活动、文体类活动、学术类活动、公…

微服务学习1——微服务环境搭建

微服务学习1——微服务环境搭建 &#xff08;参考黑马程序员项目&#xff09; 个人仓库地址&#xff1a;https://gitee.com/jkangle/springboot-exercise.git 微服务就是将单体应用进一步拆分&#xff0c;拆成更小的服务&#xff0c;拆完之后怎么调用&#xff0c;主流的技术有…

【分布式】zabbix 6.0部署讲解

目录 一、 序章二、zabbix概念2.1 zabbix是什么&#xff1f;2.2 zabbix 监控原理2.3 zabbix 6.0 新特性2.4 zabbix 6.0 功能组件 三、zabbix 6.0 部署部署服务端3.1 部署 Nginx PHP 环境并测试3.1.1 安装nginx3.1.2 安装php3.1.3 修改 Nginx 配置3.1.4 修改 php 配置3.1.5 创建…

Python +selenium 自动化之元素定位

selenium之八大元素定位&#xff1a; 1、通过ID的方式定位 id是页面的唯一标识 例如&#xff1a;找到百度的搜索输入框 driver.findElement(By.id("kw")) 2、通过tagName的方式定位 用标签名定位非常少 ---一般会重复 driver.findElements(By.tagName(&qu…

Vue2 Diff 算法简易版

背景 最近复习的过程中&#xff0c;准备对比一下Vue2和Vue3的diff算法区别&#xff0c;好知道两者直接的差异和优缺点。刚好看了网上的文章&#xff0c;但是对方写的代码不太正确&#xff0c;所以特意记录一下我的学习过程~ 双端比较法 Vue2采用的双端比较法&#xff0c;即新…