日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

React性能優(yōu)化之useMemo、useCallback

來源: 責(zé)編: 時(shí)間:2023-11-02 09:09:43 340觀看
導(dǎo)讀前言在React應(yīng)用程序中進(jìn)行性能優(yōu)化至關(guān)重要,因?yàn)樗苯佑绊懹脩趔w驗(yàn),隨后影響轉(zhuǎn)化率和用戶留存率。一個(gè)經(jīng)過優(yōu)化的React應(yīng)用加載更快,響應(yīng)迅速,消耗更少的資源,從而為用戶提供更順暢的互動(dòng)體驗(yàn)。優(yōu)化React應(yīng)用程序的性能

前言

在React應(yīng)用程序中進(jìn)行性能優(yōu)化至關(guān)重要,因?yàn)樗苯佑绊懹脩趔w驗(yàn),隨后影響轉(zhuǎn)化率和用戶留存率。一個(gè)經(jīng)過優(yōu)化的React應(yīng)用加載更快,響應(yīng)迅速,消耗更少的資源,從而為用戶提供更順暢的互動(dòng)體驗(yàn)。優(yōu)化React應(yīng)用程序的性能對(duì)于保留和吸引用戶、降低跳出率以及最終實(shí)現(xiàn)所期望的業(yè)務(wù)結(jié)果至關(guān)重要。Vpw28資訊網(wǎng)——每日最新資訊28at.com

記憶化(Memoization)是改善React應(yīng)用程序性能的一種方式。記憶化涉及緩存值和函數(shù)以實(shí)現(xiàn)更快的渲染。Vpw28資訊網(wǎng)——每日最新資訊28at.com

在本文中,我們將了解什么是記憶化以及如何使用useMemo和useCallback鉤子來實(shí)現(xiàn)記憶化。Vpw28資訊網(wǎng)——每日最新資訊28at.com

理解React中的記憶化

記憶化是存儲(chǔ)計(jì)算結(jié)果的過程,以便在不重新計(jì)算的情況下檢索它。記憶化用于跳過組件的不必要重新渲染。Vpw28資訊網(wǎng)——每日最新資訊28at.com

在React中,可以通過使用useMemo和useCallback鉤子來實(shí)現(xiàn)記憶化。這些鉤子允許你通過緩存函數(shù)調(diào)用和函數(shù)本身來跳過重新渲染。Vpw28資訊網(wǎng)——每日最新資訊28at.com

使用useMemo入門

useMemo鉤子用于緩存函數(shù)調(diào)用。useMemo鉤子接受兩個(gè)參數(shù):Vpw28資訊網(wǎng)——每日最新資訊28at.com

  • 函數(shù)
  • 依賴項(xiàng)數(shù)組
const doubledNumber = useMemo(() => {  return someExpensiveCalculation(number);}, [number]);

useMemo鉤子在第一次渲染時(shí)返回調(diào)用函數(shù)的結(jié)果。在后續(xù)重新渲染中,useMemo鉤子將提供你的函數(shù)調(diào)用的緩存值,除非至少一個(gè)依賴項(xiàng)發(fā)生更改。Vpw28資訊網(wǎng)——每日最新資訊28at.com

在JavaScript中,函數(shù)在代碼再次運(yùn)行時(shí)會(huì)被重新創(chuàng)建。這意味著盡管函數(shù)的代碼相同,但每次應(yīng)用程序重新渲染時(shí),你的函數(shù)并不相同。這是因?yàn)镴avaScript對(duì)象和函數(shù)是引用對(duì)象。Vpw28資訊網(wǎng)——每日最新資訊28at.com

useMemo鉤子旨在通過緩存調(diào)用函數(shù)的結(jié)果來消除函數(shù)的重新創(chuàng)建。在后續(xù)重新渲染中,useMemo鉤子會(huì)返回緩存的值,跳過函數(shù)的重新創(chuàng)建。Vpw28資訊網(wǎng)——每日最新資訊28at.com

讓我們通過一個(gè)實(shí)際示例來了解如何在React中使用useMemo。Vpw28資訊網(wǎng)——每日最新資訊28at.com

在這個(gè)示例中,我們正在對(duì)幾千篇博客文章進(jìn)行排序,并將每篇博客文章顯示在屏幕上。在每次重新渲染時(shí)對(duì)博客文章進(jìn)行排序可能會(huì)減慢我們的應(yīng)用程序。Vpw28資訊網(wǎng)——每日最新資訊28at.com

使用useMemo鉤子來跳過博客文章的排序,如果文章列表沒有更改。Vpw28資訊網(wǎng)——每日最新資訊28at.com

