Почему я не могу вызвать useRef внутри обратного вызова? - PullRequest
0 голосов
/ 28 апреля 2020

Когда я пишу этот код, у меня появляется ошибка:

React Hook "useRef" не может быть вызван внутри обратного вызова. React Hooks должны вызываться в компоненте функции React или в пользовательской функции React Hook

Что мне делать с этим кодом?

return ITEMS.map((item, i) => {
  const elementRef = useRef(null);
      return (
        <div
          ref={elementRef}
          key={i}
        >
          <p>{item.name}</p>
          <Wrapper>
            {item.name === visibleItem && (
                <Item
                  parentRef={elementRef}
                />
            )}
          </Wrapper>
        </div>
      );
    }

1 Ответ

1 голос
/ 29 апреля 2020

Здесь есть две возможности: либо использовать useRef с объектом / массивом, либо использовать createRef, как предложил Евгений Горбунков.

Я не совсем уверен в их жизнеспособности как Опция createRef создаст совершенно новые ссылки для каждого рендера, а опция useRef вам понадобится, чтобы ваши ключи / индексы всегда были одинаковыми.

const ITEMS = [{ name: "test" }, { name: "test2" }];
export default function App() {
  const ref = useRef({});
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      {ITEMS.map((item, idx) => {
        return (
          <div key={idx} ref={element => (ref.current[idx] = element)}>
            <p>{item.name}</p>
            <Wrapper>
              {item.name === visibleItem && (
                <Item parentRef={ref.current[idx]} />
              )}
            </Wrapper>
          </div>
        );
      })}
      {ITEMS.map((item, idx) => {
        const ref = createRef();
        return (
          <div key={idx} ref={ref}>
            <p>{item.name}</p>
            <Wrapper>
              {item.name === visibleItem && <Item parentRef={ref} />}
            </Wrapper>
          </div>
        );
      })}
    </div>
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...