âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â ð shadcn/directory/udecode/plate/migration/slate-to-plate.cn â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
Plate æå»ºäº Slate ä¹äžïŒå æ€ä»çº¯ Slate å®ç°è¿ç§»å° Plate çžå¯¹ç®åãæ¬æåå°åž®å©æšå°åºäº Slate ççŒèŸåšè¿æž¡å° Plateã
éŠå ïŒå®è£ å¿ èŠç Plate å ãåŠææšæ¯ Plate çæ°çšæ·ïŒå¯ä»¥å é 读ä»ç»äºè§£åºçæŠåµã
npm install platejs
å°æšç Slate å¯Œå ¥æ¿æ¢äžº Plate å¯Œå ¥ãPlate éæ°å¯Œåºäºå€§å€æ° Slate ç±»åååœæ°ïŒ
// ä¹å
import { createEditor } from 'slate';
import { Slate, Editable, withReact } from 'slate-react';
// ä¹å
import { createPlateEditor, Plate, PlateContent } from 'platejs/react';
å° createEditorãwithHistory å withReact æ¿æ¢äžº createPlateEditorïŒ
// ä¹å
const editor = useMemo(() => withReact(withHistory(createEditor()))), []);
// ä¹å
const editor = createPlateEditor({
value,
plugins: [
// åšæ€å€æ·»å å
¶ä»æä»¶
],
});
æå ³çŒèŸåšé çœ®çæŽå€è¯Šæ ïŒè¯·æ¥ççŒèŸåšé 眮æåã
å° Slate å Editable ç»ä»¶æ¿æ¢äžº Plate ç Plate ç»ä»¶ïŒ
// ä¹å
<Slate editor={editor} value={value}>
<Editable className="p-4" />
</Slate>
// ä¹å
<Plate editor={editor}>
<PlateContent className="p-4" />
</Plate>
对äºèªå®ä¹å çŽ åå¶åïŒå建 Plate æä»¶ïŒ
// ä¹å
const renderElement = useCallback(({ attributes, children, element }) => {
switch (element.type) {
case 'paragraph':
return <p {...attributes}>{children}</p>;
// ... å
¶ä»æ
åµ
}
}, []);
// ä¹å
import { type PlateElement, type PlateElementProps } from 'platejs/react';
import { cn } from '@/lib/utils';
export function ParagraphElement(props: PlateElementProps) {
return (
<PlateElement {...props} className="m-0 px-0 py-1'">
{props.children}
</PlateElement>
);
}
const ParagraphPlugin = createPlatePlugin({
key: 'p',
node: {
isElement: true,
type: 'paragraph',
component: ParagraphElement,
},
});
åšæä»¶é 眮æååæä»¶ç»ä»¶æåäžäºè§£æŽå€å ³äºå建æä»¶çä¿¡æ¯ã
åŠææšæèªå®ä¹ Slate æä»¶ïŒå°å®ä»¬èœ¬æ¢äžº Plate æä»¶ïŒ
// ä¹å
const withMyPlugin = (editor) => {
const { insertText } = editor;
editor.insertText = (text) => {
// èªå®ä¹é»èŸ
insertText(text);
};
return editor;
};
// ä¹å
const MyPlugin = createPlatePlugin({
key: 'myPlugin',
}).overrideEditor(({ editor, tf: { insertText } }) => ({
transforms: {
insertText(text, options) {
// èªå®ä¹é»èŸ
insertText(text, options);
},
}
}));
// æ·»å æ°æ¹æ³ïŒ
const MyOtherPlugin = createPlatePlugin({
key: 'myOtherPlugin',
}).extendEditorTransforms(({ editor }) => ({
newMethod(text) {
// æ·»å æ°åèœ
}
}));
æå ³æä»¶äžäžæçæŽå€ä¿¡æ¯ïŒè¯·åé æä»¶äžäžææåã
æŽæ°æšçäºä»¶å€ççšåºä»¥äœ¿çš Plate çæä»¶ç³»ç»ïŒ
// ä¹å
const onKeyDown = (event) => {
if (event.key === 'Tab') {
// å€ç Tab é®
}
};
// ä¹å
const TabPlugin = createPlatePlugin({
key: 'tab',
handlers: {
onKeyDown: ({ editor, event }) => {
if (event.key === 'Tab') {
// å€ç Tab é®
}
},
},
});
æè ïŒæšå¯ä»¥äœ¿çš Plate 区倧çå¿«æ·é®ç³»ç»ïŒ
const TabPlugin = createPlatePlugin({
key: 'tab',
shortcuts: {
indent: {
handler: ({ editor }) => {
// å€ç Tab é®
},
keys: ['Tab'],
},
},
});
æå ³äœ¿çšå¿«æ·é®çæŽå€è¯Šæ ïŒè¯·æ¥çæä»¶å¿«æ·é®æåã
çæ Plate ç API 并䜿çšå ¶å·¥å ·åé©åïŒ
// äœ¿çš Plate ç transforms
editor.tf.toggleMark('bold');
// äœ¿çš Plate çè°è¯ API
editor.api.debug.log('Hello, Plate!');
æå ³çŒèŸå𿹿³ç宿Žå衚ïŒè¯·åé çŒèŸå𿹿³æåã
Plate æäŸäºè®žå€å 眮æä»¶ïŒæšå¯ä»¥åšäŸ§èŸ¹æ äžæ¥çã䜿çšå®ä»¬å¿«éæ·»å åèœïŒ
import { BoldPlugin, ItalicPlugin, UnderlinePlugin } from 'platejs/react';
const plugins = [
BoldPlugin,
ItalicPlugin,
UnderlinePlugin,
// ... å
¶ä»æä»¶
];
const editor = createPlateEditor({ plugins });
è¿ç§»å®æåïŒåœ»åºæµè¯æšççŒèŸåšä»¥ç¡®ä¿ææåèœæé¢æå·¥äœãäœ¿çš Plate çåèœåæäœ³å®è·µè¿è¡äŒåã
æå ³è°è¯æå·§åçç¥ïŒè¯·æ¥çæä»¬çè°è¯æåã
â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