【发布时间】:2021-01-20 08:59:41
【问题描述】:
我正在使用 react 和相交观察者 api 构建一个无限滚动应用程序。
但是我被卡在了intersectionObserver只有一次在useEffect中的部分。
这里是代码
import React, { useState, useEffect, createRef } from 'react';
import axios from 'axios';
function App() {
const [page, setPage] = useState(1);
const [passengers, setPassengers] = useState([]);
const bottomRef = createRef();
const scrollCallback = (entries) => {
if (entries[0].isIntersecting) {
axios.get(`https://api.instantwebtools.net/v1/passenger?page=${page}&size=10`).then(res => setPassengers(prevState => [...prevState, ...res.data.data]));
}
};
useEffect(() => {
const observer = new IntersectionObserver(scrollCallback, {
root: null,
threshold: 1,
});
observer.observe(bottomRef.current);
return () => {
observer.disconnect();
}
}, [bottomRef]);
return (
<div className="container">
<div className="lists">
{
passengers.map((passenger, idx) => {
const { airline, name, trips } = passenger;
return (
<div className="list" key={idx}>
<h4>User Info</h4>
<p>name: {name}</p>
<p>trips: {trips}</p>
<h4>Airline Info</h4>
<p>name: {airline.name}</p>
<p>country: {airline.country}</p>
<p>established: {airline.established}</p>
<p>head quarter: {airline.head_quarters}</p>
<p>website: {airline.website}</p>
</div>
)
})
}
</div>
<div ref={bottomRef} />
</div>
);
}
当滚动到达底部时,useEffect 中的 scrollCallback 函数起作用,它将两个数组合并为一个,并最终显示我想要查看的合并数据。
但是,这只适用于一次。 useEffect 生命周期不再起作用。所以我将observer.disconnect(); 更改为observer.unobserve(bottomRef.current); 但这会出现错误提示
TypeError: Failed to execute 'unobserve' on 'IntersectionObserver': parameter 1 is not of type 'Element'.
为什么useEffect生命周期无法读取bottomRef??
工作代码示例:https://codesandbox.io/s/dazzling-newton-jvivj?file=/src/App.js
codesandbox 中的代码可以正常工作很奇怪
【问题讨论】:
-
请用 runnable minimal reproducible example 更新您的问题,使用 Stack Snippets(
[<>]工具栏按钮)演示问题。 Stack Snippets 支持 React,包括 JSX; here's how to do one. -
const {current} = bottomRef; observer.observe(current); return () => observer.unobserve(current); -
@AndreaGiammarchi 这解决了 TypeError 但 scrollCallback 仍然有效一次
-
@T.J.Crowder 知道了
-
我已经编辑了我的答案stackoverflow.com/a/65806370/2800218
标签: javascript reactjs intersection-observer