本指南介绍了如何将 Tiptap 集成到你的 React 项目中。我们使用 Vite 进行示例,但在其他环境中的工作流程也类似。

创建 React 项目(可选)

从一个全新的 React 项目 my-tiptap-project 开始。Vite 会帮你搭建所需的环境。

  1. # 使用 npm 创建项目
  2. npm create vite@latest my-tiptap-project -- --template react-ts
  3. # 或者,使用 pnpm 创建项目
  4. pnpm create vite@latest my-tiptap-project --template react-ts
  5. # 或者,使用 yarn 创建项目
  6. yarn create vite my-tiptap-project --template react-ts
  7. # 进入项目目录
  8. cd my-tiptap-project

安装依赖

接下来,安装 @tiptap/react(Tiptap 的 React 版本)、@tiptap/pm(ProseMirror 库)以及 @tiptap/starter-kit(包含最常见的扩展)。

  1. npm install @tiptap/react @tiptap/pm @tiptap/starter-kit

如果你已经完成了前两个步骤,现在可以运行 npm run dev,然后在浏览器中打开 http://localhost:3000

集成 Tiptap

要使用 Tiptap,我们需要创建一个新组件。我们将其命名为 Tiptap,并在 src/Tiptap.tsx 中添加以下代码:

  1. // src/Tiptap.tsx
  2. import { EditorProvider, FloatingMenu, BubbleMenu } from '@tiptap/react'
  3. import StarterKit from '@tiptap/starter-kit'
  4. // 定义扩展数组
  5. const extensions = [StarterKit]
  6. const content = '<p>Hello World!</p>'
  7. const Tiptap = () => {
  8. return (
  9. <EditorProvider extensions={extensions} content={content}>
  10. <FloatingMenu editor={null}>This is the floating menu</FloatingMenu>
  11. <BubbleMenu editor={null}>This is the bubble menu</BubbleMenu>
  12. </EditorProvider>
  13. )
  14. }
  15. export default Tiptap

重要提示:如果你想避免使用 EditorProvider 组件,可以使用 useEditor 钩子:

  1. // src/Tiptap.tsx
  2. import { useEditor, EditorContent, FloatingMenu, BubbleMenu } from '@tiptap/react'
  3. import StarterKit from '@tiptap/starter-kit'
  4. // 定义扩展数组
  5. const extensions = [StarterKit]
  6. const content = '<p>Hello World!</p>'
  7. const Tiptap = () => {
  8. const editor = useEditor({
  9. extensions,
  10. content,
  11. })
  12. return (
  13. <>
  14. <EditorContent editor={editor} />
  15. <FloatingMenu editor={editor}>This is the floating menu</FloatingMenu>
  16. <BubbleMenu editor={editor}>This is the bubble menu</BubbleMenu>
  17. </>
  18. )
  19. }
  20. export default Tiptap

将组件添加到应用

最后,替换 src/App.tsx 的内容,使用我们的 Tiptap 组件:

  1. import Tiptap from './Tiptap'
  2. const App = () => {
  3. return (
  4. <div className="card">
  5. <Tiptap />
  6. </div>
  7. )
  8. }
  9. export default App

在子组件中使用 Editor 上下文

如果你使用 EditorProvider 设置 Tiptap 编辑器,则可以通过 useCurrentEditor 钩子在子组件中访问编辑器实例:

  1. import { useCurrentEditor } from '@tiptap/react'
  2. const EditorJSONPreview = () => {
  3. const { editor } = useCurrentEditor()
  4. return <pre>{JSON.stringify(editor.getJSON(), null, 2)}</pre>
  5. }

重要:如果你使用 useEditor 钩子初始化编辑器,则 useCurrentEditor 无法使用。

你现在应该可以在浏览器中看到一个简单的 Tiptap 编辑器示例。

添加前置或后置内容

由于 EditorContent 组件是由 EditorProvider 组件渲染的,因此你无法直接定义编辑器前后的内容。可以使用 slotBeforeslotAfter 进行设置:

  1. <EditorProvider
  2. extensions={extensions}
  3. content={content}
  4. slotBefore={<MyEditorToolbar />}
  5. slotAfter={<MyEditorFooter />}
  6. />

传递容器属性

EditorProvider 组件支持 editorContainerProps,可用于传递编辑器容器的属性:

  1. <EditorProvider
  2. extensions={extensions}
  3. content={content}
  4. editorContainerProps={{ className: 'editor-container' }}
  5. />

优化性能

建议访问 React 性能优化指南,以高效地集成 Tiptap 编辑器。这将帮助你在应用扩展时避免潜在的问题。