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

【前端知識】React 基礎(chǔ)鞏固(四十四)——其他Hooks(useContext、useReducer、useCallback)

這篇具有很好參考價值的文章主要介紹了【前端知識】React 基礎(chǔ)鞏固(四十四)——其他Hooks(useContext、useReducer、useCallback)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

React 基礎(chǔ)鞏固(四十四)——其他Hooks(useContext、useReducer、useCallback)

一、useContext的使用

在類組件開發(fā)時,我們通過 類名.contextType = MyContext的方式,在類中獲取context,多個Context或者在函數(shù)式組件中通過MyContext.Consumer方式共享context:

import React, { memo } from 'react'
import { UserContext, ThemeContext } from './context'

export default memo(function App() {

// 使用Context

  return (
    <div>
      <UserContext.Consumer>
        {
          value => {
            return (
              <h2>
                <ThemeContext.Consumer>
                  {
                    value => {
                      <span></span>
                    }
                  }
                </ThemeContext.Consumer>
              </h2>
            )
          }
        }
      </UserContext.Consumer>
    </div>
  )
})

可以看到,當(dāng)我們需要使用多個Context時,存在大量繁瑣的嵌套代碼;而Context Hook能夠讓我們通過Hook直接獲取某個Context的值,如下:

import React, { memo, useContext } from "react";
import { ThemeContext, UserContext } from "./context";

export default memo(function App() {
  // 使用Context
  const user = useContext(UserContext);
  const theme = useContext(ThemeContext);

  return (
    <div>
      <h2>
        User: {user.name} - {user.age}
      </h2>
      <h2>
        Theme: {theme.color} - {theme.size}
      </h2>
    </div>
  );
});

可以看到,Context Hook僅用了兩行代碼就替代了上面繁雜的嵌套代碼,十分高效簡潔。

二、useReducer的使用

useReducer是useState的一種替代方案,當(dāng)state的處理邏輯比較復(fù)雜,可以使用useReducer來進(jìn)行拆分,或者當(dāng)修改state時需要依賴之前的state時,也可以使用useReducer。

useReducer使用的場景非常少,通常用于需要統(tǒng)一管理、修改多個數(shù)據(jù)的場景。例如,當(dāng)我們需要對多個數(shù)據(jù)進(jìn)行統(tǒng)一處理時,若采用useState,則需要多次定義,而reducer可以對其進(jìn)行統(tǒng)一定義、修改:

import React, { memo, useReducer, useState } from "react";

function reducer(state, action) {
  switch (action.type) {
    case "increment":
      return { ...state, counter: state.counter + 1 };
    case "decrement":
      return { ...state, counter: state.counter - 1 };
    case "add_number":
      return { ...state, counter: state.counter + action.num };
    case "sub_number":
      return { ...state, counter: state.counter - action.num };
    default:
      return state;
  }
}

export default memo(function App() {
  // const [count, setCount] = useState(0);
  // const [user, setUser] = useState(0);
  // const [list, setList] = useState(0);

  const [state, dispatch] = useReducer(reducer, {
    counter: 0,
    user: {},
    list: [],
  });

  return (
    <div>
      {/* <h2>當(dāng)前計數(shù):{count}</h2>
      <button onClick={(e) => setCount(count + 1)}>+1</button>
      <button onClick={(e) => setCount(count - 1)}>-1</button>
      <button onClick={(e) => setCount(count + 5)}>+5</button>
      <button onClick={(e) => setCount(count - 5)}>-5</button>
      <button onClick={(e) => setCount(count + 100)}>+100</button> */}

      <h2>當(dāng)前計數(shù):{state.counter}</h2>
      <button onClick={(e) => dispatch({ type: "increment" })}>+1</button>
      <button onClick={(e) => dispatch({ type: "decrement" })}>-1</button>
      <button onClick={(e) => dispatch({ type: "add_number", num: 5 })}>
        +5
      </button>
      <button onClick={(e) => dispatch({ type: "sub_number", num: 5 })}>
        -5
      </button>
      <button onClick={(e) => dispatch({ type: "add_number", num: 100 })}>
        +100
      </button>
    </div>
  );
});

三、useCallback的使用

useCallback實際的目的是為了進(jìn)行性能優(yōu)化,useCallback會返回一個函數(shù)的memoized(記憶的)值。在依賴不變的情況下,多次定義的時候,返回的值時相同的。

useCallback的性能優(yōu)化:

  1. 當(dāng)需要將一個函數(shù)傳遞給子組件時,可使用useCallback進(jìn)行優(yōu)化,將優(yōu)化之后的函數(shù),傳遞給子組件

    import React, { memo, useCallback, useState } from "react";
    
    const HYIncrement = memo(function (props) {
      const { increment } = props;
    
      console.log("HYIncrement被渲染");
    
      return (
        <div>
          <button onClick={increment}>increment + 1</button>
        </div>
      );
    });
    
    export default memo(function App() {
      const [count, setCount] = useState(0);
      const [message, setMessage] = useState("hello");
    
      // 使用useCallback
      const increment = useCallback(
        function () {
          setCount(count + 1);
        },
        [count]
      );
    
      // 普通函數(shù)
      // const increment = () => {
      //   setCount(count + 1);
      // };
    
      return (
        <div>
          <h2>計數(shù):{count}</h2>
          <button onClick={increment}>+1</button>
    
          <HYIncrement increment={increment} />
    
          <h2>message:{message}</h2>
          <button onClick={(e) => setMessage("world")}>修改 message</button>
        </div>
      );
    });
    
    
  2. 進(jìn)一步優(yōu)化

    當(dāng)count發(fā)生改變時,也使用同一個函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-622976.html

      // 做法一:將count依賴移除掉,缺點:存在閉包陷阱,不依賴count后setCount每次拿到的count并非最新的count
      // const increment = useCallback(function foo() {
      //   console.log("increment");
      //   setCount(count + 1);
      // }, []);
    
      // 做法二:利用useRef,在組件多次渲染時,返回同一個值
      const countRef = useRef();
      countRef.current = count;
      const increment = useCallback(
        function foo() {
          console.log("increment");
          setCount(countRef.current + 1);
        },
        []
      );
    

