К сожалению, useRef недооценен. Он не входит в число самых популярных крючков, но приносит пользу. Зная, как и где его использовать, можно добиться отличных результатов.
useRef — это React Hook, который позволяет ссылаться на значение, не необходимое для рендеринга.
React запомнит значение, которое вы создаете с помощью useRef, независимо от того, создаете ли вы объект JavaScript, ссылающийся на узел в DOM, или простое значение, и оно не будет потеряно во время повторного рендеринга.
Доступ к элементам 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. Это особенно полезно для хранения значений, которые не влияют напрямую на пользовательский интерфейс, но которые необходимо запомнить.
Пример: отслеживание количества рендеринга компонента.
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, и правильно применяете хуки. useRef особенно эффективен для:
Понимая и используя useRef, вы сможете писать более эффективные и действенные компоненты React. Истинная сила хуков заключается в понимании их поведения и разумном их применении.
Знаете ли вы, что useState не всегда является правильным ответом?
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3