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

React18中的useDeferredValue示例詳解

 更新時(shí)間:2022年03月16日 11:16:00   作者:喵爸的小作坊  
這篇文章主要介紹了React18中的useDeferredValue的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

接著上一篇React18的簡(jiǎn)介和自動(dòng)批處理的特性,今天我們來(lái)聊下useDeferredValue。

有什么用?

lets you defer updating the less important parts of the screen

我們翻譯下,允許用戶推遲屏幕更新優(yōu)先級(jí)不高部分。

說(shuō)“人話”就是,如果說(shuō)某些渲染比較消耗性能,比如存在實(shí)時(shí)計(jì)算和反饋,我們可以使用這個(gè)Hook降低其計(jì)算的優(yōu)先級(jí),使得避免整個(gè)應(yīng)用變得卡頓。

較多的場(chǎng)景可能就在于用戶反饋輸入上。比如百度的輸入框,用戶可能輸入的很快,相信大家還有個(gè)體會(huì),就是我們使用輸入法的時(shí)候,中間還在選打哪個(gè)字呢,拼音或者輸入片段就已經(jīng)被搜索了。

這里就存在問(wèn)題了,用戶連續(xù)輸入的時(shí)候,不停地在進(jìn)行計(jì)算或者調(diào)用后端服務(wù),其實(shí)中間態(tài)的很多輸入片段的信息是無(wú)用的,既浪費(fèi)了服務(wù)資源,也因?yàn)?code>React應(yīng)用實(shí)時(shí)更新和JS的單線程特性導(dǎo)致其他渲染任務(wù)卡頓。那我們使用useDeferredValue來(lái)使用下,如何避免這個(gè)問(wèn)題。

實(shí)操起來(lái)

還是沿用上期的代碼項(xiàng)目

import React, {useState, useEffect} from 'react';

const List = (props) => {
  const [list, setList] = useState([]);
  const [count, setCount] = useState(0);

  useEffect(() => {
    setCount(count => count + 1);
    setTimeout(() => {
      setList([
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
      ]);
    }, 500);
  }, [props.text]);
  return [<p>{'我被觸發(fā)了' + count + '次'}</p>
    , <ul>{list.map(item => <li>Hello:{item.name} value:{item.value}</li>)}</ul>]
};

export default function App() {
  const [text, setText] = useState("喵爸");

  const handleChange = (e) => {
    setText(e.target.value);
  };
  return (
    <div className="App">
      <input value={text} onChange={handleChange}/>
      <List text={text}/>
    </div>
  );
};

一般我們的代碼是這樣寫(xiě)的。輸入框的值變化的時(shí)候,我們使用setTimeout來(lái)模擬下向后端請(qǐng)求數(shù)據(jù),或者大量計(jì)算的耗時(shí)操作。這個(gè)時(shí)候只要輸入框的內(nèi)容發(fā)生變化就會(huì)觸發(fā)useEffect,我們用count來(lái)進(jìn)行計(jì)數(shù)。

\

我們每次的輸入或者變化,都會(huì)觸發(fā)一次更新,那我們接下來(lái)改造下。

我們僅需要修改外部組件,使得傳入ListText變量是一個(gè)延遲更新的值。

細(xì)心的同學(xué)可以發(fā)現(xiàn)了,咦?!好像沒(méi)什么區(qū)別呀。其實(shí)原因在于,首先timeoutMs這個(gè)參數(shù)的含義是延遲的值允許延遲多久,事實(shí)上網(wǎng)絡(luò)和設(shè)備允許的情況下,React會(huì)嘗試使用更低的延遲。這一點(diǎn)是不是非常nice呀。

跟防抖的區(qū)別

估計(jì)有很多同學(xué)在一開(kāi)始看到筆者這個(gè)場(chǎng)景的時(shí)候會(huì)去想,這就是防抖嗎?一開(kāi)始故意賣(mài)了個(gè)關(guān)子,沒(méi)有提防抖的概念。這里跟防抖還是有比較大的區(qū)別的,那么不論機(jī)器快慢,網(wǎng)絡(luò)情況如何,始終會(huì)在用戶停止輸入后的固定之間才執(zhí)行。筆者直接放出兩者的比較,為了簡(jiǎn)單起見(jiàn),我們使用下ahooksuseDebounce,大家可以對(duì)比理解下。

import React, {useState, useEffect, useDeferredValue} from 'react';
import {useDebounce} from 'ahooks';
const List = (props) => {
  const [list, setList] = useState([]);
  const [count, setCount] = useState(0);
  useEffect(() => {
    setCount(count => count + 1);
    setTimeout(() => {
      setList([
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
        {name: props.text, value: Math.random()},
      ]);
    }, 500);
  }, [props.text]);
  return [<p>{'我被觸發(fā)了' + count + '次'}</p>,
    <ul>{list.map(item => <li>Hello:{item.name} value:{item.value}</li>)}</ul>]
};

