欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React中的常用Hooks分享

 更新時(shí)間:2023年07月19日 10:47:07   作者:demo123567  
React?提供了許多常用的?Hooks,用于在函數(shù)組件中添加狀態(tài)管理、副作用處理和其他功能,本文主要介紹了其中幾個(gè)常用的,需要的可以收藏一下

useState

useSate用于在函數(shù)組件中添加狀態(tài)管理。它返回一個(gè)狀態(tài)值和更新該狀態(tài)值的函數(shù)。 使用時(shí)一些特點(diǎn)和注意事項(xiàng)

  • 正確定義初始狀態(tài):在使用 useState 時(shí),需要為初始狀態(tài)提供一個(gè)合適的值。確保初始狀態(tài)的類型與后續(xù)狀態(tài)的類型保持一致,避免出現(xiàn)類型錯(cuò)誤。
  • 解構(gòu)數(shù)組:useState 返回一個(gè)包含狀態(tài)值和更新狀態(tài)值的函數(shù)的數(shù)組,通??梢允褂脭?shù)組解構(gòu)來獲取它們。例如:const [state, setState] = useState(initialState);。這樣做可以提高代碼的可讀性。
  • 更新狀態(tài):使用 setState 函數(shù)來更新狀態(tài)值。注意,setState 并不會像類組件中的 setState 方法一樣自動(dòng)合并更新,而是替換整個(gè)狀態(tài)對象。因此,在更新狀態(tài)時(shí),請確保包含了所有需要保留的狀態(tài)值,而不僅僅是更新的部分。
  • 異步更新:由于狀態(tài)更新是異步的,多次連續(xù)調(diào)用 setState 不會立即反映到狀態(tài)值上。如果需要基于先前的狀態(tài)進(jìn)行更新,可以使用回調(diào)函數(shù)的形式調(diào)用 setState。例如:setState(prevState => prevState + 1);
  • 函數(shù)式更新:當(dāng)新的狀態(tài)值依賴于先前的狀態(tài)值時(shí),可以使用函數(shù)式更新形式。這樣可以避免依賴于當(dāng)前狀態(tài)的值,并確保獲取到最新的狀態(tài)。例如:setState(prevState => prevState + 1);。
import { Button } from 'antd';
import React, { useState } from 'react';
const Test = (props: any) => {
    const [count, setCount] = useState(0);
    const onChange = () => {
        setCount(count + 1);
        // 異步更新有時(shí)候會不生效,需要這樣寫
        setCount(pre => pre + 1);
    }
    return (
        <div>
            {count}
            <Button onClick={onChange}>點(diǎn)擊</Button>
        </div>
    )
}
export default Test;

useEffect

用于處理副作用,例如數(shù)據(jù)獲取、訂閱、事件處理等。它在組件渲染完成后執(zhí)行,并可以在組件更新時(shí)重新執(zhí)行。 useEffect 是 React 中常用的 Hook 之一,用于處理副作用操作,例如數(shù)據(jù)獲取、訂閱、事件監(jiān)聽等。useEffect 在組件渲染后執(zhí)行,并可以在組件更新時(shí)重新執(zhí)行。

useEffect 接受兩個(gè)參數(shù):一個(gè)副作用函數(shù)和一個(gè)依賴項(xiàng)數(shù)組。

副作用函數(shù)是在組件渲染后執(zhí)行的函數(shù)。它可以包含任何副作用操作,例如訂閱事件、發(fā)送網(wǎng)絡(luò)請求、操作 DOM 等。該函數(shù)可以返回一個(gè)清理函數(shù),用于在組件卸載或重新渲染之前執(zhí)行清理操作。

依賴項(xiàng)數(shù)組是一個(gè)可選的參數(shù),用于指定副作用函數(shù)依賴的值。當(dāng)依賴項(xiàng)數(shù)組發(fā)生變化時(shí),useEffect 將重新執(zhí)行副作用函數(shù)。如果不提供依賴項(xiàng)數(shù)組,副作用函數(shù)將在每次組件更新時(shí)都執(zhí)行。如果傳入一個(gè)空數(shù)組 [],副作用函數(shù)將只在組件首次渲染后執(zhí)行,不會重新執(zhí)行。

以下是 useEffect 的基本用法:

import { useEffect } from 'react';
function MyComponent() {
// 無依賴項(xiàng),會一值執(zhí)行
 useEffect(() => {
  // 操作
  });
// 依賴項(xiàng)為空,組件初始化會執(zhí)行一次
useEffect(() => {
  // 操作
  },[]);
  // 依賴于某個(gè)變量或函數(shù),在依賴項(xiàng)發(fā)生變化后觸發(fā)
  useEffect(() => {
    // 在組件渲染后執(zhí)行副作用操作
    // 返回一個(gè)清理函數(shù)(可選)
    return () => {
     // 在組件卸載或重新渲染之前執(zhí)行清理操作
    //該清理函數(shù)將在組件卸載或重新渲染之前執(zhí)行
    };
  }, [/* 依賴項(xiàng)數(shù)組 */]);
  return (
   <div></div>
  );
}

下面是一些關(guān)于 useEffect 的常見用法和注意事項(xiàng):

  • 數(shù)據(jù)獲取和訂閱:可以在 useEffect 中進(jìn)行異步操作,例如發(fā)起網(wǎng)絡(luò)請求獲取數(shù)據(jù)或訂閱事件。確保在清理函數(shù)中取消訂閱或中斷請求,以避免內(nèi)存泄漏。
  • 依賴項(xiàng)數(shù)組的使用:通過依賴項(xiàng)數(shù)組,可以控制副作用函數(shù)的執(zhí)行時(shí)機(jī)。只有當(dāng)依賴項(xiàng)發(fā)生變化時(shí),才會重新執(zhí)行副作用函數(shù)。如果不提供依賴項(xiàng)數(shù)組,則副作用函數(shù)將在每次組件更新時(shí)都執(zhí)行。
  • 空依賴項(xiàng)數(shù)組的使用:如果副作用函數(shù)不依賴任何狀態(tài)或?qū)傩裕梢詡魅胍粋€(gè)空數(shù)組 [],使副作用函數(shù)僅在組件首次渲染后執(zhí)行一次。
  • 清理函數(shù)的使用:如果副作用函數(shù)需要進(jìn)行清理操作,例如取消訂閱或清除定時(shí)器,請?jiān)诟弊饔煤瘮?shù)中返回一個(gè)清理函數(shù)。該清理函數(shù)將在組件卸載或重新渲染之前執(zhí)行。
  • 異步操作和更新狀態(tài):在副作用函數(shù)中進(jìn)行異步操作時(shí),確保正確處理狀態(tài)的更新。使用函數(shù)式更新或通過依賴項(xiàng)數(shù)組傳入更新的狀態(tài)。

useContext

當(dāng)使用 useContext Hook 時(shí),可以方便地在 React 組件中訪問全局的上下文數(shù)據(jù)。下面是一個(gè)使用 useContext 的簡單例子:

首先,創(chuàng)建一個(gè)上下文對象:

import React, { createContext } from 'react';
// 創(chuàng)建上下文對象
const MyContext = createContext();
// 上下文提供器
function MyContextProvider({ children }) {
  const sharedData = 'Shared Data';
  return (
    <MyContext.Provider value={sharedData}>
      {children}
    </MyContext.Provider>
  );
}

在上面的例子中,創(chuàng)建了一個(gè)名為 MyContext 的上下文對象,并通過 MyContext.Provider 提供器將共享數(shù)據(jù) sharedData 傳遞給子組件。

然后,在需要訪問上下文數(shù)據(jù)的組件中使用 useContext

import React, { useContext } from 'react';
function MyComponent() {
  const sharedData = useContext(MyContext);
  return (
    <div>
      Shared Data: {sharedData}
    </div>
  );
}

在上面的例子中,創(chuàng)建了一個(gè)名為 MyContext 的上下文對象,并通過 MyContext.Provider 提供器將共享數(shù)據(jù) sharedData 傳遞給子組件。

然后,在需要訪問上下文數(shù)據(jù)的組件中使用 useContext:

import React, { useContext } from 'react';
function MyComponent() {
  const sharedData = useContext(MyContext);
  return (
    <div>
      Shared Data: {sharedData}
    </div>
  );
}

使用 useContext Hook 來獲取 MyContext 上下文的值,并將其賦值給 sharedData 變量。然后,可以在組件中使用該值進(jìn)行渲染或其他操作。

