UseRef внутри нескольких общих компонентов не возвращает объект ref

У меня проблема: мне нужно получить доступ к ссылкам в общем компоненте BaseTable. Например, для родительского компонента маршрута:

function Route() {
  <div>
    <BaseTable />
    <BaseTable />
  </div>
}

function BaseTable() {
  const ref = useRef();

  console.info(ref && ref.current);
  
  return <table ref = {ref}>...</table>
}

Я ожидаю, что при рендеринге каждого BaseTable я увижу узел ref, однако я вижу его только на одном из дочерних элементов BaseTable, а другой возвращает только ноль.

Как ни странно (и, возможно, важно), когда я вношу изменения в файл и сохраняю, горячая перезагрузка затем подхватывает оба узла при повторном рендеринге. Когда у меня есть только один рендеринг BaseTable, ссылка установлена ​​​​правильно, однако эта проблема возникает только при рендеринге нескольких компонентов BaseTable.

Это должно сделать useEffect(() => { console.info(ref && ref.current); }, [])

Ilian Futekov 29.03.2022 18:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
19
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код правильный.

Я думаю, вы запутались, потому что пишете в console в функции рендеринга.

При первом отображении функции ссылка будет undefined. Вместо этого используйте хук useEffect для записи в консоль после монтирования компонента и инициализации ссылки. Затем вы увидите, что ref.current — это элемент table.

function BaseTable() {
  const ref = useRef();

  useEffect(() => {
    console.info(ref && ref.current);
  }, []);

  return <table ref = {ref}>...</table>;
}

Другие вопросы по теме