国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【前端知識(shí)】React 基礎(chǔ)鞏固(二十三)——React 性能優(yōu)化 SCU相關(guān)

這篇具有很好參考價(jià)值的文章主要介紹了【前端知識(shí)】React 基礎(chǔ)鞏固(二十三)——React 性能優(yōu)化 SCU相關(guān)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

React 基礎(chǔ)鞏固(二十三)——React 性能優(yōu)化 SCU

React 更新機(jī)制

  • React 的渲染流程

    • JSX -> 虛擬 DOM -> 真實(shí) DOM
  • React 的更新流程

    • props/state 改變 -> render函數(shù)重新執(zhí)行 -> 產(chǎn)生新的DOM樹 -> 新舊DOM樹進(jìn)行diff -> 計(jì)算出差異進(jìn)行更新 -> 更新到真實(shí)的DOM
  • React 在 props 或 state 發(fā)生改變時(shí),會(huì)調(diào)用 React 的 render 方法,會(huì)創(chuàng)建一顆不同的樹

  • React 需要基于這兩顆不同的樹之間的差別來判斷如何有效的更新 UI

    • 如果一顆樹參考另外一顆樹進(jìn)行完全比較更新,那么即使時(shí)最先進(jìn)的算法,該算法的復(fù)雜度為 O(n^2),其中 n 是樹中元素的數(shù)量;
    • 如果在 React 中使用了該算法,那么展示 1000 個(gè)元素所需要執(zhí)行的計(jì)算量將在 10 億的量級(jí)范圍;
    • 開銷過于昂貴,更新性能非常低效;
  • 于是,React 對(duì)這個(gè)算法進(jìn)行了優(yōu)化,將其優(yōu)化成了 O(n)

    • 同層節(jié)點(diǎn)之間相互比較,不會(huì)跨節(jié)點(diǎn)比較
    • 不同類型的節(jié)點(diǎn),產(chǎn)生不同的樹結(jié)構(gòu)
    • 開發(fā)中,可以通過 key 來指定哪些節(jié)點(diǎn)在不同的渲染下保持穩(wěn)定
  • keys 的優(yōu)化

    • 遍歷列表時(shí),會(huì)提示一個(gè)警告,提示我們加入一個(gè) key 屬性
    • 當(dāng)子元素?fù)碛?key 時(shí),React 使用 key 來匹配原有樹上的子元素以及最新樹上的子元素
      • 例如將 key 為 333 的元素插入到最前面的位置時(shí),key 為 111,222 的元素,僅僅需要進(jìn)行位移即可,不需要任何修改
  • key 的注意事項(xiàng)

    • key 應(yīng)該是唯一的
    • key 不要使用隨機(jī)數(shù)(隨機(jī)數(shù)在下一次 render 時(shí),會(huì)重新生成一個(gè)數(shù)字)
    • 使用 index 作為 key,對(duì)性能是沒有優(yōu)化的
  • render 函數(shù)被調(diào)用

    • 為了避免不必要的 render,提高性能,調(diào)用 render 應(yīng)該有一個(gè)前提:依賴的數(shù)據(jù)(state、props)發(fā)生改變時(shí),再調(diào)用 render 方法
  • 利用shouldComponentUpdate優(yōu)化 render 調(diào)用


// 針對(duì)值發(fā)生變化的組件
shouldComponentUpdate(nextProps, newState){
  // 對(duì)比 state中的值是否有改變
  if (this.state.message !== newState.message || this.state.counter !== newState.counter){
    return true
  }
  return false
}

// 針對(duì)其中的子組件
shouldComponentUpdate(nextProps, newState){
  // 1.對(duì)比 state中的值是否有改變
  if (this.state.message !== newState.message || this.state.counter !== newState.counter){
    return true
  }
  // 2.檢測(cè)接收的props是否有改變
  if (this.props.message !== newProps.message){
    return true
  }
  return false
}
  • 如果參數(shù)過多,SCU 的方式則過于繁瑣,所以通常采用以下方式實(shí)現(xiàn)

針對(duì)類組件:采用PureComponent 實(shí)現(xiàn)優(yōu)化

import React, { PureComponent } from "react";
export class App extends PureComponent {
  // ...
}

PureComponent中變更數(shù)組數(shù)據(jù)的實(shí)際應(yīng)用:

import React, { PureComponent } from "react";

