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

一文帶你了解React中的并發(fā)機(jī)制

 更新時(shí)間:2024年03月29日 16:43:44   作者:純愛掌門人  
React 18.2.0 引入了一系列并發(fā)機(jī)制的新特性,旨在幫助各位開發(fā)者更好地控制和優(yōu)化應(yīng)用程序的性能和用戶體驗(yàn),下面我們就來看看如何利用這些新特性構(gòu)建更高效、更響應(yīng)式的應(yīng)用程序吧

一、自動(dòng)批處理

React 現(xiàn)在可以自動(dòng)將多個(gè)狀態(tài)更新操作批量處理,以減少不必要的渲染和提高性能。這意味著,當(dāng)你在一個(gè)事件處理程序中連續(xù)調(diào)用多個(gè)狀態(tài)更新函數(shù)時(shí),React 會(huì)將它們合并為一次更新,從而減少渲染次數(shù)。

計(jì)數(shù)器

在下面這個(gè)案例中,當(dāng)用戶點(diǎn)擊按鈕時(shí),handleClick 函數(shù)會(huì)連續(xù)調(diào)用三次 setCount。由于 React 的自動(dòng)批處理,這三次更新會(huì)被合并為一次更新,從而減少渲染次數(shù)。

import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    setCount(count + 1);
    setCount(count + 2);
    setCount(count + 3);
  };

  return (
    <div>
      <p>Count: {count}</p>
     <button onClick={handleClick}>Increment by 3</button>
    </div>
  );
}

二、異步渲染

React現(xiàn)在可以支持異步渲染,這意味著 React 可以在渲染過程中暫停和恢復(fù),從而允許其他任務(wù)(如用戶輸入或動(dòng)畫)優(yōu)先執(zhí)行。這有助于提高應(yīng)用程序的響應(yīng)性和性能。

異步數(shù)據(jù)獲取

在下面這個(gè)案例中,AsyncComponent 組件在掛載時(shí)會(huì)異步獲取數(shù)據(jù)。由于 React 的異步渲染,當(dāng)數(shù)據(jù)還未獲取到時(shí),組件會(huì)顯示 "Loading...",而不會(huì)阻塞其他任務(wù)的執(zhí)行。

import { useState, useEffect } from 'react';

function AsyncComponent() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetchData().then((fetchedData) => {
      setData(fetchedData);
    });
  }, []);

  if (data === null) {
    return <p>Loading...</p>;
  }

  return <div>{data}</div>;
}

async function fetchData() {
  // 模擬異步數(shù)據(jù)獲取
  await new Promise((resolve) => setTimeout(resolve, 1000));
  return 'Async data';
}

三、useDeferredValue:延遲值更新

useDeferredValue 是一個(gè)新的 Hook,它允許你在渲染過程中延遲某些值的更新,直到下一次渲染。這對于實(shí)現(xiàn)響應(yīng)式 UI 和避免不必要的渲染非常有用。

輸入框防抖

在下面這個(gè)示例中,當(dāng)用戶在輸入框中輸入文本時(shí),useDeferredValue 會(huì)延遲更新 deferredText,直到 500 毫秒后的下一次渲染。這有助于提高應(yīng)用程序的響應(yīng)性和性能。

import { useState, useDeferredValue } from 'react';

function DebounceInput() {
  const [text, setText] = useState('');
  const deferredText = useDeferredValue(text, { timeoutMs: 500 });

  const handleChange = (e) => {
    setText(e.target.value);
  };

  return (
    <div>
     <input type="text" value={text} onChange={handleChange} />
      <p>Debounced value: {deferredText}</p>
    </div>
  );
}

四、useTransition:創(chuàng)建過渡狀態(tài)

