企業級 TinyMCE Vue 編輯器解決方案 – 配置優化與性能提升指南、自定義插件

## 簡介

TinyMCE Vue 是官方提供的 TinyMCE 富文本編輯器的 Vue 組件封裝,支持 Vue 2 和 Vue 3。它讓你可以在 Vue 項目中快速集成強大的富文本編輯能力,支持多種插件、主題和自定義擴展,適用于博客、內容管理、后臺系統等多種場景。

主要特性:

- 📦 簡單集成,支持 v-model 雙向綁定
- 🧩 豐富的編輯器插件與工具欄自定義
- 🌏 多語言支持,輕松切換中文等本地化
- 🎨 支持自定義皮膚和內容樣式
- 🔌 支持圖片上傳、表格、代碼塊、媒體等高級功能
- ? 性能優秀,適配移動端和桌面端

## 安裝依賴

```bash
# 安裝 tinymce-vue
npm install @tinymce/tinymce-vue

# 或者使用 yarn
yarn add @tinymce/tinymce-vue
```

## 基本使用示例

### 創建基礎編輯器組件

```vue
<template>
<div class="editor-container">
<h2>基礎編輯器</h2>
<Editor v-model="content" :init="initConfig" @onInit="onEditorInit" />
</div>
</template>

<script setup>
import { ref } from "vue";
import Editor from "@tinymce/tinymce-vue";

const content = ref("<p>這是初始內容</p>");

const initConfig = {
height: 300,
menubar: false,
plugins: [
"advlist",
"autolink",
"lists",
"link",
"image",
"charmap",
"preview",
"anchor",
"searchreplace",
"visualblocks",
"code",
"fullscreen",
"insertdatetime",
"media",
"table",
"code",
"help",
"wordcount",
],
toolbar:
"undo redo | blocks | " +
"bold italic forecolor | alignleft aligncenter " +
"alignright alignjustify | bullist numlist outdent indent | " +
"removeformat | help",
content_style:
"body { font-family:Helvetica,Arial,sans-serif; font-size:14px }",
};

const onEditorInit = (editor) => {
console.log("編輯器初始化完成", editor);
};
</script>

<style scoped>
.editor-container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
</style>
```

注意:上面代碼無法編輯,需要注冊申請 apikey,具體參考官網

```vue
<template>
<Editor api-key="your-api-key" />
</template>
```

## 高級功能示例

```vue
<template>
<div class="advanced-editor">
<h2>高級編輯器</h2>
<Editor
v-model="advancedContent"
:init="advancedConfig"
@onChange="onContentChange"
/>
</div>
</template>

<script setup>
import { ref } from "vue";
import Editor from "@tinymce/tinymce-vue";

const advancedContent = ref("");

const advancedConfig = {
height: 400,
menubar: true,
plugins: [
"advlist",
"autolink",
"lists",
"link",
"image",
"charmap",
"preview",
"anchor",
"searchreplace",
"visualblocks",
"code",
"fullscreen",
"insertdatetime",
"media",
"table",
"paste",
"help",
"wordcount",
"emoticons",
"codesample",
],
toolbar: [
"undo redo | formatselect | bold italic backcolor | alignleft aligncenter alignright alignjustify",
"bullist numlist outdent indent | removeformat | help | image media table | emoticons codesample",
],
content_style: `
body {?
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;?
font-size: 14px;?
line-height: 1.6;
}
.mce-content-body { max-width: 100%; }
`,
// 自定義樣式
style_formats: [
{ title: "標題 1", format: "h1" },
{ title: "標題 2", format: "h2" },
{ title: "標題 3", format: "h3" },
{ title: "代碼", inline: "code" },
{ title: "引用", block: "blockquote" },
],
// 圖片上傳配置
images_upload_url: "/api/upload",
images_upload_handler: (blobInfo, progress) => {
return new Promise((resolve, reject) => {
// 模擬上傳
setTimeout(() => {
resolve("https://via.placeholder.com/300x200");
}, 1000);
});
},
};

const onContentChange = (event) => {
console.log("內容變化:", event.target.getContent());
};
</script>
```

## 常用配置選項

### 基礎配置