注意事項(xiàng):

  • 使用 useContext 前,確保已在組件樹中的某個(gè)地方提供了上下文。在上面的例子中,通過 MyContext.Provider 提供器在組件樹中提供了上下文數(shù)據(jù)。
  • 上下文數(shù)據(jù)的更新:當(dāng)上下文數(shù)據(jù)發(fā)生變化時(shí),使用 useContext 的組件會自動(dòng)重新渲染。這意味著,當(dāng)共享數(shù)據(jù)發(fā)生更改時(shí),使用該上下文的所有組件都會更新。
  • 上下文嵌套:React 允許上下文進(jìn)行嵌套。在嵌套的情況下,使用 useContext 會獲取最接近的上層提供器的值。
  • 上下文的性能優(yōu)化:當(dāng)上下文數(shù)據(jù)較大或頻繁變化時(shí),可以使用 React.memo、useMemo 或自定義的優(yōu)化方法來優(yōu)化上下文的性能。
  • 避免過度使用上下文:上下文是用于共享數(shù)據(jù)的有用工具,但過度使用可能導(dǎo)致組件之間的耦合性增加。請?jiān)谛枰蚕頂?shù)據(jù)的組件之間仔細(xì)考慮使用上下文的合適程度。

使用 useContext 可以方便地訪問和共享上下文數(shù)據(jù),但請確保在使用前提供了上下文,并注意上述的注意事項(xiàng),以確保正確使用上下文功能。

useReducer

useReducer 是 React 中的一個(gè)常用 Hook,用于管理具有復(fù)雜狀態(tài)邏輯的組件。它類似于 Redux 中的 reducer,接收一個(gè)狀態(tài)和操作函數(shù),并返回新的狀態(tài)和派發(fā)操作的函數(shù)。

使用 useReducer 時(shí),需要定義一個(gè) reducer 函數(shù)和初始狀態(tài)。

reducer 函數(shù)接收當(dāng)前狀態(tài)和一個(gè)操作(action),并根據(jù)操作的類型來更新狀態(tài)。它返回更新后的狀態(tài)。reducer 函數(shù)的定義類似于 Redux 中的 reducer:

function reducer(state, action) {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    case 'DECREMENT':
      return { count: state.count - 1 };
    default:
      return state;
  }
}

初始狀態(tài)是狀態(tài)的初始值:

const initialState = { count: 0 };

然后,使用 useReducer Hook 在組件中應(yīng)用 reducer:

import React, { useReducer } from 'react';
function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <div>
      Count: {state.count}
      <button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
      <button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button>
    </div>
  );
}

在上述例子中,我們使用 useReducer 定義了狀態(tài) state 和派發(fā)操作的函數(shù) dispatch。我們可以根據(jù)操作的類型通過調(diào)用 dispatch 函數(shù)來派發(fā)操作,并由 reducer 函數(shù)來更新狀態(tài)。

useReducer 在處理具有復(fù)雜狀態(tài)邏輯的組件時(shí)非常有用。以下是一些使用場景:

  • 計(jì)數(shù)器:可以使用 useReducer 來管理計(jì)數(shù)器的狀態(tài)和操作,例如增加、減少計(jì)數(shù)等。
  • 表單處理:使用 useReducer 可以更好地管理表單的狀態(tài)和用戶輸入的操作,以及進(jìn)行表單驗(yàn)證等復(fù)雜邏輯。
  • 數(shù)據(jù)列表:當(dāng)處理復(fù)雜的數(shù)據(jù)列表時(shí),使用 useReducer 可以更好地管理數(shù)據(jù)的加載、篩選、排序等操作,以及處理分頁等功能。

總的來說,useReducer 適用于需要管理復(fù)雜狀態(tài)邏輯的組件,并且可以幫助組織和更新狀態(tài),以及處理相關(guān)的操作。它可以代替使用 useState 的方式,特別適合管理具有多個(gè)操作類型和相關(guān)狀態(tài)的組件。

useMemo

useMemo 是 React 中的一個(gè)常用 Hook,用于在組件渲染過程中進(jìn)行性能優(yōu)化,避免不必要的計(jì)算和重復(fù)渲染。

useMemo 接受兩個(gè)參數(shù):一個(gè)計(jì)算函數(shù)和依賴項(xiàng)數(shù)組。它會在組件渲染過程中執(zhí)行計(jì)算函數(shù),并將計(jì)算結(jié)果緩存起來。只有當(dāng)依賴項(xiàng)數(shù)組中的值發(fā)生變化時(shí),才會重新執(zhí)行計(jì)算函數(shù)。

使用 useMemo 可以避免在每次渲染時(shí)重復(fù)計(jì)算耗時(shí)的操作,并且可以根據(jù)依賴項(xiàng)的變化來更新計(jì)算結(jié)果。以下是一些 useMemo 的常見使用場景:

  • 計(jì)算結(jié)果的緩存:當(dāng)需要根據(jù)某些輸入計(jì)算結(jié)果時(shí),可以使用 useMemo 緩存計(jì)算結(jié)果,避免重復(fù)計(jì)算。這在計(jì)算量較大的場景下特別有用。
  • 避免不必要的重渲染:當(dāng)一個(gè)組件依賴于某個(gè)狀態(tài)或?qū)傩?,但這些狀態(tài)或?qū)傩缘淖兓⒉粫绊懙浇M件的渲染結(jié)果時(shí),可以使用 useMemo 來緩存渲染結(jié)果,避免不必要的重渲染。
  • 優(yōu)化子組件的渲染:當(dāng)將一個(gè)計(jì)算結(jié)果作為屬性傳遞給子組件時(shí),可以使用 useMemo 緩存計(jì)算結(jié)果,以避免在每次父組件渲染時(shí)都重新計(jì)算并傳遞給子組件。
  • 性能敏感的比較操作:當(dāng)需要進(jìn)行一些性能敏感的比較操作,例如深度比較對象或數(shù)組時(shí),可以使用 useMemo 緩存比較結(jié)果,以避免在每次渲染時(shí)重新執(zhí)行比較操作。 下面是一個(gè)使用 useMemo 的簡單例子,展示如何緩存計(jì)算結(jié)果以提高性能:
import React, { useMemo, useState } from 'react';
function ExpensiveComponent() {
  // 假設(shè)這里有一個(gè)計(jì)算耗時(shí)的函數(shù)
  function calculateExpensiveValue() {
    // ... 復(fù)雜的計(jì)算邏輯 ...
    console.log('Calculating expensive value...');
    return Math.random();
  }
  // 使用 useMemo 緩存計(jì)算結(jié)果
  const expensiveValue = useMemo(() => calculateExpensiveValue(), []);
  return (
    <div>
      Expensive Value: {expensiveValue}
    </div>
  );
}
function App() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      <ExpensiveComponent />
    </div>
  );
}

在上述代碼中,有一個(gè) ExpensiveComponent 組件,其中包含一個(gè)計(jì)算耗時(shí)的函數(shù) calculateExpensiveValue。為了避免在每次渲染時(shí)都重新計(jì)算 expensiveValue,使用 useMemo 緩存計(jì)算結(jié)果。

通過將 calculateExpensiveValue 函數(shù)作為 useMemo 的第一個(gè)參數(shù),并將空數(shù)組作為依賴項(xiàng)傳遞給 useMemo,確保只在組件首次渲染時(shí)執(zhí)行一次計(jì)算,并將結(jié)果緩存起來。當(dāng) count 發(fā)生變化時(shí),ExpensiveComponent 重新渲染,但不會觸發(fā)計(jì)算函數(shù)的重新執(zhí)行。

useLayoutEffect

useLayoutEffect 是 React 中的一個(gè) Hook,與 useEffect 類似,但它在 DOM 變更之后同步執(zhí)行,而不是在瀏覽器繪制之后執(zhí)行。它會在瀏覽器布局和繪制之前同步執(zhí)行回調(diào)函數(shù)。

使用 useLayoutEffect 可以在瀏覽器布局完成后立即執(zhí)行一些操作,以確保獲取到最新的 DOM 布局信息,并在下一次渲染之前同步地更新 UI。這在需要準(zhǔn)確地測量 DOM 元素的尺寸、位置或進(jìn)行 DOM 操作時(shí)非常有用。

下面是一個(gè)使用 useLayoutEffect 的簡單例子:

import React, { useRef, useLayoutEffect } from 'react';
function MeasureElement() {
  const ref = useRef();
  useLayoutEffect(() => {
    // 在瀏覽器布局完成后立即執(zhí)行操作
    const element = ref.current;
    const { width, height } = element.getBoundingClientRect();
    // 使用測量結(jié)果進(jìn)行操作
    console.log('Element size:', width, height);
  }, []);
  return <div ref={ref}>Measure me!</div>;
}
function App() {
  return (
    <div>
      <MeasureElement />
    </div>
  );
}

在上述例子中,創(chuàng)建了一個(gè)名為 MeasureElement 的組件,在組件內(nèi)部使用了 useLayoutEffect。在 useLayoutEffect 的回調(diào)函數(shù)中,我們可以獲取到被測量元素的最新布局信息,并進(jìn)行相應(yīng)的操作。

在這個(gè)例子中,我們使用 getBoundingClientRect 方法獲取被測量元素的寬度和高度,并將結(jié)果打印到控制臺。這個(gè)操作在瀏覽器布局完成后同步執(zhí)行,確保我們獲取到的尺寸是最新的。

需要注意的是,由于 useLayoutEffect 在瀏覽器布局之后同步執(zhí)行,因此它的執(zhí)行會阻塞瀏覽器的渲染過程。因此,只有在需要同步更新 UI 或測量 DOM 元素時(shí)才使用 useLayoutEffect,避免造成性能問題。

到此這篇關(guān)于React中的常用Hooks分享的文章就介紹到這了,更多相關(guān)React常用Hooks內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解React 在服務(wù)端渲染的實(shí)現(xiàn)

    詳解React 在服務(wù)端渲染的實(shí)現(xiàn)

    這篇文章主要介紹了詳解React 在服務(wù)端渲染的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • react native 文字輪播的實(shí)現(xiàn)示例

    react native 文字輪播的實(shí)現(xiàn)示例

    這篇文章主要介紹了react native 文字輪播的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • React Hooks中模擬Vue生命周期函數(shù)的指南

    React Hooks中模擬Vue生命周期函數(shù)的指南

    React Hooks 提供了一種在函數(shù)組件中使用狀態(tài)和其他 React 特性的方式,而不需要編寫類組件,Vue 的生命周期函數(shù)和 React Hooks 之間有一定的對應(yīng)關(guān)系,本文給大家介紹了React Hooks中模擬Vue生命周期函數(shù)的指南,需要的朋友可以參考下
    2024-10-10
  • 詳解react組件通訊方式(多種)

    詳解react組件通訊方式(多種)

    這篇文章主要介紹了詳解react組件通訊方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 詳解react如何實(shí)現(xiàn)復(fù)合組件

    詳解react如何實(shí)現(xiàn)復(fù)合組件

    在一些react項(xiàng)目開發(fā)中,常常會出現(xiàn)一些組合的情況出現(xiàn),這篇文章主要為大家介紹了復(fù)合組件的具體實(shí)現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • Vite?+?React從零開始搭建一個(gè)開源組件庫

    Vite?+?React從零開始搭建一個(gè)開源組件庫

    這篇文章主要介紹了Vite?+?React?如何從0到1搭建一個(gè)開源組件庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • react+antd+upload結(jié)合使用示例

    react+antd+upload結(jié)合使用示例

    這篇文章主要為大家介紹了react+antd+upload結(jié)合使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • React四級菜單的實(shí)現(xiàn)

    React四級菜單的實(shí)現(xiàn)

    本文主要介紹了React四級菜單的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • React?Hooks之usePolymerAction抽象代碼結(jié)構(gòu)設(shè)計(jì)理念

    React?Hooks之usePolymerAction抽象代碼結(jié)構(gòu)設(shè)計(jì)理念

    這篇文章主要為大家介紹了React?Hooks之usePolymerAction抽象代碼結(jié)構(gòu)設(shè)計(jì)理念,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • react實(shí)現(xiàn)移動(dòng)端下拉菜單的示例代碼

    react實(shí)現(xiàn)移動(dòng)端下拉菜單的示例代碼

    這篇文章主要介紹了react實(shí)現(xiàn)移動(dòng)端下拉菜單的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論