不幸的是,useRef 被低估了。它不是最受歡迎的鉤子之一,但它是有益的。知道如何以及在哪裡使用它可以取得很好的效果。
useRef 是一個 React Hook,可讓您引用渲染不需要的值。
React 會記住你透過 useRef 建立的值,無論你是建立一個引用 DOM 中的節點的 JavaScript 物件還是一個簡單的值,並且它在重新渲染期間不會遺失。
存取 DOM 元素:
儲存可變值:
這裡有一些例子來說明 useRef 的強大功能。
import React, { useRef } from 'react'; const Counter = () => { const refCount = useRef(0); const refInputField = useRef(null); const onClick = () => { refCount.current = refCount.current + 1; refInputField.current.focus(); } return ( <> <button onClick={onClick}> Click me! </button> <input ref={refInputField} /> </> ); }; export default Counter;
在此範例中:
useRef 的另一個常見用例是追蹤先前的值。
import React, { useRef, useEffect, useState } from 'react'; const PreviousValue = () => { const [count, setCount] = useState(0); const prevCountRef = useRef(); useEffect(() => { prevCountRef.current = count; }, [count]); return ( <div> <h1>Current Count: {count}</h1> <h2>Previous Count: {prevCountRef.current}</h2> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); }; export default PreviousValue;
在此範例中:
useRef 可用於跨渲染持久保存值,而不會導致重新渲染,這與 useState 不同。這對於儲存不直接影響 UI 但需要記住的值特別有用。
範例:追蹤組件的渲染計數。
import React, { useRef, useEffect } from 'react'; const RenderCounter = () => { const renderCount = useRef(0); useEffect(() => { renderCount.current += 1; }); return ( <div> <p>This component has rendered {renderCount.current} times</p> </div> ); }; export default RenderCounter;
在使用需要直接操作 DOM 元素的第三方程式庫(例如與圖表庫整合、管理視訊播放器或處理動畫)時,useRef 非常有用。
範例:整合圖表庫。
import React, { useRef, useEffect } from 'react'; import Chart from 'chart.js/auto'; const ChartComponent = () => { const chartRef = useRef(null); useEffect(() => { const ctx = chartRef.current.getContext('2d'); new Chart(ctx, { type: 'line', data: { labels: ['January', 'February', 'March', 'April'], datasets: [{ label: 'Sales', data: [65, 59, 80, 81], }], }, }); }, []); return <canvas ref={chartRef}></canvas>; }; export default ChartComponent;
在效能至關重要的複雜應用程式中,使用 useRef 儲存可變物件可以幫助避免不必要的重新渲染。
範例:儲存可變狀態物件。
import React, { useRef } from 'react'; const MutableState = () => { const state = useRef({ name: 'John Doe', age: 30, }); const updateName = (newName) => { state.current.name = newName; console.log('Name updated:', state.current.name); }; return ( <div> <button onClick={() => updateName('Jane Doe')}> Update Name </button> </div> ); }; export default MutableState;
使用 useRef 可以透過提供對跨渲染持續存在的值的穩定引用來幫助避免關閉問題。
範例:使用 useRef 的計時器以避免過時狀態。
import React, { useRef, useState, useEffect } from 'react'; const Timer = () => { const [count, setCount] = useState(0); const countRef = useRef(count); countRef.current = count; useEffect(() => { const intervalId = setInterval(() => { setCount(countRef.current + 1); }, 1000); return () => clearInterval(intervalId); }, []); return <div>Count: {count}</div>; }; export default Timer;
鉤子很棒,你應該使用它們。如果您了解 React 的工作原理並正確應用 hooks,您可以取得很多成就。 useRef 對於以下方面特別強大:
透過理解和利用useRef,你可以編寫更有效率、更有效的React元件。 Hooks 的真正力量在於理解它們的行為並明智地應用它們。
你知道嗎,useState並不總是正確的答案?
以上是釋放 useRef 的力量:React 開發人員綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!