React?Hooks?實(shí)現(xiàn)的中文輸入組件
正文
在前端開發(fā)中,通過監(jiān)聽 onInput 事件來觸發(fā)輸入框內(nèi)容的更新,是沒有問題的,但如果輸入的內(nèi)容有中文的時(shí)候,會(huì)出現(xiàn)類似 zhong'wen'nei'rong這樣的備選內(nèi)容。
這種內(nèi)容的影響普遍不會(huì)很大,但是當(dāng)需要對(duì)輸入的內(nèi)容進(jìn)行一些耗時(shí)的操作的時(shí)候,這個(gè)影響就不得不考慮一下了,比如說內(nèi)容需要進(jìn)行復(fù)雜的渲染、通過網(wǎng)絡(luò)實(shí)時(shí)發(fā)送等等場(chǎng)景。
先等待而不觸發(fā)onInput事件
對(duì)這種問題的解決方案,需要借助瀏覽器提供的組合輸入事件 。簡(jiǎn)單地說,輸入中日韓文等各種包含“選字”環(huán)節(jié)的文字的時(shí)候,會(huì)額外觸發(fā)兩個(gè)事件compositionStart和compositionEnd,監(jiān)聽并處理這兩個(gè)事件,就可以在用戶還未完成選字的時(shí)候先等待而不觸發(fā)onInput事件:

如果僅僅需要處理組合輸入的話,使用 compositionEnd 代替 onInput 就可以,但用戶偶爾也需要輸入英文和數(shù)字,這些輸入不會(huì)觸發(fā) compositionEnd。
因此我們需要在 compositionStart 的時(shí)候進(jìn)入等待狀態(tài),等待狀態(tài)中間的所有 onInput 一律不處理。而輸入英文和字母的時(shí)候,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)然這里可以改成一個(gè)高階函數(shù)或者自定義鉤子,這樣的話就不用單獨(dú)給 textArea 也寫一個(gè)組件了,不過常見的輸入標(biāo)簽也就這倆,沒有必要復(fù)用。
這兩個(gè)事件的兼容性還不錯(cuò):

還在用比這更老的瀏覽器的電腦基本可以忽略掉,硬要兼容的話,怕是只有用適當(dāng)魔改的防抖或者節(jié)流函數(shù)來代替了。
以上就是React Hooks 實(shí)現(xiàn)的中文輸入組件的詳細(xì)內(nèi)容,更多關(guān)于React Hooks中文輸入組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在react-antd中彈出層form內(nèi)容傳遞給父組件的操作
這篇文章主要介紹了在react-antd中彈出層form內(nèi)容傳遞給父組件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10
React Native中實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)入的示例代碼
隨著業(yè)務(wù)的發(fā)展,每一個(gè) React Native 應(yīng)用的代碼數(shù)量都在不斷增加。作為一個(gè)前端想到的方案自然就是動(dòng)態(tài)導(dǎo)入(Dynamic import)了,本文介紹了React Native中實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)入的示例代碼,需要的可以參考一下2022-06-06
React中的路由嵌套和手動(dòng)實(shí)現(xiàn)路由跳轉(zhuǎn)的方式詳解
這篇文章主要介紹了React中的路由嵌套和手動(dòng)實(shí)現(xiàn)路由跳轉(zhuǎn)的方式,手動(dòng)路由的跳轉(zhuǎn),主要是通過Link或者NavLink進(jìn)行跳轉(zhuǎn)的,實(shí)際上我們也可以通JavaScript代碼進(jìn)行跳轉(zhuǎn),需要的朋友可以參考下2022-11-11
使用React代碼動(dòng)態(tài)生成柵格布局的方法
這篇文章主要介紹了使用React簡(jiǎn)短代碼動(dòng)態(tài)生成柵格布局的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
react函數(shù)組件useState異步,數(shù)據(jù)不能及時(shí)獲取到的問題
這篇文章主要介紹了react函數(shù)組件useState異步,數(shù)據(jù)不能及時(shí)獲取到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
React實(shí)現(xiàn)浮層組件的思路與方法詳解
React?浮層組件(也稱為彈出組件或彈窗組件)通常是指在用戶界面上浮動(dòng)顯示的組件,本文主要介紹了浮層組件的實(shí)現(xiàn)方法,感興趣的小伙伴可以了解下2024-02-02

