Невозможно обновить компонент изнутри тела функции другого предупреждения компонента

Я написал компонент под названием component1, как показано ниже, и он находится внутри родительского компонента. Компонент 1 находится внизу страницы, и я не хочу отображать его, пока пользователь не прокрутит вниз до этой области. Таким образом, я использую InView из "реакции-пересечения-наблюдателя", чтобы определить, находится ли эта область в поле зрения. Если да, то выберите данные и отобразите данные. Но я получаю предупреждение: Предупреждение: невозможно обновить компонент из тела функции другого компонента. В чем причина появления этого предупреждения? Это потому, что я установил setInView в компоненте?

<parent>
    <component4 />
    <component3 />
    <component2 />
    <component1 />
</parent>

const component1 = () => {
    const [inView, setInView] = React.useState(false);
    const [loading, error, data] = fetchData(inView); // hook to fetch data
    // data is an array
    const content = data.map(d => <div>{d}</div>);
    const showEmpty = true;
    if (data) {
        showEmpty = false;
    }
    return (<InView>
        {({ inView, ref }) => {
              setInView(inView);
              return (
                <div ref={ref}>
                <div>{!showEmpty && content}</div>
                </div>
            )   
    </InView>);
}

1 ответ

Как я понял, вы хотите получать данные, когда компонент попадает в поле зрения, верно?

вот мое решение с useEffect:

const Componet1 = () => {

  const [inView, setInView] = useState(false)
  const [myData, setMyData] = useState(null)

  useEffect(() => {
    if (inView && !myData) {
      const [loading, error, data] = fetchData(inView); // hook to fetch data
      if (data) {
        setMyData(data)
      }
    }

    return () => {
      // cleanup
    }
  }, [inView,myData])

  return (
    <InView as="div" onChange={(inView) => setInView(inView)}>
      {myData ? myData.map((d, i) => <div key={i}>{d}</div>) : 'Loading...'}
    </InView>
  );
}

также это выборка данных только один раз.

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