[components/toc][s]: comments added
This commit is contained in:
parent
73adb71e10
commit
0d5f8f5540
|
|
@ -22,6 +22,7 @@ export default function MdxPage({ body, frontMatter, editUrl }) {
|
||||||
const [observer, setObserver] = useState(null);
|
const [observer, setObserver] = useState(null);
|
||||||
|
|
||||||
// run only after first render, in order to preserve the observer
|
// run only after first render, in order to preserve the observer
|
||||||
|
// between component rerenders
|
||||||
useEffect((() => {
|
useEffect((() => {
|
||||||
const observer = getObserver((entry) => {
|
const observer = getObserver((entry) => {
|
||||||
if (entry.isIntersecting) {
|
if (entry.isIntersecting) {
|
||||||
|
|
@ -34,6 +35,9 @@ export default function MdxPage({ body, frontMatter, editUrl }) {
|
||||||
}), [])
|
}), [])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
// on initial render activeHeading will be `null`
|
||||||
|
// however, we still want to highlight the current heading in the toc
|
||||||
|
// based on the current url
|
||||||
if (!activeHeading) {
|
if (!activeHeading) {
|
||||||
try {
|
try {
|
||||||
const path = window.location.hash;
|
const path = window.location.hash;
|
||||||
|
|
@ -48,6 +52,7 @@ export default function MdxPage({ body, frontMatter, editUrl }) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const tocLink = document.querySelector(`.toc-link[href="#${activeHeading}"]`)
|
const tocLink = document.querySelector(`.toc-link[href="#${activeHeading}"]`)
|
||||||
tocLink.classList.add("active");
|
tocLink.classList.add("active");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,4 +23,6 @@ const MdxContent = ({ body, observer }) => {
|
||||||
return <Component components={ customComponents }/>
|
return <Component components={ customComponents }/>
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// prevent rerendering of the component if it's props don't change
|
||||||
|
// i.e. re-render only when the observer is set
|
||||||
export default React.memo(MdxContent);
|
export default React.memo(MdxContent);
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
// an Intersection Observer to keep track of currently viewed headings
|
||||||
const getIntersectionObserver = (callback) => {
|
const getIntersectionObserver = (callback) => {
|
||||||
return new IntersectionObserver(
|
return new IntersectionObserver(
|
||||||
(entries) => {
|
(entries) => {
|
||||||
|
|
@ -7,8 +8,7 @@ const getIntersectionObserver = (callback) => {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
root: null,
|
root: null,
|
||||||
// 65px is a navbar height
|
rootMargin: "-65px 0% -90% 0%" // 65px is a navbar height
|
||||||
rootMargin: `-65px 0% -90% 0%`
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue