React Hooks 实现的中文输入组件

 更新时间:2023年05月16日 11:37:15   作者:知名喷子  
这篇文章主要为大家介绍了React Hooks实现的中文输入组件示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

在前端开发中,通过监听 onInput 事件来触发输入框内容的更新,是没有问题的,但如果输入的内容有中文的时候,会出现类似 zhong'wen'nei'rong这样的备选内容。

这种内容的影响普遍不会很大,但是当需要对输入的内容进行一些耗时的操作的时候,这个影响就不得不考虑一下了,比如说内容需要进行复杂的渲染、通过网络实时发送等等场景。

先等待而不触发onInput事件

对这种问题的解决方案,需要借助浏览器提供的组合输入事件 。简单地说,输入中日韩文等各种包含“选字”环节的文字的时候,会额外触发两个事件compositionStartcompositionEnd,监听并处理这两个事件,就可以在用户还未完成选字的时候先等待而不触发onInput事件:

源自MDN 文档: compositionstart

如果仅仅需要处理组合输入的话,使用 compositionEnd 代替 onInput 就可以,但用户偶尔也需要输入英文和数字,这些输入不会触发 compositionEnd

因此我们需要在 compositionStart 的时候进入等待状态,等待状态中间的所有 onInput 一律不处理。而输入英文和字母的时候,onInput 则正常处理。

标记等待状态的方法

标记等待状态的方法比较多,例如useRef

import { useRef, useState } from "react";
export function ChineseInput(params){
    const { onInput = () => {} } = params;
    const lockRef = useRef(false);
    // preview 用于预览,不然都不知道自己打的什么内容
    const [preview, setPreview] = useState(value);
    // 进入组合输入状态
    const handleStart = () => {
      lockRef.current = true
    };
    const handleInput = event => {
      // 不管状态如何,总是需要预览的
      setPreview(event.target.value);
      // 处于组合输入状态,不予处理
      if(lockRef.current) return;
      // 非组合输入状态,触发 onInput
      onInput(event);
    };
    // 选字结束,触发 onInput
    const handleEnd = event => {
      setPreview(event.target.value);
      lockRef.current = false;
      onInput(event);
    };
    return (
      <input
        {...params}
        onCompositionEnd={handleEnd}
        onCompositionStart={handleStart}
        onInput={handleInput}
      />
    )
  }

 当然这里可以改成一个高阶函数或者自定义钩子,这样的话就不用单独给 textArea 也写一个组件了,不过常见的输入标签也就这俩,没有必要复用。

这两个事件的兼容性还不错:

 还在用比这更老的浏览器的电脑基本可以忽略掉,硬要兼容的话,怕是只有用适当魔改的防抖或者节流函数来代替了。

以上就是React Hooks 实现的中文输入组件的详细内容,更多关于React Hooks中文输入组件的资料请关注脚本之家其它相关文章!

相关文章

  • React 悬浮框内容懒加载实例详解

    React 悬浮框内容懒加载实例详解

    这篇文章主要为大家介绍了React 悬浮框内容懒加载实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • React JSX深入浅出理解

    React JSX深入浅出理解

    React使用JSX来替代常规的JavaScript。JSX是一个看起来很像 XML的JavaScript语法扩展。我们不需要一定使用 JSX,但它有以下优点:JSX执行更快,因为它在编译为JavaScript代码后进行了优化。它是类型安全的,在编译过程中就能发现错误。使用JSX编写模板更加简单快速
    2022-12-12
  • react组件memo useMemo useCallback使用区别示例

    react组件memo useMemo useCallback使用区别示例

    这篇文章主要为大家介绍了react组件memo useMemo useCallback使用区别的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 简单介绍react redux的中间件的使用

    简单介绍react redux的中间件的使用

    这篇文章主要介绍了简单介绍redux的中间件的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • React在定时器中无法获取状态最新值的问题

    React在定时器中无法获取状态最新值的问题

    这篇文章主要介绍了React在定时器中无法获取状态最新值的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • ReactNative踩坑之配置调试端口的解决方法

    ReactNative踩坑之配置调试端口的解决方法

    本篇文章主要介绍了ReactNative踩坑之配置调试端口的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • react native与webview通信的示例代码

    react native与webview通信的示例代码

    本篇文章主要介绍了react native与webview通信的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Suspense对React的意义及作用解析

    Suspense对React的意义及作用解析

    这篇文章主要为大家介绍了Suspense对React的意义及作用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Express+React+Antd实现上传功能(前端和后端)

    Express+React+Antd实现上传功能(前端和后端)

    这篇文章主要介绍了Express+React+Antd实现上传功能(前端和后端),本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • webpack入门+react环境配置

    webpack入门+react环境配置

    webpack是一个前端资源模块化管理和打包工具,说白了就是方便我们管理自己的常用的一些代码,比如你开发中用到sass以及jade同时用到es6,开发时你不可能改动某个地方就挨个命令去转换再到浏览器去看效果,那样效率是非常低的。所以webpack帮我们省去了那些多余的步骤。
    2017-02-02

最新评论