欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

react Input組件Compositionstart和Compositionend事件

 更新時(shí)間:2022年11月29日 09:13:50   作者:孟祥_成都  
這篇文章主要為大家介紹了Compositionstart和Compositionend事件之于react組件庫(kù)Input組件的坑解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

Input組件大家都用過(guò),是吧,但是你有沒有想過(guò)這樣一個(gè)場(chǎng)景,如下圖,我正在搜索數(shù)據(jù)

你組件上注冊(cè)了onChange事件,然后邊輸入,底下會(huì)顯示你搜索相關(guān)的內(nèi)容,

但是有一個(gè)問(wèn)題就是,輸入中文的時(shí)候,你比如打三國(guó)的三字,要先輸入san然后才出現(xiàn)三

可問(wèn)題來(lái)了,onChange事件監(jiān)聽的是san,已經(jīng)開始搜索了,其實(shí)我們根本不想這樣,我們想的是中文的話,等中文顯示在輸入框,也就是輸入完“三”這個(gè)字的時(shí)候,才搜索。這個(gè)咋辦

這就需要我們今天的主角Compositionstart和Compositionend事件出場(chǎng)了。

Compositionstart和Compositionend事件是啥

compositionstart 事件在用戶開始進(jìn)行非直接輸入的時(shí)候觸發(fā),而在非直接輸入結(jié)束,也即用戶點(diǎn)選候選詞或者點(diǎn)擊「選定」按鈕之后,比如按回車鍵,會(huì)觸發(fā) compositionend 事件。

舉個(gè)例子,還是上面輸入三這個(gè)字的過(guò)程,當(dāng)你輸入s的時(shí)候,已經(jīng)打開了中文輸入法,此時(shí)compositionstart事件觸發(fā)了,當(dāng)你輸入完三并且確認(rèn)的時(shí)候,compositionend事件觸發(fā)。

好了,所以如果你用的組件庫(kù),Input組件沒有優(yōu)化這一項(xiàng)的話,也就是onChange事件在中文輸入法下,應(yīng)該返回的是中文輸入完成,也就是compositionend事件完成的字符,而不是輸入過(guò)程的字符,那么就需要組件封裝一下這個(gè)邏輯了,如果封裝,我們看下源碼。

本來(lái)是打算解析完整的Input組件的,后來(lái)想想其實(shí)這個(gè)組件太簡(jiǎn)單了,就只講一下其中的難點(diǎn)吧。

源碼探析解決方案

首先Input組件如下

 <input
        value={innerValue}
        onCompositionStart={handleCompositionStart}
        onCompositionEnd={handleCompositionEnd}
        onChange={handleChange}
      />

然后我們看下value屬性的formatDisplayValue是什么

// 用來(lái)記錄此時(shí)是否Compositionstart事件觸發(fā)了,如果觸發(fā)就置為true
// Compositionend結(jié)束就置為false
 const composingRef = useRef(false);
 // 暴露給
  const [value, onChange] = useState<string>('');
 const [composingValue, setComposingValue] = useState<string>('');
 // 如果啟動(dòng)了中文輸入法,那么innerValue就是composingValue
 // composingValue就是中文輸入的時(shí)候比如“三國(guó)”,你輸入從“s”到“sanguo”,此時(shí)innerValue都是composingValue
 // 除了中文輸入法外,innerValue都是value
 const innerValue = composingRef.current ? composingValue : value ?? '';

上面可以看到innerValue是最終渲染給input框的value,用戶一般通過(guò)onChange事件獲取值,所以 我們?cè)谥形妮斎氲臅r(shí)候,只要不觸發(fā)onChange事件是不是就好了!

關(guān)鍵啊!最重要的知識(shí)點(diǎn)就是Compositionstart事件觸發(fā)了,代表正在輸入中文,那么onChange事件就不要觸發(fā),所以我們接著把事件的代碼補(bǔ)上

 // 開始輸入中文的時(shí)候把 composingRef.current 置為true
  function handleCompositionStart(e: React.CompositionEvent<HTMLInputElement>) {
      composingRef.current = true;
      const {
        currentTarget: { value },
      } = e;
    }
    // 中文輸入完畢,把composingRef.current置為false,并把此時(shí)輸入完的值給handleChange(handleChange會(huì)觸發(fā)onChange)
    function handleCompositionEnd(e: React.CompositionEvent<HTMLInputElement>) {
      if (composingRef.current) {
        composingRef.current = false;
        handleChange(e);
      }
    }
 function handleChange(e: React.ChangeEvent<HTMLInputElement> | React.CompositionEvent<HTMLInputElement>) {
      let { value: newStr } = e.currentTarget;
      // 當(dāng)中文輸入的時(shí)候,不觸發(fā)onChange事件,觸發(fā)setComposingValue只是為了讓輸入框同步你輸入的text
      if (composingRef.current) {
        setComposingValue(newStr);
      } else {
        // 完成中文輸入時(shí)同步一次 composingValue
        setComposingValue(newStr);
        // 中文輸入完畢,此時(shí)觸發(fā)onChange
        onChange(newStr, { e });
      }
    }

好了,本文結(jié)束,其實(shí)里面還有兩個(gè)細(xì)節(jié),后面再寫一篇文章說(shuō),就是我們input框傳參,可以有defaultValue這個(gè)value是外部傳入的,還有props傳入的value,還有組件默認(rèn)的defalut value,這3個(gè)值怎么寫一個(gè)hooks去處理,還有就是你們知道input框有種類型是顯示password嗎,這種顯示密碼的input框,輸入文字后顯示的是...如下:

點(diǎn)擊眼睛圖標(biāo)就能看到輸入的文字了,這個(gè)是咋辦到的。

以上就是react Input組件Compositionstart和Compositionend事件的詳細(xì)內(nèi)容,更多關(guān)于react Input組件事件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • react反向代理使用http-proxy-middleware問(wèn)題

    react反向代理使用http-proxy-middleware問(wèn)題

    這篇文章主要介紹了react反向代理使用http-proxy-middleware問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • React實(shí)現(xiàn)前端選區(qū)的示例代碼

    React實(shí)現(xiàn)前端選區(qū)的示例代碼

    本文主要介紹了React實(shí)現(xiàn)前端選區(qū)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • react-router browserHistory刷新頁(yè)面404問(wèn)題解決方法

    react-router browserHistory刷新頁(yè)面404問(wèn)題解決方法

    本篇文章主要介紹了react-router browserHistory刷新頁(yè)面404問(wèn)題解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-12-12
  • React?懸浮框內(nèi)容懶加載實(shí)例詳解

    React?懸浮框內(nèi)容懶加載實(shí)例詳解

    這篇文章主要為大家介紹了React?懸浮框內(nèi)容懶加載實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 使用React和Redux Toolkit實(shí)現(xiàn)用戶登錄功能

    使用React和Redux Toolkit實(shí)現(xiàn)用戶登錄功能

    在React中,用戶登錄功能是一個(gè)常見的需求,為了實(shí)現(xiàn)該功能,需要對(duì)用戶輸入的用戶名和密碼進(jìn)行驗(yàn)證,并將驗(yàn)證結(jié)果保存到應(yīng)用程序狀態(tài)中,在React中,可以使用Redux Toolkit來(lái)管理應(yīng)用程序狀態(tài),從而實(shí)現(xiàn)用戶登錄功能,需要詳細(xì)了解可以參考下文
    2023-05-05
  • react如何添加less環(huán)境配置

    react如何添加less環(huán)境配置

    這篇文章主要介紹了react如何添加less環(huán)境配置,本文給大家分享遇到問(wèn)題及解決方案,結(jié)合示例代碼圖文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-05-05
  • react-native中ListView組件點(diǎn)擊跳轉(zhuǎn)的方法示例

    react-native中ListView組件點(diǎn)擊跳轉(zhuǎn)的方法示例

    ListView作為React Native的核心組件,用于高效地顯示一個(gè)可以垂直滾動(dòng)的變化的數(shù)據(jù)列表。下面這篇文章主要給大家介紹了關(guān)于react-native中ListView組件點(diǎn)擊跳轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-09-09
  • React錯(cuò)誤的習(xí)慣用法分析詳解

    React錯(cuò)誤的習(xí)慣用法分析詳解

    這篇文章主要為大家介紹了React錯(cuò)誤用法習(xí)慣分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 一文帶你了解React中的函數(shù)組件

    一文帶你了解React中的函數(shù)組件

    函數(shù)式組件的基本意義就是,組件實(shí)際上是一個(gè)函數(shù),不是類,下面這篇文章主要給大家介紹了關(guān)于React中函數(shù)組件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • React Hook 監(jiān)聽localStorage更新問(wèn)題

    React Hook 監(jiān)聽localStorage更新問(wèn)題

    這篇文章主要介紹了React Hook 監(jiān)聽localStorage更新問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評(píng)論