React 18 鏂扮壒鎬ц瑙?- 骞冲钩鐨勫皬鐮寸珯

React 18 鏂扮壒鎬ц瑙?/h1>

React 18 甯︽潵浜嗚澶氫护浜哄叴濂嬬殑鏂扮壒鎬э紝杩欎簺鐗规€ф棬鍦ㄦ彁楂樺簲鐢ㄦ€ц兘銆佹敼鍠勫紑鍙戣€呬綋楠岋紝骞朵负鏈潵鐨凴eact鍙戝睍濂犲畾鍩虹銆傛湰鏂囧皢璇︾粏浠嬬粛React 18鐨勬牳蹇冩柊鐗规€у強鍏朵娇鐢ㄦ柟娉曘€?/p>

1. 骞跺彂娓叉煋 (Concurrent Rendering)

骞跺彂娓叉煋鏄疪eact 18鏈€閲嶈鐨勬柊鐗规€т箣涓€锛屽畠鍏佽React鍚屾椂澶勭悊澶氫釜娓叉煋浠诲姟锛岃€屼笉鏄儚涔嬪墠鐗堟湰閭f牱蹇呴』瀹屾垚涓€涓换鍔″悗鎵嶈兘寮€濮嬩笅涓€涓€?/p>

鏍稿績姒傚康

骞跺彂娓叉煋閫氳繃鏃堕棿鍒囩墖锛圱ime Slicing锛夊拰浼樺厛绾ц皟搴︼紙Priority Scheduling锛夊疄鐜帮紝鍙互璁㏑eact鍦ㄦ覆鏌撳ぇ鍨嬬粍浠舵椂涓嶄細闃诲鐢ㄦ埛鐣岄潰锛屼粠鑰屾彁渚涙洿娴佺晠鐨勭敤鎴蜂綋楠屻€?/p>

1.1 createRoot API

React 18寮曞叆浜嗘柊鐨勬牴鑺傜偣鍒涘缓API `createRoot`锛屾浛浠d簡鏃х殑 `render` 鏂规硶锛?/p>

绀轰緥锛氫娇鐢?createRoot

// React 17
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

// React 18
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

2. 鑷姩鎵瑰鐞?(Automatic Batching)

鑷姩鎵瑰鐞嗘槸React 18鐨勫彟涓€涓噸瑕佺壒鎬э紝瀹冨彲浠ュ皢澶氫釜鐘舵€佹洿鏂板悎骞朵负涓€娆℃覆鏌擄紝浠庤€屾彁楂樺簲鐢ㄦ€ц兘銆?/p>

宸ヤ綔鍘熺悊

鍦≧eact 17涓紝鍙湁鍦≧eact浜嬩欢澶勭悊鍑芥暟涓殑鐘舵€佹洿鏂颁細琚壒澶勭悊锛岃€屽湪Promise銆乻etTimeout绛夊紓姝ユ搷浣滀腑鐨勭姸鎬佹洿鏂颁笉浼氳鎵瑰鐞嗐€俁eact 18鍒欏皢鎵瑰鐞嗘墿灞曞埌浜嗘墍鏈夌姸鎬佹洿鏂帮紝鏃犺瀹冧滑鍙戠敓鍦ㄤ綍澶勩€?/p>

2.1 绀轰緥