useTransition 是一個(gè)新的 Hook,它允許你在狀態(tài)更新過程中創(chuàng)建一個(gè)過渡(transition),從而實(shí)現(xiàn)更細(xì)粒度的更新控制。你可以使用這個(gè) Hook 來延遲某些狀態(tài)更新,直到過渡完成。這對于實(shí)現(xiàn)更好的用戶體驗(yàn)和性能優(yōu)化非常有用。

加載狀態(tài)與過渡效果

在下面這個(gè)示例中,當(dāng)用戶點(diǎn)擊按鈕時(shí),handleClick 函數(shù)會(huì)使用 startTransition 創(chuàng)建一個(gè)過渡,并在過渡期間延遲更新 count。isPending 變量表示過渡是否正在進(jìn)行中,當(dāng)過渡正在進(jìn)行時(shí),會(huì)顯示 "Loading..."。

import { useState, useTransition } from 'react';

function TransitionExample() {
  const [count, setCount] = useState(0);
  const [isPending, startTransition] = useTransition();

  const handleClick = () => {
    startTransition(() => {
      setCount(count + 1);
    });
  };

  return (
    <div>
      <p>Count: {count}</p>
     <button onClick={handleClick}>Increment</button>
      {isPending && <p>Loading...</p>}
    </div>
  );
}

五、Suspense 配置優(yōu)化

React新版本引入了新的 Suspense 配置選項(xiàng),如 timeoutMs 和 fallbackAfterSuspense。這些選項(xiàng)允許你更精細(xì)地控制 Suspense 的行為,例如設(shè)置掛起時(shí)間和在掛起后顯示備用內(nèi)容。

分頁加載與錯(cuò)誤處理

在下面這個(gè)示例中,App 組件使用 Suspense 包裹了兩個(gè)異步加載的頁面組件 Page1 和 Page2。通過設(shè)置 timeoutMs 為 1000 毫秒,我們可以在 1 秒后顯示 fallbackAfterSuspense 屬性指定的備用內(nèi)容 "Loading with suspense..."。同時(shí),當(dāng) Page2 加載失敗時(shí),Suspense 會(huì)捕獲錯(cuò)誤并顯示默認(rèn)的錯(cuò)誤邊界內(nèi)容

import { Suspense } from 'react';

function App() {
  return (
    <Suspense
      fallback={<div>Loading...</div>}
      timeoutMs={1000}
      fallbackAfterSuspense={<div>Loading with suspense...</div>}
    >
      <Page1 />
      <Page2 />
    </Suspense>
  );
}

function Page1() {
  // 模擬異步數(shù)據(jù)獲取
  return new Promise((resolve) => setTimeout(() => resolve(<div>Page 1</div>), 2000));
}

function Page2() {
  // 模擬異步數(shù)據(jù)獲取失敗
  return new Promise((_, reject) => setTimeout(() => reject(new Error('Error loading Page 2')), 2000));
}

六、startTransition:手動(dòng)創(chuàng)建過渡

startTransition 是一個(gè)新的函數(shù),它允許你在狀態(tài)更新過程中創(chuàng)建一個(gè)過渡(transition)。你可以使用這個(gè)函數(shù)來延遲某些狀態(tài)更新,直到過渡完成。這對于實(shí)現(xiàn)更好的用戶體驗(yàn)和性能優(yōu)化非常有用。

動(dòng)畫與過渡的協(xié)同

在下面這個(gè)示例中,當(dāng)用戶點(diǎn)擊按鈕時(shí),handleClick 函數(shù)會(huì)使用 startTransition 創(chuàng)建一個(gè)過渡,并在過渡期間平滑地移動(dòng)盒子。通過結(jié)合 CSS 動(dòng)畫和 React 過渡,可以實(shí)現(xiàn)更自然、更流暢的交互體驗(yàn)。

import { useState, startTransition } from 'react';

