不幸的是,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 ( > ); }; 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 (); }; export default PreviousValue;Current Count: {count}
Previous Count: {prevCountRef.current}
在此示例中:
useRef 可用于在渲染之间保留值,而不会导致重新渲染,这与 useState 不同。这对于存储不直接影响 UI 但需要记住的值特别有用。
示例:跟踪组件的渲染计数。
import React, { useRef, useEffect } from 'react'; const RenderCounter = () => { const renderCount = useRef(0); useEffect(() => { renderCount.current = 1; }); return (); }; export default RenderCounter;This component has rendered {renderCount.current} times
useRef 在使用需要直接操作 DOM 元素的第三方库时非常有用,例如与图表库集成、管理视频播放器或处理动画。
示例:集成图表库。
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 ; }; 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 (); }; 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); }, []); returnCount: {count}; }; export default Timer;
钩子很棒,你应该使用它们。如果您了解 React 的工作原理并正确应用 hooks,您可以取得很多成就。 useRef 对于以下方面特别强大:
通过理解和利用 useRef,您可以编写更高效、更有效的 React 组件。钩子的真正力量在于理解它们的行为并明智地应用它们。
你知道吗,useState并不总是正确的答案?
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3