探索 Tiptap V3 的最新功能

JSX

在创建自定义扩展时,您通常需要定义它们如何渲染为 HTML。通常,可以通过定义一个 renderHTML 函数来完成,该函数返回 Prosemirror 渲染数组,包括标签名称、属性和内容孔。

使用 Tiptap 的 JSX 渲染器,您可以使用 JSX 来定义您的扩展应如何渲染。

在扩展中使用 JSX

要在扩展中使用 JSX,您需要一个可以处理 JSXTSX 文件的打包工具,比如 Vite 或 Webpack。大多数框架,如 Next.js、Remix 或 Nuxt,应该已经能够处理这个问题。

如果没有其他配置,默认使用 React 的 JSX 运行时。这在您尝试在非 React 环境中使用 JSX(如 Tiptap 扩展)时会导致问题。

为了处理这个问题,您可以在文件顶部添加一条注释,以指定打包工具应使用哪个 JSX 运行时。Tiptap 附带了来自 @tiptap/core 的自己的打包工具。

/** @jsxImportSource @tiptap/core */

// 在此处编写您的代码

renderHTML 函数中编写 JSX

现在,打包工具应该能够为 Tiptap 处理 JSX,您可以在 renderHTML 函数中使用 JSX。

/** @jsxImportSource @tiptap/core */

import { Node } from '@tiptap/core'

const MyNode = Node.create({
  // ... 您的节点配置

  renderHTML({ HTMLAttributes }) {
    return (
      <div {...HTMLAttributes}>
        <p>这是您的自定义节点。这里是您的内容孔:</p>
        <slot />
      </div>
    )
  }
})

<slot /> 标签用于通过 JSX 定义 Prosemirror 的内容孔。这是您的可编辑内容将被渲染的位置。

注意,这并没有使用任何组件库,如 React 或 Vue 的底层实现,并且不会支持钩子、状态或其他特定于库的功能。