use-scroll-spy
Track scroll position and detect which heading is currently in the viewport, can be used for table of contents
Source
Docs
Package
Usage
The use-scroll-spy hook tracks the scroll position and returns the index of the
element that is currently in the viewport. It is useful for creating
table of contents components (like in the mantine.dev sidebar on the right side)
and similar features.
Scroll to heading:
Hook options
The use-scroll-spy hook accepts an object with options:
selector- selector to get headings; by default it is'h1, h2, h3, h4, h5, h6'getDepth- a function to retrieve the depth of a heading; by default depth is calculated based on the tag namegetValue- a function to retrieve the heading value; by defaultelement.textContentis usedscrollHost- host element (or a ref to it) to attach scroll event listener, if not provided,windowis usedoffset- offset from the top of the viewport to use when determining the active heading, by default0is used
Example of using custom options to get headings with the data-heading attribute:
Scroll to heading:
Custom scroll host
By default, use-scroll-spy attaches the scroll event listener to window. If your
headings are located inside a scrollable container, pass that element to the
scrollHost option. You can pass either a resolved HTMLElement or a ref object –
the hook reads ref.current internally once the element is mounted:
The ref is resolved inside an effect after the component mounts, so the scroll host
does not need to exist on the first render. Note that a plain ref object is not
reactive – if you later point the ref at a different element, the hook keeps the
listener on the original one. When the scroll host itself can change at runtime, pass
the resolved element via state so that scrollHost changes identity and the hook
re-runs with the new value.
Reinitializing hook data
By default, use-scroll-spy does not track changes in the DOM. If you want
to update the headings data after the parent component has mounted, you can use
the reinitialize function:
Definition
All types used in the definition are exported from @mantine/hooks package.
Exported types
UseScrollSpyOptions and UseScrollSpyReturnValue types are exported from the @mantine/hooks package;
you can import them in your application: