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

React 組件的狀態(tài)下移和內(nèi)容提升的操作方法

 更新時(shí)間:2022年11月26日 15:06:41   作者:前端小二哥  
這篇文章主要介紹了React 組件的狀態(tài)下移和內(nèi)容提升,通過代碼講解了渲染性能的組件問題結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下

前言

本專欄的另一篇文章,講到了 useMemo 有一定的開銷,不能濫用,本篇文章講解兩個(gè)簡單實(shí)用的優(yōu)化組件渲染性能的方法:

  • 狀態(tài)下移
  • 內(nèi)容提升

在講解這兩種方法之前,我們需要先手動(dòng)創(chuàng)建一個(gè)有嚴(yán)重渲染性能的組件,如下所示:

import { useState } from 'react';

export default function App() {
  let [color, setColor] = useState('red');
  return (
    <div>
      <input value={color} onChange={(e) => setColor(e.target.value)} />
      <p style={{ color }}>Hello, world!</p>
      <ExpensiveTree />
    </div>
  );
}

function ExpensiveTree() {
  let now = performance.now();
  while (performance.now() - now < 100) {
    // Artificial delay -- do nothing for 100ms
  }
  return <p>I am a very slow component tree.</p>;
}

很顯然,當(dāng) App 組件內(nèi)的狀態(tài)發(fā)生了改變,ExpensiveTree 組件會(huì) re-render, 事實(shí)上 ExpensiveTree 組件的 props、state 并未發(fā)生改變,這并不是我們期望的結(jié)果,下面將提供兩種簡單的方法,提升組件渲染的性能;

狀態(tài)下移

export default function App() {
  let [color, setColor] = useState('red');
  return (
    <div>
      <input value={color} onChange={(e) => setColor(e.target.value)} />
      <p style={{ color }}>Hello, world!</p>
      <ExpensiveTree />
    </div>
  );
}

我們可以看到以上 ExpensiveTree 組件并不依賴 App 組件內(nèi)部的狀態(tài),因此我們是否可以考慮,將依賴 color 的元素抽離到一個(gè)依賴 color 的組件中呢?
下面是實(shí)踐后的代碼:

export default function App() {
  return (
    <>
      <Form />
      <ExpensiveTree />
    </>
  );
}

function Form() {
  let [color, setColor] = useState('red');
  return (
    <>
      <input value={color} onChange={(e) => setColor(e.target.value)} />
      <p style={{ color }}>Hello, world!</p>
    </>
  );
}

此時(shí),將依賴 color 的元素提取到了 Form 組件中,F(xiàn)orm 組件內(nèi)部的狀態(tài)不再影響 ExpensiveTree 組件的渲染,問題便得到了解決

內(nèi)容提升

export default function App() {
  let [color, setColor] = useState('red');
  return (
    <div style={{ color }}>
      <input value={color} onChange={(e) => setColor(e.target.value)} />
      <p>Hello, world!</p>
      <ExpensiveTree />
    </div>
  );
}

以上情況是高開銷組件 ExpensiveTree 的父節(jié)點(diǎn)依賴 color,此時(shí)顯然狀態(tài)下移是行不通的,但是還有另外一種辦法:

export default function App() {
  return (
    <ColorPicker>
      <p>Hello, world!</p>
      <ExpensiveTree />
    </ColorPicker>
  );
}

function ColorPicker({ children }) {
  let [color, setColor] = useState("red");
  return (
    <div style={{ color }}>
      <input value={color} onChange={(e) => setColor(e.target.value)} />
      {children}
    </div>
  );
}

此時(shí)和狀態(tài)提升是完全相反的,將依賴 color 的元素提升到了 ColorPicker 組件中,而不依賴 color 的元素以 children prop 的形式傳入了 ColorPicker ,當(dāng)組件內(nèi)部的狀態(tài)改變時(shí):

  • ColorPicker 會(huì)重新渲染但是它仍然保存著
  • ColorPicker 的 children 屬性未變化 React 并不會(huì)訪問那棵子樹。 因此,ExpensiveTree不會(huì)重新渲染。

本文提供的方法并不是新的創(chuàng)意,大家一定都有所實(shí)踐,但是我想表達(dá)的是,相比于濫用 useMemo,我們需要首先考慮使用這兩種提高組件渲染性能的方法;

到此這篇關(guān)于React 組件的狀態(tài)下移和內(nèi)容提升的文章就介紹到這了,更多相關(guān)React 組件狀態(tài)下移內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

辛集市| 南和县| 林甸县| 射洪县| 碌曲县| 江华| 鄂托克前旗| 绥阳县| 镇赉县| 嵊泗县| 浏阳市| 当阳市| 潢川县| 佳木斯市| 河源市| 虞城县| 浮梁县| 武穴市| 南安市| 阜阳市| 兴国县| 三江| 祁阳县| 万载县| 天津市| 新竹市| 富民县| 九江市| 武山县| 通海县| 余姚市| 德令哈市| 九龙坡区| 诏安县| 金阳县| 商都县| 资兴市| 白沙| 无锡市| 班戈县| 沈阳市|