function AnimationTransitionExample() {
  const [position, setPosition] = useState(0);

  const handleClick = () => {
    // 使用 startTransition 創(chuàng)建過渡
    startTransition(() => {
      setPosition(position + 100);
    });
  };

  return (
    <div style={{ position: 'relative' }}>
      <div
        style={{
          position: 'absolute',
          left: position,
          transition: 'left 0.5s ease-out',
        }}
      >
        Box
      </div>
     <button onClick={handleClick}>Move box</button>
    </div>
  );
}

七、useId 與 useSyncExternalStore:與外部數(shù)據(jù)源同步

這兩個(gè)新的 Hooks 提供了更好的支持,以便在 React 組件和外部數(shù)據(jù)源之間同步數(shù)據(jù)。useId 用于生成唯一的 ID,而 useSyncExternalStore 用于在組件和外部數(shù)據(jù)源之間同步數(shù)據(jù)。

實(shí)時(shí)聊天應(yīng)用

在下面這個(gè)示例中,ChatRoom 組件使用 useSyncExternalStore 從外部數(shù)據(jù)源(chatStore)獲取聊天消息列表。當(dāng)外部數(shù)據(jù)源的數(shù)據(jù)發(fā)生變化時(shí),組件會(huì)自動(dòng)重新渲染。同時(shí),每個(gè) ChatMessage 組件都使用 useId 生成了一個(gè)唯一的 ID,以便在 DOM 中正確引用它們。

import { useId, useSyncExternalStore } from 'react';

function ChatMessage({ message }) {
  const id = useId();
  return <div id={`message-${id}`}>{message}</div>;
}

function ChatRoom() {
  const messages = useSyncExternalStore(
    () => chatStore.subscribe,
    () => chatStore.getMessages()
  );

  return (
    <div>
      {messages.map((message) => (
        <ChatMessage key={message.id} message={message.text} />
      ))}
    </div>
  );
}

const chatStore = {
  messages: [],
  subscribers: new Set(),

  subscribe(callback) {
    this.subscribers.add(callback);
    return () => {
      this.subscribers.delete(callback);
    };
  },

  getMessages() {
    return this.messages;
  },

  addMessage(message) {
    this.messages.push(message);
    this.subscribers.forEach((callback) => callback());
  },
};

總結(jié)以及預(yù)測

React新版本的并發(fā)機(jī)制提供了一系列新特性,包括自動(dòng)批處理、異步渲染、新的 Hooks 和 Suspense 配置等。這些特性旨在幫助開發(fā)者更好地控制和優(yōu)化應(yīng)用程序的性能和用戶體驗(yàn)。通過這些新特性我看到了React在性能優(yōu)化和用戶體驗(yàn)方面的巨大潛力。

下面是掌門人對于React并發(fā)機(jī)制的一些預(yù)測,若是大家與我想法不一致,還請嘴下留情。

  • 更細(xì)粒度的并發(fā)控制:未來的React可能會(huì)提供更細(xì)粒度的并發(fā)控制,允許開發(fā)者根據(jù)具體場景定制渲染策略,以實(shí)現(xiàn)更高的性能和更低的開銷。
  • 集成Web Workers:Web Workers為JavaScript提供了在單獨(dú)線程中運(yùn)行代碼的能力,從而避免了主線程的阻塞。未來,React可能會(huì)更好地集成Web Workers,以實(shí)現(xiàn)更高效的并發(fā)處理。
  • 更強(qiáng)大的Suspense功能:Suspense是React并發(fā)機(jī)制的核心組件之一,未來的版本可能會(huì)增強(qiáng)其功能,例如支持多個(gè)等待狀態(tài)、更細(xì)粒度的錯(cuò)誤處理等。
  • 優(yōu)化的數(shù)據(jù)流管理:React的上下文API和數(shù)據(jù)流管理一直是開發(fā)者關(guān)注的焦點(diǎn)。未來的React可能會(huì)進(jìn)一步優(yōu)化這些方面,以提供更高效、更簡潔的數(shù)據(jù)流解決方案。
  • 更好的服務(wù)器端渲染支持:隨著服務(wù)器端渲染(SSR)在現(xiàn)代Web應(yīng)用中的重要性日益增加,React可能會(huì)提供更好的SSR支持,包括更快的首屏加載時(shí)間、更好的SEO優(yōu)化等。

