## 简介

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…