function PostList({ posts }) {  const sortedPosts = useMemo(() => {    return [...posts].sort((a, b) => a.date - b.date);  }, [posts]);  return (    <div>      <h2>已排序的文章</h2>      <ul>        {sortedPosts.map((post) => (          <li key={post.id}>{post.title}</li>        ))}      </ul>    </div>  );}

useMemo鉤子用于緩存sortedPosts。只有在posts的值更改時(shí),sortedPosts才會(huì)重新計(jì)算。Vpw28資訊網(wǎng)——每日最新資訊28at.com

通過這種方式,排序操作僅在文章數(shù)組更改時(shí)發(fā)生,從而跳過重新渲染并提高性能。Vpw28資訊網(wǎng)——每日最新資訊28at.com

充分利用useCallback的能力

useCallback用于緩存函數(shù)聲明。它同樣接受兩個(gè)參數(shù):Vpw28資訊網(wǎng)——每日最新資訊28at.com

  • 函數(shù)
  • 依賴項(xiàng)數(shù)組

與useMemo不同,useCallback不會(huì)調(diào)用你的函數(shù)。useCallback只是將函數(shù)返回給你。你可以自行決定何時(shí)以及是否調(diào)用函數(shù)。Vpw28資訊網(wǎng)——每日最新資訊28at.com

useCallback鉤子的工作方式與useMemo鉤子類似。useCallback通過返回函數(shù)的緩存版本來消除函數(shù)的重新創(chuàng)建。只有在依賴項(xiàng)中的至少一個(gè)值發(fā)生更改時(shí),才會(huì)重新創(chuàng)建你的函數(shù)。Vpw28資訊網(wǎng)——每日最新資訊28at.com

讓我們看一個(gè)使用useCallback來優(yōu)化React應(yīng)用程序的示例。Vpw28資訊網(wǎng)——每日最新資訊28at.com

在React組件中,當(dāng)單擊按鈕時(shí),你有一個(gè)對(duì)產(chǎn)品數(shù)組進(jìn)行排序的函數(shù)。在每次重新渲染時(shí),這個(gè)排序函數(shù)都會(huì)被重新創(chuàng)建。Vpw28資訊網(wǎng)——每日最新資訊28at.com

使用useCallback鉤子來緩存sortPosts函數(shù)聲明,以及posts狀態(tài)作為一個(gè)依賴項(xiàng)。Vpw28資訊網(wǎng)——每日最新資訊28at.com