從長遠(yuǎn)來看,React的發(fā)展將更加注重性能、可維護(hù)性和開發(fā)者體驗(yàn),React目前的發(fā)展趨勢應(yīng)該是將自身打造為一個(gè)全棧底層的基座,同時(shí),隨著物聯(lián)網(wǎng)設(shè)備的普及,React也可能會(huì)拓展其在該領(lǐng)域的應(yīng)用。

到此這篇關(guān)于一文帶你了解React中的并發(fā)機(jī)制的文章就介紹到這了,更多相關(guān)React并發(fā)機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React Ref Callback使用場景最佳實(shí)踐詳解

    React Ref Callback使用場景最佳實(shí)踐詳解

    這篇文章主要為大家介紹了React Ref Callback使用場景最佳實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • react如何用懶加載減少首屏加載時(shí)間

    react如何用懶加載減少首屏加載時(shí)間

    這篇文章主要介紹了react如何利用懶加載減少首屏加載時(shí)間,幫助大家更好的理解和學(xué)習(xí)使用react,感興趣的朋友可以了解下
    2021-04-04
  • React組件的三種寫法總結(jié)

    React組件的三種寫法總結(jié)

    本文主要總結(jié)了React組件的三種寫法以及最佳實(shí)踐,具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • React18新增特性released的使用

    React18新增特性released的使用

    本文主要介紹了React18新增特性released的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • react16中的hooks的底層實(shí)現(xiàn)原理

    react16中的hooks的底層實(shí)現(xiàn)原理

    本文主要介紹了react16中的hooks的底層實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • ahooks?useRequest源碼精讀解析

    ahooks?useRequest源碼精讀解析

    這篇文章主要為大家介紹了ahooks?useRequest的源碼精讀解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 簡談創(chuàng)建React Component的幾種方式

    簡談創(chuàng)建React Component的幾種方式

    這篇文章主要介紹了創(chuàng)建React Component的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • 詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用

    詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用

    這篇文章主要介紹了詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • React useImperativeHandle處理組件狀態(tài)和生命周期用法詳解

    React useImperativeHandle處理組件狀態(tài)和生命周期用法詳解

    React Hooks 為我們提供了一種全新的方式來處理組件的狀態(tài)和生命周期,useImperativeHandle是一個(gè)相對較少被提及的Hook,但在某些場景下,它是非常有用的,本文將深討useImperativeHandle的用法,并通過實(shí)例來加深理解
    2023-09-09
  • react-json-editor-ajrm解析錯(cuò)誤與解決方案

    react-json-editor-ajrm解析錯(cuò)誤與解決方案

    由于歷史原因,項(xiàng)目中 JSON 編輯器使用的是 react-json-editor-ajrm,近期遇到一個(gè)嚴(yán)重的展示錯(cuò)誤,傳入編輯器的數(shù)據(jù)與展示的不一致,這是產(chǎn)品和用戶不可接受的,本文給大家介紹了react-json-editor-ajrm解析錯(cuò)誤與解決方案,需要的朋友可以參考下
    2024-06-06

最新評論

平安县| 嘉祥县| 莆田市| 杭州市| 九寨沟县| 平武县| 延边| 锡林郭勒盟| 土默特左旗| 金溪县| 乐清市| 乐清市| 福泉市| 隆安县| 京山县| 金昌市| 新龙县| 武汉市| 陵川县| 永平县| 阜平县| 罗平县| 晋城| 湛江市| 平定县| 共和县| 西宁市| 定州市| 山东| 枣庄市| 凤庆县| 开阳县| 沁阳市| 祁东县| 封丘县| 孝感市| 昆山市| 灵石县| 南木林县| 崇州市| 曲阜市|