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

重新理解?React?useRef原理

 更新時(shí)間:2023年05月09日 08:55:22   作者:晚天  
這篇文章主要為大家介紹了React?useRef原理的深入理解分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

為什么要有 useRef?

React.useRef 是 React Hooks 中的一種,它提供了一種可以在函數(shù)組件中存儲(chǔ)可變值的方式。與 useState 不同,useRef 存儲(chǔ)的值不會(huì)引起組件的重新渲染。

我們使用 useRef 主要有以下幾個(gè)原因:

保存 DOM 元素的引用

在函數(shù)組件中,我們無法像類組件中那樣直接使用 this 來獲取 DOM 元素的引用。而 useRef 可以用來保存 DOM 元素的引用,方便我們獲取或修改其屬性。

保存組件的狀態(tài)

在函數(shù)組件中,每次組件重新渲染時(shí),所有的變量都會(huì)被重新聲明和初始化。為了在多次渲染之間保留一些數(shù)據(jù),我們可以使用 useRef 來保存這些數(shù)據(jù),它們?cè)诮M件的整個(gè)生命周期中保持不變。

避免重新渲染的性能問題

在某些情況下,我們需要保存一些數(shù)據(jù),但是這些數(shù)據(jù)并不需要觸發(fā)重新渲染。如果使用 useState,每次更新這些數(shù)據(jù)都會(huì)觸發(fā)組件的重新渲染,從而浪費(fèi)性能。而使用 useRef 可以避免這個(gè)問題。

在組件之間傳遞數(shù)據(jù)

在函數(shù)組件中,我們可以使用 useContext 或 useReducer 等鉤子來在組件之間傳遞數(shù)據(jù)。但是有些情況下,我們只需要簡(jiǎn)單地在組件之間傳遞一個(gè)變量或者一個(gè)函數(shù),此時(shí)使用 useRef 可以更加方便。

代碼示例

使用 useRef 存儲(chǔ)可變值:

import React, { useRef } from 'react';
function App() {
  const counterRef = useRef(0);
  function handleClick() {
    counterRef.current += 1;
    console.log(counterRef.current);
  }
  return (
    <button onClick={handleClick}>
      Click me
    </button>
  );
}

在這個(gè)例子中,我們使用 useRef 創(chuàng)建了一個(gè)名為 counterRef 的變量,并初始化為 0。每次按鈕被點(diǎn)擊時(shí),我們都會(huì)將 counterRef.current 的值加 1,并將結(jié)果打印到控制臺(tái)中。

使用 useRef 存儲(chǔ) DOM 元素的引用:

import React, { useRef } from 'react';
function App() {
  const inputRef = useRef(null);
  function handleClick() {
    inputRef.current.focus();
  }
  return (
    <>
      <input type="text" ref={inputRef} />
      <button onClick={handleClick}>
        Focus input
      </button>
    </>
  );
}

在這個(gè)例子中,我們使用 useRef 創(chuàng)建了一個(gè)名為 inputRef 的變量,并將其賦值為 null。在組件中,我們將 input 元素的 ref 屬性設(shè)置為 inputRef。每次按鈕被點(diǎn)擊時(shí),我們調(diào)用 inputRef.current.focus() 來將輸入框聚焦。

useRef 的特點(diǎn)

  • 會(huì)返回一個(gè)可變的 ref 對(duì)象。
  • 可以保存任何可變值,類似于在 class 組件中使用實(shí)例變量。
  • 返回的 ref 對(duì)象在組件的整個(gè)生命周期中保持不變。
  • 并不會(huì)在每次組件渲染時(shí)都生成新的 ref 對(duì)象,因此可以用來保存一些不需要觸發(fā)重新渲染的數(shù)據(jù)。
  • 可以用來引用 DOM 元素,用于獲取或修改其屬性。
  • 可以用來在函數(shù)組件之間傳遞數(shù)據(jù)。
  • 可以模擬實(shí)例變量,用于保存函數(shù)組件中的狀態(tài)。

useRef 和 useState 的區(qū)別

useRef 和 useState 有以下幾個(gè)區(qū)別:

  • useRef 返回的是一個(gè)可變的 ref 對(duì)象,而 useState 返回的是一個(gè)可變的 state 值和一個(gè)更新 state 的函數(shù)。
  • useRef 主要用于保存一個(gè)可變值,并不會(huì)觸發(fā)組件重新渲染,而 useState 能夠觸發(fā)組件重新渲染。
  • useRef 可以在組件渲染的過程中保持?jǐn)?shù)據(jù)的穩(wěn)定,而 useState 每次渲染都會(huì)重新計(jì)算 state 值。
  • useRef 可以用于訪問 DOM 元素,而 useState 不能。