export class App extends PureComponent {
  constructor() {
    super();

    this.state = {
      books: [
        { name: "book1", price: 199, count: 1 },
        { name: "book2", price: 299, count: 1 },
        { name: "book3", price: 399, count: 2 },
        { name: "book4", price: 499, count: 3 },
        { name: "book5", price: 599, count: 1 },
      ],
    };
  }
  addNewBook() {
    const newBook = {
      name: "book6",
      price: 55,
      count: 1,
    };
    // 錯(cuò)誤寫法:
    // 直接修改原有的state,重新設(shè)置一遍
    // this.state.books.push(newBook);
    // this.setState({
    //   books: this.state.books,
    // });

    // 正確寫法:
    // 拷貝一份,在新的數(shù)組中更新,設(shè)置新的books,而不是直接修改state
    const books = [...this.state.books];
    books.push(newBook);
    this.setState({ books });
  }

  addBookCount(index) {
    console.log(index);
    const books = [...this.state.books];
    books[index].count++;
    this.setState({ books });
  }

  render() {
    const { books } = this.state;
    return (
      <div>
        <h2>books list</h2>
        <ul>
          {books.map((item, index) => {
            return (
              <li key={index}>
                <span>
                  name: {item.name} - price: {item.price} - count: {item.count}
                </span>
                <button onClick={(e) => this.addBookCount(index)}>+1</button>
              </li>
            );
          })}
        </ul>
        <button onClick={(e) => this.addNewBook()}>添加新書籍</button>
      </div>
    );
  }
}

export default App;

針對(duì)函數(shù)式組件:采用 memo 實(shí)現(xiàn)優(yōu)化文章來源地址http://www.zghlxwxcb.cn/news/detail-554828.html

import { memo } from "react";
const Profile = memo(function (props) {
  console.log("profile render");
  return <h2>Profile: {props.message}</h2>;
});

export default Profile;

到了這里,關(guān)于【前端知識(shí)】React 基礎(chǔ)鞏固(二十三)——React 性能優(yōu)化 SCU相關(guān)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【前端知識(shí)】React 基礎(chǔ)鞏固(三十三)——Redux的使用詳解

    【前端知識(shí)】React 基礎(chǔ)鞏固(三十三)——Redux的使用詳解

    針對(duì) React 基礎(chǔ)鞏固(三十二) 中的案例,我們希望抽取頁面中共有的代碼(例如下方的代碼),使用高階組件統(tǒng)一攔截。 為了讓react和redux產(chǎn)生聯(lián)系,安裝一款工具 react-redux 使用 react-redux ,在index.js中統(tǒng)一注入store 新建about.js頁面,通過 react-redux 引入store 在App.jsx中引入新的

    2024年02月15日
    瀏覽(40)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(二十六)——Portals 的使用

    【前端知識(shí)】React 基礎(chǔ)鞏固(二十六)——Portals 的使用

    通常,組件會(huì)渲染到 root 節(jié)點(diǎn)下??墒褂?Portals 將組件渲染至其他節(jié)點(diǎn)。 添加 id 為 more、modal 的 div 元素 構(gòu)建 Modal.jsx, 通過 createPortal 把組件渲染到指定的 modal 節(jié)點(diǎn)下 構(gòu)建 App.jsx 查看渲染結(jié)果

    2024年02月16日
    瀏覽(47)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(二十九)——過渡動(dòng)畫 react-transition-group

    react-transition-group 包含: Transition(該組件是一個(gè)和平臺(tái)無關(guān)的組件,不一定結(jié)合 CSS) CSSTransition(通常使用此組件實(shí)現(xiàn)過渡動(dòng)畫效果) SwitchTransition(兩個(gè)組件顯示/隱藏切換時(shí)使用) TransitionGroup(將多個(gè)動(dòng)畫包裹其中,一般用于列表中元素的動(dòng)畫) CSSTransition CSSTransition 基于

    2024年02月16日
    瀏覽(60)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(三十四)——組件中的異步操作及優(yōu)化

    【前端知識(shí)】React 基礎(chǔ)鞏固(三十四)——組件中的異步操作及優(yōu)化

    通過組件的生命周期來完成網(wǎng)絡(luò)請(qǐng)求,網(wǎng)絡(luò)請(qǐng)求的異步代碼直接放在組件中 通過redux來管理異步網(wǎng)絡(luò)請(qǐng)求 在store中引入中間件 redux-thunk 構(gòu)建 fetchHomeMultidataAction ,將原本在組件中的異步請(qǐng)求代碼放入到actionCreators.js中 改寫原來的category.jsx,派發(fā)異步請(qǐng)求的dispatch 查看運(yùn)行結(jié)果

    2024年02月15日
    瀏覽(38)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(三十一)——store數(shù)據(jù)的訂閱和Redux的優(yōu)化

    【前端知識(shí)】React 基礎(chǔ)鞏固(三十一)——store數(shù)據(jù)的訂閱和Redux的優(yōu)化

    store/index.js test.js redux代碼優(yōu)化: 將派發(fā)的action生成過程放到一個(gè)actionCreators函數(shù)中 將定義的所有actionCreators的函數(shù),放到一個(gè)獨(dú)立的文件中:actionCreators.js actionCreators 和 reducer 函數(shù)中使用字符串常量是一致的,所以將常量抽取到一個(gè)獨(dú)立的constants.js文件中 將reducer和默認(rèn)值(

    2024年02月15日
    瀏覽(37)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(四十)——Navigate導(dǎo)航

    【前端知識(shí)】React 基礎(chǔ)鞏固(四十)——Navigate導(dǎo)航

    新建Login頁面,在Login中引入Navigate,實(shí)現(xiàn)點(diǎn)擊登陸按鈕跳轉(zhuǎn)至 /home 路徑下: 當(dāng)路由均無匹配時(shí),通過Navigate跳轉(zhuǎn)至NotFound界面,其中 * 為通配符: 構(gòu)建NotFound.jsx 在App.jsx中配置NotFound: 構(gòu)建Home的子路由頁面: HomeRecommend.jsx HomeRanking.jsx 利用 Route 嵌套子路由,實(shí)現(xiàn)Home頁面下的

    2024年02月14日
    瀏覽(28)
  • 【前端知識(shí)】React基礎(chǔ)鞏固(二)——JSX注意點(diǎn)

    createElement存在的問題: 繁瑣不簡(jiǎn)潔 不直觀,無法一眼看出所描述的結(jié)構(gòu) 不優(yōu)雅,開發(fā)體驗(yàn)不好 JSX 簡(jiǎn)介:JSX 是 JavaScript XML 的簡(jiǎn)寫,表示了在JS代碼中寫XML(HTML)格式的代碼 優(yōu)勢(shì):聲明式語法更加直觀,與HTML結(jié)構(gòu)相同,降低學(xué)習(xí)成本,提高開發(fā)效率 JSX 是 react 的核心內(nèi)容‘

    2024年02月09日
    瀏覽(28)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(四十二)——React Hooks的介紹

    【前端知識(shí)】React 基礎(chǔ)鞏固(四十二)——React Hooks的介紹

    Hook 是 React 16.8 的新增特性,它可以讓我們?cè)诓痪帉慶lass的情況下使用state以及其他的React特性(比如生命周期)。 class組件 VS 函數(shù)式組件: class的優(yōu)勢(shì): class組件可以定義自己的state,用來保存組件自己內(nèi)部的狀態(tài);而函數(shù)式組件不可以,因?yàn)楹瘮?shù)每次調(diào)用都會(huì)產(chǎn)生新的臨時(shí)

    2024年02月14日
    瀏覽(33)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(十七)——組件化開發(fā)(一)

    什么是組件化開發(fā)? 分而治之的思想 將一個(gè)頁面拆分成一個(gè)個(gè)小的功能塊 將應(yīng)用抽象成一顆組件樹 React的組件相對(duì)于Vue更加的靈活和多樣 按照不同的方式可以分為很多類組件 根據(jù) 組件的定義方式 ,分為: 函數(shù)組件 、 類組件 根據(jù) 組件內(nèi)部是否有狀態(tài)需要維護(hù) ,分為:

    2024年02月12日
    瀏覽(54)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(三十五)——ReduxToolKit (RTK)

    【前端知識(shí)】React 基礎(chǔ)鞏固(三十五)——ReduxToolKit (RTK)

    Redux Tool Kit (RTK)是官方推薦的編寫Redux邏輯的方法,旨在成為編寫Redux邏輯的標(biāo)準(zhǔn)方式,從而解決上面提到的問題。 RTK的核心API主要有如下幾個(gè): configureStore:包裝createStore以提供簡(jiǎn)化的配置選項(xiàng)和良好的默認(rèn)值。它可以自動(dòng)組合你的slice reducer,添加你提供的任何Redux中間件

    2024年02月15日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包