切换按钮以更改列表类型

Available for free

一个用于切换不同列表类型(如无序列表、有序列表和任务列表)的按钮。

安装

通过 Tiptap CLI 添加组件:

npx @tiptap/cli@latest add list-button

组件

<ListButton />

一个预构建的 React 组件,可切换指定列表类型的格式。

用法

export default function MyEditor() {
  const editor = useEditor({
    immediatelyRender: false,
    extensions: [StarterKit, TaskList, TaskItem.configure({ nested: true })],
    content: `
        <ul>
            <li>
                <strong>粗体</strong> 用于强调,使用 <code>**</code> 或 <code>⌘+B</code> 或 <code>B</code> 按钮。
            </li>
            <li>
                <em>斜体</em> 用于细微的区别,使用 <code>*</code> 或 <code>⌘+I</code> 或 <code>I</code> 按钮。
            </li>
            <li>
                <s>删除线</s> 用于显示修订,使用 <code>~~</code> 或 <code>~~S~~</code> 按钮。
            </li>
        </ul>
        <ul data-type="taskList">
          <li data-type="taskItem" data-checked="true">
            <div>测试模板</div>
          </li>
          <li data-type="taskItem" data-checked="false">
            <div>
              <a target="_blank" rel="noopener noreferrer nofollow" href="https://tiptap.dev/pricing">创建账户</a>
            </div>
          </li>
          <li data-type="taskItem" data-checked="false">
            <div>下载免费模板</div>
          </li>
        </ul>
        `,
  })

  return (
    <ListButton
      editor={editor}
      type="bulletList"
      text="Bullet List"
      hideWhenUnavailable={true}
      showShortcut={true}
      onToggled={() => console.log('List toggled!')}
    />
  )
}

属性

名称类型默认值描述
editorEditor | nullnullTiptap 编辑器实例
type'bulletList' | 'orderedList' | 'taskList'必需要切换的列表类型
hideWhenUnavailablebooleanfalse当不可用时,按钮是否应隐藏
textstring-显示在图标旁边的文本
onToggled() => void-成功切换列表后触发的回调
showShortcutbooleanfalse是否显示快捷键提示

Hooks

useList()

一个自定义 Hook,帮助您构建自定义的列表切换按钮,全面控制渲染和行为。

用法

function MyListButton() {
  const { isVisible, isActive, canToggle, handleToggle, label, shortcutKeys, Icon } = useList({
    editor: myEditor,
    type: 'bulletList',
    hideWhenUnavailable: true,
    onToggled: () => console.log('List toggled!'),
  })

  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 编辑器实例
typeListType必填要切换的列表类型
hideWhenUnavailablebooleanfalse当无法切换时,是否隐藏按钮
onToggled() => voidundefined成功切换列表后触发的回调

返回值

名称类型描述
isVisibleboolean按钮是否应被渲染
isActiveboolean指定列表类型当前是否激活
canToggleboolean当前是否允许切换列表格式
handleToggle() => boolean切换列表格式的函数
labelstring按钮的可访问标签文本
shortcutKeysstring列表类型的键盘快捷键
IconReact.FC列表按钮的图标组件

工具函数

canToggleList(editor, type, turnInto?)

判断当前编辑器状态是否允许切换指定类型的列表。

import { canToggleList } from '@/components/tiptap-ui/list-button'

const canToggle = canToggleList(editor, 'bulletList') // 判断是否可以切换
const canTurnInto = canToggleList(editor, 'bulletList', true) // 判断是否可以转换为无序列表

toggleList(editor, type)

程序化地切换指定类型的列表格式。

import { toggleList } from '@/components/tiptap-ui/list-button'

const success = toggleList(editor, 'orderedList')
if (success) {
  console.log('有序列表切换成功!')
}

isListActive(editor, type)

判断指定类型的列表当前是否激活。

import { isListActive } from '@/components/tiptap-ui/list-button'

const active = isListActive(editor, 'taskList')

getListOption(type)

获取指定列表类型的配置对象。

import { getListOption } from '@/components/tiptap-ui/list-button'

const option = getListOption('bulletList')
// 返回示例: { label: "Bullet List", type: "bulletList", icon: ListIcon }

键盘快捷键

每种列表类型都有独特的快捷键:

  • Cmd/Ctrl + Shift + 8:切换无序列表
  • Cmd/Ctrl + Shift + 7:切换有序列表
  • Cmd/Ctrl + Shift + 9:切换任务列表

使用 <ListButton /> 组件或 useList() Hook 时,这些快捷键会自动注册。

依赖

  • @tiptap/react - Tiptap React 核心集成
  • @tiptap/starter-kit - 包含列表支持的基础扩展
  • @tiptap/extension-task-list - 任务列表扩展
  • @tiptap/extension-task-item - 任务项扩展
  • react-hotkeys-hook - 键盘快捷键管理

参考组件

  • use-tiptap-editor (hook)
  • button (基础组件)
  • badge (基础组件)
  • tiptap-utils (工具库)
  • list-icon (图标)
  • list-ordered-icon (图标)
  • list-todo-icon (图标)