使用場(chǎng)景

具體使用場(chǎng)景和每個(gè)場(chǎng)景下的代碼示例:

存儲(chǔ)定時(shí)器的 ID

定時(shí)器是 JavaScript 中常見的一種異步操作。在函數(shù)組件中,我們可以使用 useRef 存儲(chǔ)定時(shí)器的 ID,以便在組件卸載時(shí)清除定時(shí)器。

import React, { useState, useEffect, useRef } from 'react';
function App() {
  const [count, setCount] = useState(0);
  const intervalRef = useRef(null);
  useEffect(() => {
    intervalRef.current = setInterval(() => {
      setCount(c => c + 1);
    }, 1000);
    return () => clearInterval(intervalRef.current);
  }, []);
  return (
    <div>
      <p>{count}</p>
      <button onClick={() => clearInterval(intervalRef.current)}>
        Stop timer
      </button>
    </div>
  );
}

在這個(gè)例子中,我們使用 useRef 創(chuàng)建了一個(gè)名為 intervalRef 的變量,并將其初始化為 null。在 useEffect 中,我們使用 setInterval 創(chuàng)建了一個(gè)定時(shí)器,并將其 ID 存儲(chǔ)在 intervalRef.current 中。在組件卸載時(shí),我們使用 clearInterval 來清除定時(shí)器。點(diǎn)擊 Stop timer 按鈕時(shí),我們也會(huì)使用 clearInterval 來停止定時(shí)器。

存儲(chǔ)上一次的 props 或 state 值

有時(shí)候我們需要在組件更新時(shí)和之前的 props 或 state 進(jìn)行比較。在這種情況下,我們可以使用 useRef 存儲(chǔ)上一次的值。

import React, { useState, useEffect, useRef } from 'react';
function App() {
  const [count, setCount] = useState(0);
  const prevCountRef = useRef(null);
  useEffect(() => {
    prevCountRef.current = count;
  });
  const prevCount = prevCountRef.current;
  return (
    <div>
      <p>Current count: {count}</p>
      {prevCount && (
        <p>Previous count: {prevCount}</p>
      )}
      <button onClick={() => setCount(c => c + 1)}>
        Increase count
      </button>
    </div>
  );
}

在這個(gè)例子中,我們使用 useRef 創(chuàng)建了一個(gè)名為 prevCountRef 的變量,并將其初始化為 null。在 useEffect 中,我們將 count 的值存儲(chǔ)在 prevCountRef.current 中。在組件更新時(shí),我們通過 prevCountRef.current 獲取上一次的 count 值,并將其展示在頁面上。每次 count 更新時(shí),prevCountRef.current 的值也會(huì)被更新。

存儲(chǔ) DOM 元素的引用

在函數(shù)組件中,我們無法直接使用類組件中的 this.refs。因此,我們可以使用 useRef 存儲(chǔ) DOM 元素的引用,以便進(jìn)行 DOM 操作。

import React, { useRef } from 'react';
function App() {
  const inputRef = useRef(null);
  function handleFocus() {
    inputRef.current.style.backgroundColor = 'yellow';
  }
  function handleBlur() {
    inputRef.current.style.backgroundColor = 'white';
  }
  return (
    <>
      <input type="text" ref={inputRef} onFocus={handleFocus} onBlur={handleBlur} />
      <button onClick={() => inputRef.current.focus()}>
        Focus input
      </button>
    </>
  );
}

在這個(gè)例子中,我們使用 useRef 創(chuàng)建了一個(gè)名為 inputRef 的變量,并將其初始化為 null。在組件中,我們將 input 元素的 ref 屬性設(shè)置為 inputRef,并為 onFocus 和 onBlur 事件分別添加了 handleFocus 和 handleBlur 函數(shù)。在 handleFocus 函數(shù)中,我們將輸入框的背景顏色設(shè)置為黃色,在 handleBlur 函數(shù)中將其設(shè)置為白色。點(diǎn)擊 Focus input 按鈕時(shí),我們使用 inputRef.current.focus() 讓輸入框聚焦。

結(jié)語

React.useRef 提供了一種在函數(shù)組件中存儲(chǔ)可變值和 DOM 元素引用的方法。使用 useRef 可以讓我們?cè)诤瘮?shù)組件中實(shí)現(xiàn)更多的功能,并且不會(huì)引起組件的重新渲染。在使用 useRef 時(shí),需要注意不要濫用 useRef,只在必要的時(shí)候使用它,以避免造成代碼的混亂。

以上就是重新理解 React useRef的詳細(xì)內(nèi)容,更多關(guān)于重新理解 React useRef的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React函數(shù)式組件Hook中的useState函數(shù)的詳細(xì)解析

    React函數(shù)式組件Hook中的useState函數(shù)的詳細(xì)解析

    Hook 就是 JavaScript 函數(shù),這個(gè)函數(shù)可以幫助你鉤入(hook into) React State以及生命周期等特性,這篇文章主要介紹了React Hook useState函數(shù)的詳細(xì)解析的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 一文搞懂?React?18?中的?useTransition()?與?useDeferredValue()

    一文搞懂?React?18?中的?useTransition()?與?useDeferredValue()

    這篇文章主要介紹了一文搞懂?React?18?中的?useTransition()與useDeferredValue(),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • react路由中Suspense的詳細(xì)介紹

    react路由中Suspense的詳細(xì)介紹

    AppRouter這個(gè)組件是一個(gè)在現(xiàn)代 React 應(yīng)用中非常常見的模式,特別是在使用 React Router v6+ 進(jìn)行路由管理和結(jié)合代碼分割(Code Splitting)來優(yōu)化性能時(shí),這篇文章主要介紹了react路由中Suspense的詳細(xì)介紹,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-05-05
  • react最流行的生態(tài)替代antdpro搭建輕量級(jí)后臺(tái)管理

    react最流行的生態(tài)替代antdpro搭建輕量級(jí)后臺(tái)管理

    這篇文章主要為大家介紹了react最流行的生態(tài)替代antdpro搭建輕量級(jí)后臺(tái)管理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 詳解create-react-app 自定義 eslint 配置

    詳解create-react-app 自定義 eslint 配置

    這篇文章主要介紹了詳解create-react-app 自定義 eslint 配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • React使用useEffect解決setState副作用詳解

    React使用useEffect解決setState副作用詳解

    這篇文章主要為大家介紹了React使用useEffect解決setState副作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 詳解React如何獲取狀態(tài)的舊值

    詳解React如何獲取狀態(tài)的舊值

    最近剛開始接觸 React,突然腦海出現(xiàn)一個(gè)問題,React中怎么在狀態(tài)更新時(shí)獲取它的舊值,特別是如果你之前用過 Vue,你可能會(huì)想知道 React 中有沒有類似 Vue 的 watch 屬性,那么react中怎么實(shí)現(xiàn)呢?本文就給大家介紹一下React如何獲取狀態(tài)的舊值,需要的朋友可以參考下
    2024-07-07
  • React?組件中?State?的定義、使用及正確使用方式

    React?組件中?State?的定義、使用及正確使用方式

    本文詳細(xì)介紹了React組件中的state概念,包括其定義、使用方式以及如何正確更新state,通過ES6和ES7類組件的示例,展示了如何在React中定義和使用state,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • React?Hook?四種組件優(yōu)化總結(jié)

    React?Hook?四種組件優(yōu)化總結(jié)

    這篇文章主要介紹了React?Hook四種組件優(yōu)化總結(jié),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)孩子,需要的朋友可以參考一下
    2022-07-07
  • VSCode搭建React Native環(huán)境

    VSCode搭建React Native環(huán)境

    這篇文章主要介紹了VSCode搭建React Native環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05

最新評(píng)論

平凉市| 武宁县| 辛集市| 萝北县| 吴堡县| 清丰县| 阳江市| 壤塘县| 旅游| 水富县| 绥化市| 石狮市| 长白| 安义县| 五河县| 大余县| 郴州市| 铜鼓县| 鄂伦春自治旗| 喀什市| 化州市| 漯河市| 涟源市| 宁国市| 济阳县| 千阳县| 武功县| 赤城县| 开远市| 原平市| 宣恩县| 长海县| 安阳县| 晋宁县| 北辰区| 淄博市| 安多县| 台南县| 常熟市| 新乡市| 嘉定区|