âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â ð shadcn/directory/udecode/plate/(plugins)/(elements)/toc.cn â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
title: ç®åœ docs:
æå¿«æ·çç®åœåèœæ·»å æ¹åŒæ¯äœ¿çš TocKitïŒå®å·²é¢é
çœ®äº Plate UI ç»ä»¶ç TocPluginã
TocElement: æž²æç®åœå
çŽ å°å¥ä»¶å å ¥æä»¶å衚ïŒ
import { createPlateEditor } from 'platejs/react';
import { TocKit } from '@/components/editor/plugins/toc-kit';
const editor = createPlateEditor({
plugins: [
// ...å
¶ä»æä»¶
...TocKit,
],
});
</Steps>
npm install @platejs/basic-nodes @platejs/toc
åšå建çŒèŸåšæ¶ïŒå° TocPlugin å HnPlugin å å
¥ Plate æä»¶æ°ç»ã
import { TocPlugin } from '@platejs/toc/react';
import { H1Plugin, H2Plugin, H3Plugin } from '@platejs/basic-nodes/react';
import { createPlateEditor } from 'platejs/react';
const editor = createPlateEditor({
plugins: [
// ...å
¶ä»æä»¶
H1Plugin,
H2Plugin,
H3Plugin,
TocPlugin,
],
});
䜿çšèªå®ä¹ç»ä»¶åæ»åšé项é
眮 TocPluginã
import { TocPlugin } from '@platejs/toc/react';
import { H1Plugin, H2Plugin, H3Plugin } from '@platejs/basic-nodes/react';
import { createPlateEditor } from 'platejs/react';
import { TocElement } from '@/components/ui/toc-node';
import { H1Element, H2Element, H3Element } from '@/components/ui/heading-node';
const editor = createPlateEditor({
plugins: [
// ...å
¶ä»æä»¶
H1Plugin.withComponent(H1Element),
H2Plugin.withComponent(H2Element),
H3Plugin.withComponent(H3Element),
TocPlugin.configure({
node: { component: TocElement },
options: {
topOffset: 80,
isScroll: true,
},
}),
],
});
node.component: æå®æž²æç®åœå
çŽ ç TocElementoptions.topOffset: 讟眮æ»åšè³æ 颿¶çé¡¶éšåç§»éoptions.isScroll: å¯çšæ»åšè³æ é¢çè¡äžºå¯å°æ€é¡¹å å ¥æå ¥å·¥å ·æ æé®æ¥æå ¥ç®åœå çŽ ïŒ
{
icon: <TableOfContentsIcon />,
label: 'ç®åœ',
value: KEYS.toc,
}
useEditorContainerRef() äœäžº ref 屿§äŒ å
¥ãäŸåŠïŒ// åš <Plate> ç»ä»¶äžæ¹
function EditorContainer({ children }: { children: React.ReactNode }) {
const containerRef = useEditorContainerRef();
return <div ref={containerRef}>{children}</div>;
}
useEditorScrollRef() äœäžº ref 屿§äŒ å
¥ãäŸåŠïŒ// åš <Plate> ç»ä»¶äžæ¹
function Layout() {
const scrollRef = useEditorScrollRef();
return (
<main ref={scrollRef}>
<EditorContainer>
<PlateContent />
</EditorContainer>
</main>
);
}
</Steps>
TocPluginç®åœçææä»¶ã
<API name="TocPlugin"> <APIOptions> <APIItem name="isScroll" type="boolean" optional> å¯çšæ»åšè¡äžº - **é»è®€åŒ:** `true` </APIItem> <APIItem name="topOffset" type="number" optional> æ»åšè³æ 颿¶çé¡¶éšåç§»é - **é»è®€åŒ:** `80` </APIItem> <APIItem name="queryHeading" type="(editor: SlateEditor) => Heading[]" optional> èªå®ä¹æ 颿¥è¯¢åœæ° </APIItem> </APIOptions> </API>tf.insertTocæå ¥ç®åœå çŽ ã
<API name="insertToc"> <APIOptions type="InsertNodesOptions<SlateEditor>"> èç¹æå ¥é项 </APIOptions> </API>useTocElementState管ç TOC å çŽ ç¶æã
<API name="useTocElementState"> <APIReturns> <APIItem name="headingList" type="Heading[]"> ææ¡£æ 颿°ç» </APIItem> <APIItem name="onContentScroll" type="(el: HTMLElement, id: string, behavior: ScrollBehavior) => void"> æ 颿»åšå€çåš </APIItem> </APIReturns> </API>useTocElementå€ç TOC å çŽ äº€äºã
<API name="useTocElement"> <APIParameters> <APIItem name="onContentScroll" type="(el: HTMLElement, id: string, behavior: ScrollBehavior) => void"> æ¥èª useTocElementState çæ»åšå€çåš </APIItem> </APIParameters> <APIReturns> <APIItem name="props" type="object"> TOC å çŽ å±æ§ </APIItem> <APISubList> <APISubListItem parent="props" name="onClick" type="(e: React.MouseEvent, item: Heading, behavior: ScrollBehavior) => void"> TOC 项ç¹å»å€çåš </APISubListItem> </APISubList> </APIReturns> </API>useTocSideBarState管ç TOC 䟧蟹æ ç¶æã
<API name="useTocSideBarState"> <APIParameters> <APIItem name="open" type="boolean" optional> åå§å±åŒç¶æ - **é»è®€åŒ:** `true` </APIItem> <APIItem name="rootMargin" type="string" optional> Intersection Observer æ ¹èŸ¹è· - **é»è®€åŒ:** `'0px 0px 0px 0px'` </APIItem> <APIItem name="topOffset" type="number" optional> æ»åšé¡¶éšåç§»é - **é»è®€åŒ:** `0` </APIItem> </APIParameters> <APIReturns> <APIItem name="activeContentId" type="string"> åœå掻åšåºå ID </APIItem> <APIItem name="headingList" type="Heading[]"> ææ¡£æ é¢å衚 </APIItem> <APIItem name="mouseInToc" type="boolean"> éŒ æ æ¬å TOC ç¶æ </APIItem> <APIItem name="open" type="boolean"> 䟧蟹æ å±åŒç¶æ </APIItem> <APIItem name="setIsObserve" type="React.Dispatch<React.SetStateAction<boolean>>"> 讟眮è§å¯ç¶æ </APIItem> <APIItem name="setMouseInToc" type="React.Dispatch<React.SetStateAction<boolean>>"> è®Ÿçœ®éŒ æ æ¬åç¶æ </APIItem> <APIItem name="tocRef" type="React.RefObject<HTMLElement>"> TOC å çŽ åŒçš </APIItem> <APIItem name="onContentScroll" type="(options: { id: string; behavior?: ScrollBehavior; el: HTMLElement }) => void"> å 容æ»åšå€çåš </APIItem> </APIReturns> </API>useTocSideBar该é©å䞺 TOC 䟧蟹æ ç»ä»¶æäŸå±æ§åå€çåšã
<API name="useTocSideBar"> <APIParameters> <APIItem name="mouseInToc" type="boolean"> éŒ æ æ¬å TOC ç¶æ </APIItem> <APIItem name="open" type="boolean"> 䟧蟹æ å±åŒç¶æ </APIItem> <APIItem name="setIsObserve" type="React.Dispatch<React.SetStateAction<boolean>>"> 讟眮è§å¯ç¶æ </APIItem> <APIItem name="setMouseInToc" type="React.Dispatch<React.SetStateAction<boolean>>"> è®Ÿçœ®éŒ æ æ¬åç¶æ </APIItem> <APIItem name="tocRef" type="React.RefObject<HTMLElement>"> TOC å çŽ åŒçš </APIItem> <APIItem name="onContentScroll" type="(options: { id: string; behavior?: ScrollBehavior; el: HTMLElement }) => void"> å 容æ»åšå€çåš </APIItem> </APIParameters> <APIReturns> <APIItem name="navProps" type="object"> 富èªå çŽ å±æ§ </APIItem> <APISubList type="navProps"> <APISubListItem parent="navProps" name="ref" type="React.RefObject<HTMLElement>"> TOC å çŽ åŒçš </APISubListItem> <APISubListItem parent="navProps" name="onMouseEnter" type="() => void"> éŒ æ è¿å ¥å€çåš </APISubListItem> <APISubListItem parent="navProps" name="onMouseLeave" type="(e: React.MouseEvent<HTMLElement, MouseEvent>) => void"> éŒ æ 犻åŒå€çåš </APISubListItem> </APISubList> <APISubListItem parent="navProps" name="onContentClick" type="(e: React.MouseEvent<HTMLElement, MouseEvent>, item: Heading, behavior?: ScrollBehavior) => void"> TOC 项ç¹å»å€çåš </APISubListItem> </APIReturns> </API>â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