最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react Input組件Compositionstart和Compositionend事件

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

前言

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

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

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

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

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

Compositionstart和Compositionend事件是啥

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

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

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

本來是打算解析完整的Input組件的,后來想想其實這個組件太簡單了,就只講一下其中的難點吧。

源碼探析解決方案

首先Input組件如下

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

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

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

上面可以看到innerValue是最終渲染給input框的value,用戶一般通過onChange事件獲取值,所以 我們在中文輸入的時候,只要不觸發(fā)onChange事件是不是就好了!

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

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

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

點擊眼睛圖標就能看到輸入的文字了,這個是咋辦到的。

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

相關(guān)文章

  • react中將html字符串渲染到頁面的實現(xiàn)方式

    react中將html字符串渲染到頁面的實現(xiàn)方式

    這篇文章主要介紹了react中將html字符串渲染到頁面的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • react-router 路由切換動畫的實現(xiàn)示例

    react-router 路由切換動畫的實現(xiàn)示例

    這篇文章主要介紹了react-router 路由切換動畫的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Ant?Design?組件庫之步驟條實現(xiàn)

    Ant?Design?組件庫之步驟條實現(xiàn)

    這篇文章主要為大家介紹了Ant?Design組件庫之步驟條實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Header組件熱門搜索欄的實現(xiàn)示例

    Header組件熱門搜索欄的實現(xiàn)示例

    這篇文章主要為大家介紹了Header組件熱門搜索欄的實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • React的createElement和render手寫實現(xiàn)示例

    React的createElement和render手寫實現(xiàn)示例

    這篇文章主要為大家介紹了React的createElement和render手寫實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 基于React-Dropzone開發(fā)上傳組件功能(實例演示)

    基于React-Dropzone開發(fā)上傳組件功能(實例演示)

    這篇文章主要介紹了基于React-Dropzone開發(fā)上傳組件,主要講述的是在React-Flask框架上開發(fā)上傳組件的技巧,需要的朋友可以參考下
    2021-08-08
  • 使用react的7個避坑案例小結(jié)

    使用react的7個避坑案例小結(jié)

    React是個很受歡迎的前端框架。今天我們探索下React開發(fā)者應該注意的七點,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 一文搞懂redux在react中的初步用法

    一文搞懂redux在react中的初步用法

    Redux是JavaScript狀態(tài)容器,提供可預測化的狀態(tài)管理,今天通過本文給大家分享redux在react中使用及配置redux到react項目中的方法,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • React鉤子函數(shù)之useDeferredValue的基本使用示例詳解

    React鉤子函數(shù)之useDeferredValue的基本使用示例詳解

    useDeferredValue是React 18中非常有用的一個鉤子函數(shù),它可以幫助我們優(yōu)化渲染性能,并讓UI更加流暢,如果你還沒有嘗試過它,不妨在你的下一個React項目中試一試,這篇文章主要介紹了React鉤子函數(shù)之useDeferredValue的基本使用,需要的朋友可以參考下
    2023-08-08
  • Redux thunk中間件及執(zhí)行原理詳細分析

    Redux thunk中間件及執(zhí)行原理詳細分析

    redux的核心概念其實很簡單:將需要修改的state都存入到store里,發(fā)起一個action用來描述發(fā)生了什么,用reducers描述action如何改變state tree,這篇文章主要介紹了Redux thunk中間件及執(zhí)行原理分析
    2022-09-09

最新評論

乌海市| 专栏| 报价| 博罗县| 永修县| 秭归县| 仲巴县| 宾川县| 德惠市| 太湖县| 卢湾区| 潍坊市| 宁津县| 新干县| 如皋市| 河北省| 阿城市| 贡觉县| 磴口县| 玉溪市| 青阳县| 淮滨县| 门源| 重庆市| 威海市| 沂水县| 凤山市| 二连浩特市| 正阳县| 托里县| 浪卡子县| 枣阳市| 景泰县| 射洪县| 搜索| 皋兰县| 化德县| 新郑市| 讷河市| 云霄县| 喀喇|