到了這里,關(guān)于【前端知識】React 基礎(chǔ)鞏固(四十四)——其他Hooks(useContext、useReducer、useCallback)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【前端知識】React 基礎(chǔ)鞏固(四十一)——手動路由跳轉(zhuǎn)、參數(shù)傳遞及路由配置

    【前端知識】React 基礎(chǔ)鞏固(四十一)——手動路由跳轉(zhuǎn)、參數(shù)傳遞及路由配置

    利用 useNavigate 封裝一個 withRouter(hoc/with_router.js) 添加到hoc/index.js文件中 利用withRouter,攔截Home組件,實現(xiàn)手動跳轉(zhuǎn)路由 路由參數(shù)傳遞包括:1.動態(tài)路由傳參;2.查詢字符串傳參 改造withRouter,通過 useParams() 和 useSearchParams() 來接收兩種參數(shù)傳遞: 在界面中,通過params來接收

    2024年02月14日
    瀏覽(25)
  • 【前端知識】React 基礎(chǔ)鞏固(十四)——JSX 的轉(zhuǎn)換過程和聲明式編程

    jsx 僅僅只是 React.createElement(component, props, …children)函數(shù)的語法糖 所有的 jsx 最終都會被轉(zhuǎn)換成 React.createElement 的函數(shù)調(diào)用 createElement 需要傳遞三個參數(shù): type 當(dāng)前 ReactElement 的類型 如果是標(biāo)簽元素,那么就使用字符串表示 “div” 如果是組件元素,那么就直接使用組件的名稱

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

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

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

    2024年02月15日
    瀏覽(38)
  • 【前端知識】React 基礎(chǔ)鞏固(十三)——列表渲染

    在 React 中沒有像 Vue 模塊語法中的 v-for 指令,而是需要我們通過 JS 代碼的方式組織數(shù)據(jù),轉(zhuǎn)成 JSX 在 React 中,展示列表最多的方式就是使用數(shù)組的 map 高階函數(shù) 在展示數(shù)組前,有時會進(jìn)行一些處理 過濾一些內(nèi)容(filter 函數(shù)) 截取數(shù)組中的一部分內(nèi)容(slice 函數(shù)) 列表中的

    2024年02月10日
    瀏覽(31)
  • 【前端知識】React 基礎(chǔ)鞏固(二十八)——StrictMode

    【前端知識】React 基礎(chǔ)鞏固(二十八)——StrictMode

    StrictMode 是一個用來突出顯示應(yīng)用程序中潛在問題的工具 與 Fragment 一樣,StrictMode 不會渲染任何可見的 UI 為后代出發(fā)額外的檢測和警告 嚴(yán)格模式檢查僅在開發(fā)模式下運(yùn)行,不影響生產(chǎn)構(gòu)建 嚴(yán)格模式檢查什么? 識別不安全的生命周期 使用過時的 ref API 檢查意外的副作用 組件

    2024年02月16日
    瀏覽(57)
  • 【前端知識】React 基礎(chǔ)鞏固(二十七)——Fragment

    【前端知識】React 基礎(chǔ)鞏固(二十七)——Fragment

    Fragment 允許將子列表分組,而無需向 DOM 添加額外節(jié)點 可以采用語法糖 / 來替代 Fragment,但在需要添加 key 的場景下不能使用此短語 查看Fragment應(yīng)用后的效果

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

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

    2024年02月09日
    瀏覽(28)
  • 【前端知識】React 基礎(chǔ)鞏固(二十三)——React 性能優(yōu)化 SCU相關(guān)

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

    2024年02月15日
    瀏覽(39)
  • 【前端知識】React 基礎(chǔ)鞏固(十九)——組件化開發(fā)(三)

    Main.jsx TabControl/index.jsx TabControl/style.css

    2024年02月13日
    瀏覽(28)
  • 【前端知識】React 基礎(chǔ)鞏固(七)——JSX 的基本語法

    JSX 是一種 JS 的語法擴(kuò)展(extension),也可以稱之為 JavaScript XML,因為看起來就是一段 XML 語法 它用于描述我們的 UI 界面,并且其可以和 JS 融合在一起使用 它不同于 Vue 中的模塊語法,不需要專門學(xué)習(xí)模塊語法中的指令 React 認(rèn)為 渲染邏輯 本質(zhì)上與 其他UI邏輯 存在內(nèi)在耦合

    2024年02月10日
    瀏覽(68)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包