```javascript
const basicConfig = {
// 編輯器高度
height: 300,

? // 是否顯示菜單欄
menubar: false,

? // 啟用的插件
plugins: [
"advlist",
"autolink",
"lists",
"link",
"image",
"charmap",
"preview",
"anchor",
"searchreplace",
"visualblocks",
"code",
"fullscreen",
"insertdatetime",
"media",
"table",
"code",
"help",
"wordcount",
],

? // 工具欄配置
toolbar:
"undo redo | formatselect | bold italic | " +
"alignleft aligncenter alignright alignjustify | " +
"bullist numlist outdent indent | removeformat | help",

? // 內容樣式
content_style: "body { font-family: Arial, sans-serif; font-size: 14px; }",

? // 語言設置
language: "zh_CN",

? // 主題
skin: "oxide",

? // 占位符文本
placeholder: "請輸入內容...",
};
```

### 高級配置

```javascript
const advancedConfig = {
// 自定義樣式格式
style_formats: [
{ title: "標題 1", format: "h1" },
{ title: "標題 2", format: "h2" },
{ title: "代碼", inline: "code" },
{ title: "引用", block: "blockquote" },
],

? // 自定義按鈕
setup: (editor) => {
editor.ui.registry.addButton("custombutton", {
text: "自定義按鈕",
onAction: () => {
editor.insertContent("<p>這是自定義按鈕插入的內容</p>");
},
});
},

? // 圖片上傳
images_upload_handler: (blobInfo, progress) => {
return new Promise((resolve, reject) => {
const formData = new FormData();
formData.append("file", blobInfo.blob(), blobInfo.filename());

? ? ? fetch("/api/upload", {
method: "POST",
body: formData,
})
.then((response) => response.json())
.then((result) => resolve(result.url))
.catch((error) => reject(error));
});
},

? // 內容驗證
setup: (editor) => {
editor.on("change", () => {
const content = editor.getContent();
if (content.length > 1000) {
editor.notificationManager.warn("內容過長,請精簡");
}
});
},
};
```

## 事件處理

```javascript
// 編輯器事件
const editorEvents = {
onInit: (editor) => {
console.log("編輯器初始化完成");
},

? onChange: (event) => {
console.log("內容變化:", event.target.getContent());
},

? onBlur: (event) => {
console.log("編輯器失去焦點");
},

? onFocus: (event) => {
console.log("編輯器獲得焦點");
},

? onKeyUp: (event) => {
console.log("按鍵釋放:", event.keyCode);
},
};
```

## 自定義插件

### 插入當前時間插件

```javascript
// 注冊插入時間插件
tinymce.PluginManager.add("inserttime", function (editor) {
editor.ui.registry.addButton("inserttime", {
text: "插入時間",
tooltip: "插入當前時間",
onAction: function () {
const now = new Date();
const timeString = now.toLocaleString("zh-CN");
editor.insertContent(`<span class="timestamp">${timeString}</span>`);
},
});

? // 添加到工具欄
editor.ui.registry.addMenuItem("inserttime", {
text: "插入時間",
onAction: function () {
const now = new Date();
const timeString = now.toLocaleString("zh-CN");
editor.insertContent(`<span class="timestamp">${timeString}</span>`);
},
});
});

// 使用配置
const config = {
plugins: "inserttime",
toolbar: "inserttime",
content_style: `
.timestamp {
background-color: #f0f0f0;
padding: 2px 6px;
border-radius: 3px;
font-size: 12px;
color: #666;
}
`,
};
```

### 代碼高亮插件

```javascript
// 代碼高亮插件
tinymce.PluginManager.add("codehighlight", function (editor) {
// 添加代碼高亮按鈕
editor.ui.registry.addButton("codehighlight", {
text: "代碼高亮",
tooltip: "插入代碼塊",
onAction: function () {
editor.windowManager.open({
title: "插入代碼",
body: {
type: "panel",
items: [
{
type: "input",
name: "code",
label: "代碼內容",
placeholder: "請輸入代碼...",
},
{
type: "selectbox",
name: "language",
label: "編程語言",
items: [
{ value: "javascript", text: "JavaScript" },
{ value: "html", text: "HTML" },
{ value: "css", text: "CSS" },
{ value: "python", text: "Python" },
{ value: "java", text: "Java" },
],
},
],
},
buttons: [
{
type: "submit",
text: "插入",
},
{
type: "cancel",
text: "取消",
},
],
onSubmit: function (api) {
const data = api.getData();
const code = data.code;
const language = data.language;

? ? ? ? ? editor.insertContent(`
<pre class="code-block" data-language="${language}">
<code class="language-${language}">${editor.dom.encode(
code
)}</code>
</pre>
`);
api.close();
},
});
},
});

? // 添加到菜單
editor.ui.registry.addMenuItem("codehighlight", {
text: "代碼高亮",
onAction: function () {
// 同上的對話框邏輯
},
});
});

// 使用配置
const config = {
plugins: "codehighlight",
toolbar: "codehighlight",
content_style: `
.code-block {
background-color: #f5f5f5;
border: 1px solid #ddd;
border-radius: 4px;
padding: 10px;
margin: 10px 0;
font-family: 'Courier New', monospace;
font-size: 13px;
line-height: 1.4;
overflow-x: auto;
}
.code-block code {
background: none;
padding: 0;
}
`,
};
```

## 注意事項

1. **API Key**: 生產環境需要申請 TinyMCE API Key
2. **CDN**: 建議使用 CDN 加速加載
3. **國際化**: 需要下載對應的語言包
4. **主題**: 可以自定義主題樣式
5. **插件**: 按需加載插件以提高性能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92095.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92095.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92095.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【模電筆記】—— 直流穩壓電源——穩壓電路

Tips&#xff1a;本章節筆記建議讀者綜合學習&#xff0c;內容較多&#xff0c;可謂是模電相當重要的部分&#xff0c;因此部分知識點沒有做到詳細解釋。 1.穩壓電路的性能指標 &#xff08;同上節直流穩壓電源的主要技術指標【模電筆記】—— 直流穩壓電源——整流、濾波電路…

C++——設計模式

文章目錄一、面向對象的優點和缺點1.1 回答重點1.2 擴展知識二、面向對象的三大特點2.1 回答重點2.2 擴展知識三、設計模式的六大原則3.1 回答重點3.1.1 單一職責原則&#xff08;Single Responsibility Principle, SRP&#xff09;3.1.2 開放 - 封閉原則&#xff08;Open-Clos…

Android PDFBox 的使用指南

Android PDFBox 使用指南 概述 PDFBox是一個強大的PDF處理庫&#xff0c;在Android平臺上也有對應的實現。本指南將介紹如何在Android項目中使用PDFBox進行PDF文件的加載、讀取、修改等操作。 依賴配置 在 app/build.gradle 中添加PDFBox依賴&#xff1a; dependencies {i…

TFTP: Linux 系統安裝 TFTP,文件系統啟動后TFTP使用

安裝 TFTP 服務器 sudo apt update sudo apt install tftpd-hpa配置 TFTP 服務器 編輯配置文件 /etc/default/tftpd-hpa&#xff1a; sudo nano /etc/default/tftpd-hpa 修改內容如下&#xff1a; TFTP_USERNAME"tftp" TFTP_DIRECTORY"/srv/tftp" TFTP_ADD…

昇思+昇騰開發板+DeepSeek模型LoRA微調

昇思昇騰開發板DeepSeek模型LoRA微調 LoRA微調原理核心思想&#xff1a;凍結預訓練模型權重&#xff0c;僅訓練橙色的低秩適配矩陣&#xff08;A/B矩陣&#xff09;優勢&#xff1a; 訓練參數量減少至全量微調的0.5%顯存占用降低50%以上適配器權重僅需保存3MB&#xff08;原模型…

計算機網絡:詳解網絡地址的計算步驟

網絡地址計算是網絡規劃與配置的基礎,核心是通過IP地址和子網掩碼確定網絡標識、廣播地址、可用主機范圍等關鍵信息。以下是詳細的計算步驟,配合實例說明(以IPv4為例): 一、明確基礎概念 在計算前,需先明確3個核心概念: IP地址:標識網絡中主機的32位二進制數,通常以…

Spring AI 系列之三十五 - Spring AI Alibaba-Graph框架之MCP

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

FastAPI后端工程化項目記錄

以下是一個使用fastapi上傳視頻的接口&#xff0c;記錄一下工程化后端程序的業務邏輯 重點是代碼如何抽離 項目結構優化 project/ ├── .env # 環境變量配置 ├── app/ │ ├── __init__.py │ ├── main.py # 主應用入口 │ …

令牌桶限流算法

你提供的 Java 代碼實現的是令牌桶限流算法&#xff08;Token Bucket Algorithm&#xff09;&#xff0c;這是目前最常用、最靈活的限流算法之一。它允許一定程度的“突發流量”&#xff0c;同時又能控制平均速率。下面我將&#xff1a;逐行詳細解釋 TokenBucketLimiter 類的每…

基于springboot的寵物商城設計與實現

管理員&#xff1a;登錄&#xff0c;個人中心&#xff0c;用戶管埋&#xff0c;寵物分類管理&#xff0c;寵物信息管理&#xff0c;留言反饋&#xff0c;寵物論壇&#xff0c;系統管理&#xff0c;訂單管理用戶&#xff1a;寵物信息&#xff0c;寵物論壇&#xff0c;公告信息&a…

Python day36

浙大疏錦行 Python day36. 復習日 本周內容&#xff1a; 如何導入模塊以及庫項目的規范拆分和寫法官方文檔的閱讀MLP神經網絡的訓練在GPU上訓練模型可視化以及推理

【gaussian-splatting】用自己的數據復現高斯潑濺(一)

1.環境準備1.1.下載diff-gaussian-rasterization這里本來沒啥說的&#xff0c;直接從github上下載就行了&#xff0c;但是我踩坑了&#xff0c;下的版本不對&#xff0c;后續運行報錯參數個數對不上&#xff0c;特在此給大家避坑&#xff0c;注意一定要下帶3dgs版本的diff-gaus…

中國移動h10g-01_S905L處理器安卓7.1當貝純凈版線刷機包帶root權限_融合終端網關

下載固件之前請先將主板上的屏蔽罩取下&#xff0c;查看處理器型號 是否為S905L型號&#xff0c;然后再下載固件進行刷機&#xff1b; 本頁面的固件是采用雙公頭數據線進行刷機的哈&#xff1b; 安卓4.4.2版本固件下載地址&#xff1a;點此進行下載 安卓7.1版本固件下載地址…

夜天之書 #110 涓滴開源:Cronexpr 的故事

在年初的一篇關于商業開源的博文當中&#xff0c;我介紹了在開發商業軟件的過程中&#xff0c;衍生出開源公共軟件庫的模式。在那篇博文里面&#xff0c;我只是簡單羅列了相關開源庫的名字及一句話總結。近期&#xff0c;我會結合商業開源實踐的最新進展&#xff0c;對其中一些…

完整的登陸學生管理系統(配置數據庫)

目錄 要求 思路 1. 登錄模塊&#xff08;LoginFrame.java&#xff09; 2. 學生信息管理模塊&#xff08;StudentFrame.java&#xff09; 3. 數據層&#xff08;StudentDAO.java&#xff09; 4. 業務層&#xff08;StudentService.java / UserService.java&#xff09; 5…

譯 | 在 Python 中從頭開始構建 Qwen-3 MoE

文章出自&#xff1a;基于 2個Expert 的 MoE 架構分步指南 本篇適合 MoE 架構初學者。文章亮點在于詳細拆解 Qwen 3 MoE 架構&#xff0c;并用簡單代碼從零實現 MoE 路由器、RMSNorm 等核心組件&#xff0c;便于理解內部原理。 該方法適用于需部署高性能、高效率大模型&#x…

Spring Boot + ShardingSphere 分庫分表實戰

&#x1f680;Spring Boot ShardingSphere 實戰&#xff1a;分庫分表&#xff0c;性能暴增的終極指南&#xff01; ? 適用場景&#xff1a;千萬級大表、高并發、讀寫分離場景 ? 核心框架&#xff1a;Spring Boot 3.x ShardingSphere-JDBC 5.4.1 ? 數據庫&#xff1a;MySQL…

MaxKB 使用 MCP 連接 Oracle (免安裝 cx_Oracle 和 Oracle Instant Client)

一、背景 安裝cx_Oracle包和Oracle Instant Client來操作數據庫&#xff0c;比較繁瑣同時容易沖突&#xff0c;不同的 Oracle 版本都需要安裝不同的插件。這篇文章將介紹使用 MCP 協議的連接方法。 二、操作步驟 1、使用 1Panel 安裝 DBhub a) 數據庫類型選擇 Oracle 類型。…

基于Python的超聲波OFDM數字通信鏈路設計與實現

基于Python的超聲波OFDM數字通信鏈路設計與實現 摘要 本文詳細介紹了使用Python實現的超聲波OFDM(正交頻分復用)數字通信鏈路系統。該系統能夠在標準音響設備上運行&#xff0c;利用高于15kHz的超聲波頻段進行數據傳輸&#xff0c;采用48kHz采樣率。文章涵蓋了從OFDM基本原理、…

滑動窗口相關題目

近些年來&#xff0c;我國防沙治沙取得顯著成果。某沙漠新種植N棵胡楊&#xff08;編號1-N&#xff09;&#xff0c;排成一排。一個月后&#xff0c;有M棵胡楊未能成活。現可補種胡楊K棵&#xff0c;請問如何補種&#xff08;只能補種&#xff0c;不能新種&#xff09;&#xf…