【Tiptap】如何使用 ordered list?

You're very close! The most common reason for a Tiptap extension not working after installation is forgetting to add it to the extensions array when you initialize your editor.

Installing @tiptap/extension-ordered-list only makes the package available in your node_modules. You still need to explicitly tell your Tiptap editor instance to use it.

Also, for lists to work correctly, you typically need the ListItem extension as well, which is usually included if you're using StarterKit. If not using StarterKit, you'd need to add Paragraph, Document, Text, ListItem, and BulletList (if you want both types of lists).

Here's how to fix it:

1. Import the OrderedList extension (and ListItem if not using StarterKit)

javascript 复制代码
import { useEditor, EditorContent } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';
import OrderedList from '@tiptap/extension-ordered-list';
// If not using StarterKit, you'd also need:
// import ListItem from '@tiptap/extension-list-item';
// import Paragraph from '@tiptap/extension-paragraph';
// import Document from '@tiptap/extension-document';
// import Text from '@tiptap/extension-text';

2. Add it to your extensions array when initializing the editor:

This is the crucial step.

jsx 复制代码
import React from 'react';
import { useEditor, EditorContent } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';
import OrderedList from '@tiptap/extension-ordered-list';
// Assuming ListOrdered is an icon component you have
import { ListOrdered } from 'lucide-react'; // Example, adjust based on your icon library

const MyTiptapEditor = () => {
  const editor = useEditor({
    extensions: [
      // StarterKit includes Document, Paragraph, Text, ListItem, BulletList, OrderedList, etc.
      // If you use StarterKit, you can configure its orderedList behavior directly.
      StarterKit.configure({
        orderedList: {
          keepMarks: true, // Optional: keep text formatting (bold, italic) when toggling list
          keepAttributes: false, // Optional: keep custom attributes on list items
        },
        // If you want to disable StarterKit's default OrderedList and add your own configured one:
        // orderedList: false, // disable StarterKit's default
        // Then add OrderedList below as a separate extension
      }),

      // If you are NOT using StarterKit, or you disabled StarterKit's orderedList,
      // you MUST add OrderedList, ListItem, Paragraph, Document, and Text explicitly:
      // Document,
      // Paragraph,
      // Text,
      // ListItem, // Essential for lists
      // OrderedList.configure({
      //   HTMLAttributes: {
      //     class: 'my-custom-ordered-list',
      //   },
      // }),
      // BulletList, // If you also want bullet lists
    ],
    content: '<p>This is a paragraph.</p><p>Another line.</p>',
  });

  if (!editor) {
    return null;
  }

  const toggleOrderedList = () => {
    editor.chain().focus().toggleOrderedList().run();
  };

  return (
    <div>
      <button
        className="btn btn-ghost btn-xs"
        onClick={toggleOrderedList}
        // It's good practice to disable the button if the command can't be run
        disabled={!editor.can().toggleOrderedList()}
      >
        <ListOrdered />
      </button>

      <EditorContent editor={editor} />
    </div>
  );
};

export default MyTiptapEditor;

Explanation:

  1. import OrderedList from '@tiptap/extension-ordered-list';: This line imports the class for the ordered list extension.
  2. StarterKit.configure({ orderedList: { ... } }) : If you're using StarterKit (which is highly recommended as it bundles many essential extensions like Document, Paragraph, Text, ListItem, BulletList, etc.), you can simply configure its orderedList property. StarterKit already includes the OrderedList extension, so you generally don't need to add OrderedList separately if you're using StarterKit.
  3. OrderedList.configure(...) (Alternative/Advanced) : If you're building your extensions list from scratch (not using StarterKit) or you've disabled orderedList within StarterKit, then you would add OrderedList directly to the extensions array. Important: In this scenario, you would also need to explicitly add Document, Paragraph, Text, and ListItem for the lists to function correctly.

To debug further if it still doesn't work:

  1. Check your browser's console: Look for any errors, especially related to Tiptap or missing extensions.
  2. Verify ListItem: Ensure ListItem is present in your extensions. OrderedList relies heavily on ListItem. StarterKit includes it by default.
  3. Check editor.isActive('orderedList'): You can add a console.log(editor.isActive('orderedList')) in your button handler to see if the editor thinks it's in an ordered list state.

By adding OrderedList (either directly or via StarterKit.configure) to your extensions array, your button should now correctly toggle ordered lists!

相关推荐
不知名的老吴1 小时前
双栈秒杀表达式的生成方式
数据结构
故事和你911 小时前
洛谷-【动态规划1】动态规划的引入2
开发语言·数据结构·c++·算法·动态规划·图论
信奥胡老师4 小时前
B3968 [GESP202403 五级] 成绩排序
数据结构·算法
z200509305 小时前
今日算法(回溯算法)
数据结构·算法
m0_629494736 小时前
LeetCode 热题 100-----28. 两数相加
数据结构·算法·leetcode·链表
一路往蓝-Anbo7 小时前
第五章:如何对 HAL 库本身进行单元测试?
网络·数据结构·stm32·单片机·嵌入式硬件·单元测试·tdd
青山师7 小时前
B+树与InnoDB索引深度解析:数据库索引的底层原理与工程实践
数据结构·数据库·b树·性能优化·b+树·索引优化·mysql性能
tongluowan0077 小时前
数据结构 Bitmap(位图)完整详解
开发语言·数据结构·bitmap
代码中介商7 小时前
排序算法完全指南(五):快速排序深度详解
数据结构·算法·排序算法
纽扣6679 小时前
【算法进阶之路】链表终极进阶:合并 K 个有序链表 + 复制带随机指针的链表(含双解法)
数据结构·算法·链表