import React, { useState, useCallback } from 'react';function PostList() {  const [posts, setPosts] = useState([    { id: 1, title: '文章1', date: new Date('2023-10-15T00:00:00.000Z') },    { id: 2, title: '文章2', date: new Date('2023-10-10T00:00:00.000Z') },    { id: 3, title: '文章3', date: new Date('2023-10-20T00:00:00.000Z') },  ]);  const sortPosts = useCallback(() => {    const sortedPosts = [...posts].sort((a, b) => a.date - b.date);    setPosts(sortedPosts);  }, [posts]);  return (    <div>      <button onClick={sortPosts}>排序文章</button>      <ul>        {posts.map((post) => (          <li key={post.id}>{post.title}</li>        )}      </ul>    </div>  );}export default PostList;

現(xiàn)在,只有當(dāng)posts狀態(tài)更改時(shí),sortPosts函數(shù)才會(huì)被重新創(chuàng)建,從而提高我們的React應(yīng)用程序性能。Vpw28資訊網(wǎng)——每日最新資訊28at.com

通過結(jié)合使用useCallback和useMemo來優(yōu)化性能

useCallback和useMemo鉤子可以一起使用,以獲得顯著的性能提升。Vpw28資訊網(wǎng)——每日最新資訊28at.com

React組件重新渲染依賴以下兩個(gè)條件:Vpw28資訊網(wǎng)——每日最新資訊28at.com

  • 狀態(tài)發(fā)生變化
  • 屬性發(fā)生變化

通過useCallback鉤子,你可以緩存屬性(如果是一個(gè)函數(shù)),然后將其傳遞給包裝在useMemo中的子組件。Vpw28資訊網(wǎng)——每日最新資訊28at.com

接下來看一個(gè)將useCallback與useMemo結(jié)合使用的示例。Vpw28資訊網(wǎng)——每日最新資訊28at.com

假設(shè)你正在為網(wǎng)站開發(fā)產(chǎn)品列表頁面。用戶可以根據(jù)價(jià)格、品牌和類別等各種標(biāo)準(zhǔn)對(duì)產(chǎn)品進(jìn)行篩選和排序。Vpw28資訊網(wǎng)——每日最新資訊28at.com

如果不使用useCallback和useMemo鉤子,你的ProductList組件將如下所示:Vpw28資訊網(wǎng)——每日最新資訊28at.com

javascriptCopy codeimport React, { useState } from 'react';function ProductList({ products }) {  const [filter, setFilter] = useState('');  const [sortBy, setSortBy] = useState('price');  // 根據(jù)用戶輸入篩選產(chǎn)品  const filteredProducts = products.filter(product =>    product.title.toLowerCase().includes(filter.toLowerCase())  );  // 對(duì)篩選后的產(chǎn)品進(jìn)行排序  const sortedProducts = [...filteredProducts].sort((a, b) => {    if (sortBy === 'price') {      return a.price - b.price;    } else if sortBy === 'rating') {      return b.rating - a.rating;    }    // 在這里處理其他排序條件  });  // 處理篩選更改  const handleFilterChange = (event) => {    setFilter(event.target.value);  };  // 處理排序更改  const handleSortChange = (event) => {    setSortBy(event.target.value);  };  return (    <div>      <input        type="text"        placeholder="篩選產(chǎn)品"        value={filter}        onChange={handleFilterChange}      />      <select value={sortBy} onChange={handleSortChange}>        <option value="price">價(jià)格</option>        <option value="rating">評(píng)分</option>        {/* 根據(jù)需要添加更多排序選項(xiàng) */}      </select>      <ul>        {sortedProducts.map(product => (          <li key={product.id}>{product.title}</li>        )}      </ul>    </div>  );}export default ProductList;

雖然ProductList組件沒有問題,但它可能導(dǎo)致不必要的重新渲染和性能瓶頸。Vpw28資訊網(wǎng)——每日最新資訊28at.com

如果ProductList處理大量產(chǎn)品,不必要的重新渲染會(huì)減慢你的電子商務(wù)站點(diǎn)。Vpw28資訊網(wǎng)——每日最新資訊28at.com

使用useMemo和useCallback鉤子來減輕不必要的重新渲染并加速你的網(wǎng)站。Vpw28資訊網(wǎng)——每日最新資訊28at.com

javascriptCopy codeimport React, { useState, useMemo, useCallback } from 'react';function ProductList({ products }) {  const [filter, setFilter] = useState('');  const [sortBy, setSortBy] = useState('price');  // 根據(jù)用戶輸入篩選產(chǎn)品  const filteredProducts = useMemo(() => {    return products.filter(product => product.title.toLowerCase().includes(filter.toLowerCase()));  }, [products, filter]);  // 對(duì)篩選后的產(chǎn)品進(jìn)行排序  const sortedProducts = useMemo(() => {    return [...filteredProducts].sort((a, b) => {      if (sortBy === 'price') {        return a.price - b.price;      } else if sortBy === 'rating') {        return b.rating - a.rating;      }      // 在這里處理其他排序條件    });  }, [filteredProducts, sortBy]);  // 記憶化回調(diào)來處理篩選更改  const handleFilterChange = useCallback((event) => {    setFilter(event.target.value);  }, []);  // 記憶化回調(diào)來處理排序更改  const handleSortChange = useCallback((event) => {    setSortBy(event.target.value);  }, []);  return (    <div>      <input        type="text"        placeholder="篩選產(chǎn)品"        value={filter}        onChange={handleFilterChange}      />      <select value={sortBy} onChange={handleSortChange}>        <option value="price">價(jià)格</option>        <option value="rating">評(píng)分</option>        {/* 根據(jù)需要添加更多排序選項(xiàng) */}      </select>      <ul>        {sortedProducts.map(product => (          <li key={product.id}>{product.title}</li>        )}      </ul>    </div>  );}export default ProductList;

在這個(gè)經(jīng)過優(yōu)化的ProductList組件版本中,useMemo用于優(yōu)化篩選和排序操作,而useCallback用于記憶化篩選和排序更改的事件處理程序函數(shù)。ProductList組件僅在products的值發(fā)生變化時(shí)重新渲染。Vpw28資訊網(wǎng)——每日最新資訊28at.com

注意事項(xiàng)

盡管useMemo和useCallback是性能優(yōu)化鉤子,但開發(fā)人員往往會(huì)過度使用這些鉤子。有些情況下,使用useMemo和useCallback并不對(duì)你的應(yīng)用程序產(chǎn)生大的收益。由于現(xiàn)代計(jì)算機(jī)的快速性質(zhì),大多數(shù)操作都是廉價(jià)的。在操作廉價(jià)的情況下,你不需要useMemo和useCallback鉤子。例如,你有一個(gè)要排序的包含100個(gè)帖子的數(shù)組。使用useMemo或useCallback鉤子不會(huì)帶來任何性能提升,因?yàn)榕判虿僮髦恍枰獛缀撩搿?span style="display:none">Vpw28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

記憶化用于提高React應(yīng)用程序的性能,記憶化用于跳過組件的不必要重新渲染。useMemo和useCallback鉤子分別用于記憶化返回值和函數(shù)聲明。雖然useMemo和useCallback的行為類似,但兩者之間存在關(guān)鍵差異。useMemo返回調(diào)用函數(shù)的結(jié)果;useCallback返回函數(shù)本身。Vpw28資訊網(wǎng)——每日最新資訊28at.com

useMemo和useCallback鉤子有助于優(yōu)化性能,但使用它們也可能帶來一些潛在問題,如過度優(yōu)化和增加代碼復(fù)雜性。Vpw28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-16535-0.htmlReact性能優(yōu)化之useMemo、useCallback

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 七個(gè)殺手級(jí)IntelliJ IDEA插件

下一篇: 你寫的Python代碼到底多快?這些測(cè)試工具了解了解

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 7月安卓手機(jī)性能榜:紅魔8S Pro再奪榜首

    7月份的手機(jī)市場(chǎng)風(fēng)平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領(lǐng)先版處理器的新機(jī)之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機(jī)廠商修整的時(shí)間,進(jìn)入8月份之
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團(tuán)隊(duì)做了容器化,但是帶來的問題是服務(wù)配置文件很麻煩,然后大家在群里進(jìn)行了“親切友好”的溝通圖片圖片圖片圖片對(duì)比就對(duì)比,簡(jiǎn)單對(duì)比下獨(dú)立配置中心和k8s作為配
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時(shí)間業(yè)務(wù)團(tuán)隊(duì)偶爾會(huì)碰到一些 Pulsar 使用的問題,比如消息阻塞不消費(fèi)了、生產(chǎn)者消息發(fā)送緩慢等各種問題。雖然我們有個(gè)監(jiān)控頁面可以根據(jù) topic 維度查看他的發(fā)送狀態(tài),
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過購物網(wǎng)站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結(jié)合這個(gè)小小的重要功能可以大大改善您網(wǎng)站的用戶體驗(yàn)
  • 深度探索 Elasticsearch 8.X:function_score 參數(shù)解讀與實(shí)戰(zhàn)案例分析

    在 Elasticsearch 中,function_score 可以讓我們?cè)诓樵兊耐瑫r(shí)對(duì)搜索結(jié)果進(jìn)行自定義評(píng)分。function_score 提供了一系列的參數(shù)和函數(shù)讓我們可以根據(jù)需求靈活地進(jìn)行設(shè)置。近期
  • 一條抖音4億人圍觀 ! 這家MCN比無憂傳媒還野

    作者:Hiu 來源:互聯(lián)網(wǎng)品牌官01 擦邊少女空降熱搜,幕后推手曝光被網(wǎng)友譽(yù)為&ldquo;純欲天花板&rdquo;的女網(wǎng)紅井川里予,近期因?yàn)橐唤M哥特風(fēng)照片登上熱搜,引發(fā)了一場(chǎng)互聯(lián)網(wǎng)世界關(guān)于
  • 華為Mate 60系列用上可變靈動(dòng)島:正式版體驗(yàn)將會(huì)更出色

    這段時(shí)間以來,關(guān)于華為新旗艦的爆料日漸密集。據(jù)此前多方爆料,今年華為將開始恢復(fù)一年雙旗艦戰(zhàn)略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • 2299元起!iQOO Pad明晚首銷:性能最強(qiáng)天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會(huì),除了首發(fā)安卓最強(qiáng)旗艦處理器的iQOO Neo8系列新機(jī)外,還在發(fā)布會(huì)上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點(diǎn)
  • 微軟發(fā)布Windows 11新版 引入全新任務(wù)欄狀態(tài)

    近日,微軟發(fā)布了Windows 11新版,而Build 22563更新主要引入了幾周前曝光的平板模式任務(wù)欄等,系統(tǒng)更流暢了。更新中,Windows 11加入了專門針對(duì)平板優(yōu)化的任務(wù)欄
Top 主站蜘蛛池模板: 兴城市| 南京市| 报价| 泽库县| 彰武县| 昌宁县| 新和县| 东港市| 武冈市| 蓝田县| 玛多县| 正宁县| 阜城县| 馆陶县| 普定县| 卢龙县| 凤冈县| 赤城县| 大宁县| 马尔康县| 青川县| 金山区| 凤翔县| 天峨县| 宁海县| 敖汉旗| 望奎县| 淮滨县| 阳信县| 林西县| 颍上县| 光泽县| 道孚县| 扎赉特旗| 汾西县| 特克斯县| 长海县| 玛多县| 麻城市| 原平市| 乳山市|