鑷姩鎵瑰鐞嗙ず渚?/h4>
// React 17 涓紝杩欎簺鏇存柊涓嶄細琚壒澶勭悊
fetch('https://api.example.com/data')
  .then(() => {
    setCount(c => c + 1); // 瑙﹀彂娓叉煋
    setFlag(f => !f); // 瑙﹀彂鍙︿竴娆℃覆鏌?  });

// React 18 涓紝杩欎簺鏇存柊浼氳鎵瑰鐞?fetch('https://api.example.com/data')
  .then(() => {
    setCount(c => c + 1);
    setFlag(f => !f);
    // 鍙Е鍙戜竴娆℃覆鏌?  });

3. Suspense 鏀硅繘

React 18瀵筍uspense杩涜浜嗛噸澶ф敼杩涳紝浣垮叾鏇村姞鍙潬鍜屽己澶с€?/p>

3.1 骞跺彂 Suspense

React 18寮曞叆浜嗗苟鍙慡uspense锛屽厑璁窻eact鍦ㄧ瓑寰呮暟鎹姞杞界殑鍚屾椂缁х画娓叉煋鍏朵粬閮ㄥ垎鐨刄I銆?/p>

骞跺彂 Suspense 绀轰緥

function App() {
  return (
    <Suspense fallback={<Loading />}
      <div>
        <Header />
        <Suspense fallback={<PostSkeleton />}
          <Posts />
        </Suspense>
        <Footer />
      </div>
    </Suspense>
  );
}

3.2 鏂扮殑 SuspenseList 缁勪欢

React 18寮曞叆浜?`SuspenseList` 缁勪欢锛岀敤浜庢帶鍒跺涓猄uspense缁勪欢鐨勬樉绀洪『搴忥細

SuspenseList 绀轰緥

import { Suspense, SuspenseList } from 'react';

function App() {
  return (
    <SuspenseList revealOrder="forwards" tail="collapsed">
      <Suspense fallback={<Loading />}
        <Profile />
      </Suspense>
      <Suspense fallback={<Loading />}
        <Posts />
      </Suspense>
      <Suspense fallback={<Loading />}
        <Comments />
      </Suspense>
    </SuspenseList>
  );
}

4. 鏂扮殑 Hook

React 18寮曞叆浜嗗嚑涓柊鐨凥ook锛屼互鏀寔骞跺彂娓叉煋鍜屽叾浠栨柊鐗规€с€?/p>

4.1 useId

`useId` Hook鐢ㄤ簬鐢熸垚鍞竴鐨処D锛岀壒鍒€傜敤浜庢湇鍔″櫒绔覆鏌撳拰瀹㈡埛绔覆鏌撲箣闂寸殑涓€鑷存€э細

useId 绀轰緥

import { useId } from 'react';

function Input() {
  const id = useId();
  return (
    <div>
      <label htmlFor={id}>鐢ㄦ埛鍚?lt;/label>
      <input id={id} type="text" />
    </div>
  );
}

4.2 useTransition

`useTransition` Hook鐢ㄤ簬鏍囪鏌愪簺鐘舵€佹洿鏂颁负浣庝紭鍏堢骇锛屼粠鑰岄伩鍏嶉樆濉炵敤鎴风晫闈細

useTransition 绀轰緥

import { useTransition, useState } from 'react';

function Search() {
  const [isPending, startTransition] = useTransition();
  const [query, setQuery] = useState('');
  const [results, setResults] = useState([]);

  function handleSearch(e) {
    const newQuery = e.target.value;
    setQuery(newQuery);
    
    startTransition(() => {
      // 杩欐槸涓€涓綆浼樺厛绾ф洿鏂?      setResults(searchData(newQuery));
    });
  }

  return (
    <div>
      <input type="text" value={query} onChange={handleSearch} />
      {isPending ? <div>鎼滅储涓?..</div> : <Results results={results} />}
    </div>
  );
}

4.3 useDeferredValue

`useDeferredValue` Hook鐢ㄤ簬寤惰繜鏇存柊鏌愪簺鍊硷紝鐩村埌鍏朵粬鏇撮噸瑕佺殑鏇存柊瀹屾垚锛?/p>

useDeferredValue 绀轰緥

import { useDeferredValue, useState } from 'react';

function SearchResults() {
  const [query, setQuery] = useState('');
  const deferredQuery = useDeferredValue(query);
  const results = useMemo(() => searchData(deferredQuery), [deferredQuery]);

  return (
    <div>
      <input type="text" value={query} onChange={(e) => setQuery(e.target.value)} />
      <Results results={results} />
    </div>
  );
}

5. 鍏朵粬鏀硅繘

  • 涓ユ牸妯″紡鏀硅繘锛歊eact 18鐨勪弗鏍兼ā寮忎細鍦ㄥ紑鍙戠幆澧冧腑妯℃嫙缁勪欢鐨勫嵏杞藉拰閲嶆柊鎸傝浇锛屼互甯姪寮€鍙戣€呭彂鐜版綔鍦ㄩ棶棰樸€?/li>
  • 閿欒杈圭晫鏀硅繘锛氶敊璇竟鐣岀幇鍦ㄥ彲浠ユ崟鑾锋洿澶氱被鍨嬬殑閿欒锛屽寘鎷紓姝ラ敊璇€?/li>
  • 鏈嶅姟绔覆鏌撴敼杩?/strong>锛歊eact 18鏀硅繘浜嗘湇鍔$娓叉煋鐨勬€ц兘鍜屽彲闈犳€э紝鏀寔娴佸紡娓叉煋銆?/li>

6. 杩佺Щ鎸囧崡

浠嶳eact 17杩佺Щ鍒癛eact 18鐩稿绠€鍗曪紝涓昏闇€瑕佹敞鎰忎互涓嬪嚑鐐癸細

  1. 浣跨敤鏂扮殑 `createRoot` API 鏇夸唬鏃х殑 `render` 鏂规硶
  2. 妫€鏌ュ苟鏇存柊渚濊禆浜庢棫鎵瑰鐞嗚涓虹殑浠g爜
  3. 鍒╃敤鏂扮殑Hook鍜孲uspense鏀硅繘鏉ヤ紭鍖栧簲鐢ㄦ€ц兘

7. 鎬荤粨

React 18鏄竴涓噸澶ф洿鏂帮紝寮曞叆浜嗗苟鍙戞覆鏌撱€佽嚜鍔ㄦ壒澶勭悊銆丼uspense鏀硅繘绛夎澶氭柊鐗规€э紝杩欎簺鐗规€т笉浠呮彁楂樹簡搴旂敤鎬ц兘锛屼篃鏀瑰杽浜嗗紑鍙戣€呬綋楠屻€傞€氳繃鍚堢悊浣跨敤杩欎簺鏂扮壒鎬э紝寮€鍙戣€呭彲浠ユ瀯寤烘洿娴佺晠銆佹洿鍝嶅簲鐨凴eact搴旂敤銆?/p>

闅忕潃React鐨勪笉鏂彂灞曪紝鎴戜滑鍙互鏈熷緟鏈潵浼氭湁鏇村浠や汉鍏村鐨勭壒鎬у拰鏀硅繘銆俁eact 18涓烘垜浠墦寮€浜嗕竴鎵囬€氬悜鏇撮珮鏁堛€佹洿鍙潬鐨勫墠绔紑鍙戠殑澶ч棬銆?/p>