引用按钮

Available for free

一个为 Tiptap 编辑器提供的完全无障碍的引用按钮。轻松地用 <blockquote> 包裹选中的内容,支持键盘快捷键和灵活的自定义选项。

安装

通过 Tiptap CLI 添加此组件:

npx @tiptap/cli@latest add blockquote-button

组件

<BlockquoteButton />

一个预构建的 React 组件,用于切换引用格式。

用法

import { EditorContent, EditorContext, useEditor } from '@tiptap/react'
import { StarterKit } from '@tiptap/starter-kit'
import { BlockquoteButton } from '@/components/tiptap-ui/blockquote-button'

import '@/components/tiptap-node/paragraph-node/paragraph-node.scss'

export default function MyEditor() {
  const editor = useEditor({
    immediatelyRender: false,
    extensions: [StarterKit],
    content: `
        <blockquote>
            <p>"预测未来的最好方法就是发明未来."</p><p>— Alan Kay</p>
        </blockquote>
        `,
  })

  return (
    <EditorContext.Provider value={{ editor }}>
      <BlockquoteButton
        editor={editor}
        text="引用"
        hideWhenUnavailable={true}
        showShortcut={true}
        onToggled={() => console.log('引用已切换!')}
      />

      <EditorContent editor={editor} role="presentation" />
    </EditorContext.Provider>
  )
}

属性

名称类型默认值说明
editorEditor | nullundefinedTiptap 编辑器实例
textstringundefined按钮的可选文本标签
hideWhenUnavailablebooleanfalse在引用不可用时隐藏按钮
onToggled() => voidundefined成功切换后触发的回调
showShortcutbooleanfalse显示键盘快捷键徽章(如果可用)

Hooks

useBlockquote()

一个自定义 Hook,用于构建自己的引用切换按钮,完全控制渲染和行为。

用法

function MyBlockquoteButton() {
  const { isVisible, isActive, canToggle, handleToggle, label, shortcutKeys, Icon } = useBlockquote(
    {
      editor: myEditor,
      hideWhenUnavailable: true,
      onToggled: () => console.log('引用已切换!'),
    },
  )

  if (!isVisible) return null

  return (
    <button onClick={handleToggle} disabled={!canToggle} aria-label={label} aria-pressed={isActive}>
      <Icon />
      {label}
      {shortcutKeys && <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>}
    </button>
  )
}

属性

名称类型默认值说明
editorEditor | nullundefinedTiptap 编辑器实例
hideWhenUnavailablebooleanfalse在无法应用引用时隐藏按钮
onToggled() => voidundefined切换引用后触发的回调

返回值

名称类型说明
isVisibleboolean按钮是否应该被渲染
isActiveboolean引用格式当前是否激活
canToggleboolean当前是否允许切换引用格式
handleToggle() => boolean切换引用格式的函数
labelstring按钮的无障碍文本标签
shortcutKeysstring键盘快捷键(Cmd/Ctrl + Shift + B)
IconReact.FC引用按钮的图标组件

工具函数

canToggleBlockquote(editor, turnInto?)

检查当前编辑器状态是否可以切换引用格式。

import { canToggleBlockquote } from '@/components/tiptap-ui/blockquote-button'

const canToggle = canToggleBlockquote(editor) // 检查是否可以切换
const canTurnInto = canToggleBlockquote(editor, true) // 检查是否可以转换为引用

toggleBlockquote(editor)

以编程方式切换当前选区的引用格式。

import { toggleBlockquote } from '@/components/tiptap-ui/blockquote-button'

const success = toggleBlockquote(editor)
if (success) {
  console.log('引用切换成功!')
}

键盘快捷键

引用按钮支持以下键盘快捷键:

  • Cmd/Ctrl + Shift + B:切换引用格式

当使用 <BlockquoteButton /> 组件或 useBlockquote() Hook 时,快捷键会自动注册。

需求

依赖

  • @tiptap/react - Tiptap React 核心集成
  • @tiptap/starter-kit - 基础 Tiptap 扩展,包含引用支持
  • react-hotkeys-hook - 键盘快捷键管理

相关组件

  • use-tiptap-editor(Hook)
  • button(原语组件)
  • badge(原语组件)
  • tiptap-utils(函数库)
  • block-quote-icon(图标)