編輯器
Editor Image
顯示圖片;以程式插入 img。
安裝
Terminal
pnpm dlx shadcn-vue add @admin/editor-imagepnpm add @tiptap/extension-imageimport { Image } from '@tiptap/extension-image'import { createImageHandler } from '@/registry/admin/ui/editor-image'含 createImageHandler;圖片能力來自 tiptap Image,需自行注入。把 Image.configure({}) 傳入 :extensions、createImageHandler 經 :handlers 注入後,toolbar 可放 { kind: 'image' } 按鈕(見下方用法)。
用法
<script setup lang="ts">import type { JSONContent } from '@tiptap/core'import type { EditorToolbarItem } from '@/components/admin/editor-toolbar'import { IconPhoto } from '@tabler/icons-vue'import { Image } from '@tiptap/extension-image'import { ref } from 'vue'import { cn } from '@/lib/utils'import { baseProseClass } from '@/components/admin/editor'import { createImageHandler, editorImageClass } from '@/components/admin/editor-image'import { AdminEditorToolbar, defaultEditorItems } from '@/components/admin/editor-toolbar'import { AdminRichEditor, starterKitProseClass } from '@/components/admin/rich-editor'const value = ref<JSONContent | string>( '<p>下方為 <img> 圖片,toolbar 的插入圖片按鈕會以 prompt 取網址後 setImage。</p><img src="https://picsum.photos/seed/admin-image/800/360" alt="範例圖片">')// opt-in:注入官方 Image extension 與 image handlerconst extensions = [Image.configure({})]const handlers = { image: createImageHandler() }// 預設 toolbar(純 StarterKit)後面 append image 按鈕const items: EditorToolbarItem[][] = [ ...defaultEditorItems, [{ kind: 'image', icon: IconPhoto, label: '插入圖片', tooltip: { text: '插入圖片' } }]]</script><template> <admin-rich-editor v-slot="{ editor, handlers: mergedHandlers }" v-model="value" :extensions="extensions" :handlers="handlers" :ui="{ base: cn(baseProseClass, starterKitProseClass, editorImageClass) }" > <admin-editor-toolbar :editor :handlers="mergedHandlers" :items="items" /> </admin-rich-editor></template><script setup lang="ts">import type { EditorToolbarItem } from '@/registry/admin/ui/editor-toolbar'import { IconPhoto } from '@tabler/icons-vue'import { Image } from '@tiptap/extension-image'import { ref } from 'vue'import { createImageHandler } from '@/registry/admin/ui/editor-image'import { AdminEditorToolbar, defaultEditorItems } from '@/registry/admin/ui/editor-toolbar'import { AdminRichEditor } from '@/registry/admin/ui/rich-editor'const value = ref('<p>圖:<img src="https://picsum.photos/seed/admin-image/800/360" alt="x"></p>')const extensions = [Image.configure({})]const handlers = { image: createImageHandler() }const items: EditorToolbarItem[][] = [ ...defaultEditorItems, [{ kind: 'image', icon: IconPhoto, label: '插入圖片', tooltip: { text: '插入圖片' } }]]</script><template> <admin-rich-editor v-model="value" :extensions="extensions" :handlers="handlers"> <admin-editor-toolbar :items="items" /> </admin-rich-editor></template>啟用後:
<img>顯示不會被 tiptap parser 丟掉editor.commands.setImage({ src, alt })可程式式插入圖片- 序列化輸出為原始
<img src="...">(HTML)或 image node attrs(JSON)
進階 configure
需要 inline 圖片、允許 base64 等,自行用 Image.configure({...}) 建立 instance:
<script setup lang="ts">import { Image } from '@tiptap/extension-image'const customImage = Image.configure({ inline: true, allowBase64: true })</script><template> <admin-rich-editor v-model="value" :extensions="[customImage]" /></template>API 參考
@tiptap/extension-image 套件 API 詳見 tiptap image 官方文件。
注意事項
- extension 必須在建立編輯器時注入:
Image無法於編輯器建立後補上,未注入時<img>內容會被 parser 丟掉。