export default function App() {
  const [text, setText] = useState("喵爸");
  const deferredText = useDeferredValue(text, {timeoutMs: 1000});
  const debouncedValue = useDebounce(text, { wait: 1000 });
  const handleChange = (e) => {
    setText(e.target.value);
  };
  return (
    <div className="App">
      <input value={text} onChange={handleChange}/>
      <List text={deferredText}/>
      <List text={debouncedValue}/>
    </div>
  );
};

到此這篇關(guān)于React18中的useDeferredValue的文章就介紹到這了,更多相關(guān)React18 useDeferredValue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react mobx 基本用法示例小結(jié)

    react mobx 基本用法示例小結(jié)

    mobx是一個(gè)輕量級(jí)的狀態(tài)管理器,所以很簡(jiǎn)單(單一全局?jǐn)?shù)據(jù)使用class)類有g(shù)et 數(shù)據(jù)方法,本文通過(guò)示例代碼介紹react mobx 基本用法,感興趣的朋友有一起看看
    2023-11-11
  • React Hook的使用示例

    React Hook的使用示例

    這篇文章主要介紹了React Hook的使用示例,幫助大家更好的理解和學(xué)習(xí)使用React,感興趣的朋友可以了解下
    2021-04-04
  • react中用less的問(wèn)題

    react中用less的問(wèn)題

    本文主要介紹了react中用less的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • React useCallback詳細(xì)使用教程

    React useCallback詳細(xì)使用教程

    useCallback是react中比較重要的一個(gè)hook,useCallback 用來(lái)返回一個(gè)函數(shù),在父子組件傳參或者通用函數(shù)封裝中,起到舉足輕重的作用
    2022-11-11
  • 基于React封裝組件的實(shí)現(xiàn)步驟

    基于React封裝組件的實(shí)現(xiàn)步驟

    很多小伙伴在第一次嘗試封裝組件時(shí)會(huì)和我一樣碰到許多問(wèn)題,本文主要介紹了基于React封裝組件的實(shí)現(xiàn)步驟,感興趣的可以了解一下
    2021-11-11
  • hooks中useEffect()使用案例詳解

    hooks中useEffect()使用案例詳解

    這篇文章主要介紹了hooks中useEffect()使用總結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • React中使用react-json-view展示JSON數(shù)據(jù)的操作方法

    React中使用react-json-view展示JSON數(shù)據(jù)的操作方法

    react-json-view是一個(gè)用于顯示和編輯javascript數(shù)組和JSON對(duì)象的React組件,本文給大家分享React中使用react-json-view展示JSON數(shù)據(jù)的操作方法,感興趣的朋友一起看看吧
    2023-12-12
  • React錯(cuò)誤邊界Error Boundaries詳解

    React錯(cuò)誤邊界Error Boundaries詳解

    錯(cuò)誤邊界是一種React組件,這種組件可以捕獲發(fā)生在其子組件樹(shù)任何位置的JavaScript錯(cuò)誤,并打印這些錯(cuò)誤,同時(shí)展示降級(jí)UI,而并不會(huì)渲染那些發(fā)生崩潰的子組件樹(shù)
    2022-12-12
  • webpack手動(dòng)配置React開(kāi)發(fā)環(huán)境的步驟

    webpack手動(dòng)配置React開(kāi)發(fā)環(huán)境的步驟

    本篇文章主要介紹了webpack手動(dòng)配置React開(kāi)發(fā)環(huán)境的步驟,webpack手動(dòng)配置一個(gè)獨(dú)立的React開(kāi)發(fā)環(huán)境, 開(kāi)發(fā)環(huán)境完成后, 支持自動(dòng)構(gòu)建, 自動(dòng)刷新, sass語(yǔ)法 等功能...感興趣的小伙伴們可以參考一下
    2018-07-07
  • react實(shí)現(xiàn)圖片懶加載的三種方式

    react實(shí)現(xiàn)圖片懶加載的三種方式

    本文主要介紹了react實(shí)現(xiàn)圖片懶加載的三種方式,包括利用瀏覽器原生的loading="lazy"屬性,使用react-lazyload庫(kù)以及通過(guò)IntersectionObserver API手動(dòng)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03

最新評(píng)論

高碑店市| 莱芜市| 汝南县| 达州市| 独山县| 和龙市| 奉贤区| 漠河县| 临高县| 寿宁县| 崇明县| 娱乐| 云霄县| 土默特右旗| 汉阴县| 温泉县| 芮城县| 克什克腾旗| 建水县| 含山县| 鄂尔多斯市| 卫辉市| 丰县| 扎囊县| 永定县| 乌拉特中旗| 鹿泉市| 麦盖提县| 昭平县| 怀远县| 泽库县| 沈丘县| 迭部县| 阜宁县| 长白| 偏关县| 科技| 尚志市| 新和县| 巴彦淖尔市| 枣庄市|