
Company News
Socket Joins New OpenJS Program to Fund Node.js Security Work
Socket is joining the OpenJS Security Stewardship Program to fund Node.js vulnerability research, maintainer remediation, and security releases.
viewport-scroll
Advanced tools
A simple React component to track the window's viewport-scroll position.
A simple and lightweight React component to effortlessly track the window's viewport-scroll position and trigger actions like infinite scrolling.
ViewportScroll component.npm install viewport-scroll
or
yarn add viewport-scroll
Here's a simple example of how to use ViewportScroll to implement infinite scrolling:
import ViewportScroll, { type ScrollHandlerType } from "viewport-scroll";
import { useState } from "react";
type State = {
isLoading: boolean;
data: {
id: number;
name: string;
}[];
};
export default function App() {
const [user, setUser] = useState<State>({ isLoading: false, data: [] });
const getCharacter: ScrollHandlerType = async ({ page, setHasMore }) => {
try {
setUser((prev) => ({ ...prev, isLoading: true }));
await new Promise((resolve) => setTimeout(resolve, 1000));
const data = await (await fetch(`https://rickandmortyapi.com/api/character?page=${page}`)).json();
const results = data?.results ?? [];
if (results.length === 0 || !data.info?.next) {
setHasMore(false);
}
setUser((prev) => ({ isLoading: false, data: [...prev.data, ...results] }));
} catch (error) {
setUser((prev) => ({ ...prev, isLoading: false }));
setHasMore(false);
}
};
return (
<div className="App">
<h1>Infinite Scroll with ViewportScroll</h1>
<ViewportScroll
threshold={200}
isLoading={user.isLoading}
asyncHandler={getCharacter}
style={{ height: "400px", width: "80%", overflowY: "auto", margin: "auto", border: "1px solid #ccc", padding: "1rem" }}
>
{user.data.map((char) => (
<div key={char.id} style={{ padding: "1rem", borderBottom: "1px solid #eee" }}>
<h3>{char.name}</h3>
</div>
))}
{user.isLoading && <div style={{ textAlign: "center", padding: "1rem" }}>Loading more characters...</div>}
</ViewportScroll>
</div>
);
}
| Prop | Type | Default | Description |
|---|---|---|---|
threshold | number | 200 | The distance in pixels from the bottom of the scrollable element at which the asyncHandler is triggered. |
isLoading | boolean | false | A boolean to indicate if the asyncHandler is currently running. This prevents multiple calls. |
asyncHandler | ({ page, setHasMore }) => Promise<void> | - | The asynchronous function to call when the scroll threshold is reached. |
style | React.CSSProperties | - | Custom styles to apply to the scrollable container. |
children | React.ReactNode | - | The content to be rendered inside the scrollable container. |
Contributions, issues, and feature requests are welcome! Feel free to check the issues page.
This project is ISC licensed.
FAQs
A simple React component to track the window's viewport-scroll position.
We found that viewport-scroll demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.

Company News
Socket is joining the OpenJS Security Stewardship Program to fund Node.js vulnerability research, maintainer remediation, and security releases.

Security News
Two compromised GitHub Actions were re-enabled with malicious tags intact, exposing thousands of downstream repositories to Mini Shai-Hulud.

Research
/Security News
A malicious Firefox extension fetches its payload after installation to evade detection, steal Google session cookies, and automate account takeover.