av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

React Hooks 實(shí)現(xiàn)的中文輸入組件

瀏覽:144日期:2022-06-10 11:19:43
目錄
  • 正文
  • 先等待而不觸發(fā)onInput事件
  • 標(biāo)記等待狀態(tài)的方法

正文

在前端開發(fā)中,通過監(jiān)聽 onInput 事件來觸發(fā)輸入框內(nèi)容的更新,是沒有問題的,但如果輸入的內(nèi)容有中文的時候,會出現(xiàn)類似 zhong'wen'nei'rong這樣的備選內(nèi)容。

這種內(nèi)容的影響普遍不會很大,但是當(dāng)需要對輸入的內(nèi)容進(jìn)行一些耗時的操作的時候,這個影響就不得不考慮一下了,比如說內(nèi)容需要進(jìn)行復(fù)雜的渲染、通過網(wǎng)絡(luò)實(shí)時發(fā)送等等場景。

先等待而不觸發(fā)onInput事件

對這種問題的解決方案,需要借助瀏覽器提供的組合輸入事件 。簡單地說,輸入中日韓文等各種包含“選字”環(huán)節(jié)的文字的時候,會額外觸發(fā)兩個事件compositionStartcompositionEnd,監(jiān)聽并處理這兩個事件,就可以在用戶還未完成選字的時候先等待而不觸發(fā)onInput事件:

源自MDN 文檔: compositionstart

如果僅僅需要處理組合輸入的話,使用 compositionEnd 代替 onInput 就可以,但用戶偶爾也需要輸入英文和數(shù)字,這些輸入不會觸發(fā) compositionEnd。

因此我們需要在 compositionStart 的時候進(jìn)入等待狀態(tài),等待狀態(tài)中間的所有 onInput 一律不處理。而輸入英文和字母的時候,onInput 則正常處理。

標(biāo)記等待狀態(tài)的方法

標(biāo)記等待狀態(tài)的方法比較多,例如useRef

import { useRef, useState } from "react";export function ChineseInput(params){    const { onInput = () => {} } = params;    const lockRef = useRef(false);    // preview 用于預(yù)覽,不然都不知道自己打的什么內(nèi)容    const [preview, setPreview] = useState(value);    // 進(jìn)入組合輸入狀態(tài)    const handleStart = () => {      lockRef.current = true    };    const handleInput = event => {      // 不管狀態(tài)如何,總是需要預(yù)覽的      setPreview(event.target.value);      // 處于組合輸入狀態(tài),不予處理      if(lockRef.current) return;      // 非組合輸入狀態(tài),觸發(fā) onInput      onInput(event);    };    // 選字結(jié)束,觸發(fā) onInput    const handleEnd = event => {      setPreview(event.target.value);      lockRef.current = false;      onInput(event);    };    return (      <input{...params}onCompositionEnd={handleEnd}onCompositionStart={handleStart}onInput={handleInput}      />    )  }

當(dāng)然這里可以改成一個高階函數(shù)或者自定義鉤子,這樣的話就不用單獨(dú)給 textArea 也寫一個組件了,不過常見的輸入標(biāo)簽也就這倆,沒有必要復(fù)用。

這兩個事件的兼容性還不錯:

還在用比這更老的瀏覽器的電腦基本可以忽略掉,硬要兼容的話,怕是只有用適當(dāng)魔改的防抖或者節(jié)流函數(shù)來代替了。

以上就是React Hooks 實(shí)現(xiàn)的中文輸入組件的詳細(xì)內(nèi)容,更多關(guān)于React Hooks中文輸入組件的資料請關(guān)注其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 国产精品五区 | 天堂中文在线视频 | 精品aaa | 亚洲一级免费视频 | 亚洲观看黄色网 | 五月婷婷深深爱 | 日韩欧美在线一区二区 | 精品久久久久久久久久久久久 | 最新国产在线视频 | 亚洲欧洲在线观看 | 欧美日韩在线不卡 | 免费一区二区 | 欧洲色综合 | 亚洲国产欧美在线 | 香蕉一区二区 | 久久久网| 日本一级大毛片a一 | 亚洲人成在线播放 | 在线精品一区 | 中文字幕免费视频 | 99香蕉视频 | 一本一道久久a久久精品蜜桃 | 欧美日韩中文字幕在线 | 免费国产黄色 | 国产精品99999 | 在线视频99| 国产一区二区在线播放 | 日本特级黄色片 | 伊人春色av | 中文字幕在线观看一区二区三区 | 欧美激情网站 | 黄色免费片 | 亚洲精品视频在线播放 | 日韩网站免费观看 | 中文一区二区 | 国内精品一区二区 | www.欧美精品 | 婷婷综合网 | 成人小视频在线 | 亚洲综合日韩 | 毛片在线观看网站 |