infinite-scroll react
import { useState } from "react";
import useInView from "react-cool-inview";
import axios from "axios";
const App = () => {
const [todos, setTodos] = useState(["todo-1", "todo-2", "..."]);
const { observe } = useInView({
// For better UX, we can grow the root margin so the data will be loaded earlier
rootMargin: "50px 0px",
// When the last item comes to the viewport
onEnter: ({ unobserve, observe }) => {
// Pause observe when loading data
unobserve();
// Load more data
axios.get("/todos").then((res) => {
setTodos([...todos, ...res.todos]);
// Resume observe after loading data
observe();
});
},
});
return (
<div>
{todos.map((todo, idx) => (
<div ref={idx === todos.length - 1 ? observe : null}>{todo}</div>
))}
</div>
);
};