tinymce富文本编辑器使用

安装富文本编辑器:npm i @tinymce/tinymce-vue

当前项目中富文本是放在一个dialog中,因此部分样式会有层叠问题,该组件样式部分不添加scope。这里图片上传只是前端静态数据展示收集。

<template>
  <div class="desc-editor" style="overflow-y: auto">
    <Editor
      api-key="eat8j5kgv25uac1uviaowlkcfrz1o48jnjkjjbnm8h54bkmy"
      :init="config"
      v-model="editorValue"
      ref="editorRef"
      @change="inputTinymceFun"
    />
    <!-- 编辑器底部操作区域 -->
    <slot name="opt" />
  </div>
</template>

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

let props = defineProps({
  user: {
    //代表什么地方使用的,主要用于处理图片逻辑
    type: String,
    default: "desc",
  },
});

const editorValue = ref("");
const editorRef = ref("");
const imgUrlList = ref([]); //图片以数组的形式存储,不放在富文本中显示

const config = {
  plugins: "lists link image table code help wordcount autoresize",
  language_url: "/tinymce/language/langs/zh_CN.js",
  language: "zh_CN",
  branding: false, //取出底部官网提示
  //Enter或者shift+Enter都添加<br>标签,不添加<p>标签
  // newline_behavior: "linebreak",
  images_upload_handler(blobInfo, success, failure) {
    return new Promise((resolve, reject) => {
      // 创建 FileReader 对象
      var reader = new FileReader();
      // 设置加载完成后的回调
      reader.onload = function (e) {
        // 获取Base64编码的结果
        var base64 = e.target.result;
        imgUrlList.value.push(base64);
        resolve(base64);
      };
      // 读取文件
      reader.readAsDataURL(blobInfo.blob());
    });
  },
};

function inputTinymceFun(data) {
  // 获取富文本内容
  const content = data.target.getContent();
  // 删除 base64 图片
  if (props.user === "desc" && content.includes('<img src="data:image/')) {
    const newContent = content.replace(
      /<img[^>]+src="data:image\/[^"]+"[^>]*>/g,
      ""
    );
    data.target.setContent(newContent);
  }
}

function handleSave() {
  return editorValue.value;
}

function handleCancel(val) {
  editorValue.value = val;
}

defineExpose({
  handleSave,
  handleCancel,
  imgUrlList,
});
</script>

<style lang="scss">
/* 这里不能加scope,否则富文本样式出问题 */
.tox-tinymce-aux {
  z-index: 99999 !important;
}
.tinymce.ui.FloatPanel {
  z-index: 99;
}

.tox-menu {
  &::-webkit-scrollbar {
    width: 10px;
  }

  &::-webkit-scrollbar-track {
    background: #444444;
    border-radius: 10px;
  }

  &::-webkit-scrollbar-thumb {
    background: #e3ece8;
    border-radius: 10px;
  }
}

.opt {
  margin-top: 10px;
}
</style>

在这里插入图片描述
我的项目中这种方式使用,每次打开会请求一些官网的数据,如果网不好会渲染不出来,所以最后还是下载安装包引入的。官网根据需求下载对应版本,解压到如下目录结构中。
在这里插入图片描述
index.html文件中直接引入如下代码

    <script src="/public/tinymce/tinymce/tinymce.min.js"></script>

然后修改之前上面的代码如下

<template>
  <div class="desc-editor" style="overflow-y: auto">
    <textarea :id="editorId" />
  </div>
</template>

<script setup>
import { onMounted, ref, onUnmounted, nextTick } from "vue";
import dayjs from "dayjs";



let props = defineProps({
  user: {
    //代表什么地方使用的,主要用于处理图片逻辑
    type: String,
    default: "desc",
  },

});


const config = {
  license_key: "gpl",
  plugins: "lists link image table code help wordcount autoresize",
  language_url: "/tinymce/language/langs/zh_CN.js",
  language: "zh_CN",
  branding: false, //取出底部官网提示
  promotion: false,

  //Enter或者shift+Enter都添加<br>标签,不添加<p>标签
  // newline_behavior: "linebreak",
  setup(editor) {
    editor.on("change", (e) => {
      inputTinymceFun(editor);
    });
    editor.on("keyup", (e) => {
      inputTinymceFun(editor);
    });
  },
  images_upload_handler(blobInfo, success, failure) {
    return new Promise((resolve, reject) => {
      // 创建 FileReader 对象
      var reader = new FileReader();
      // 设置加载完成后的回调
      reader.onload = function (e) {
        // 获取Base64编码的结果
        var base64 = e.target.result;
        let imgObj = {
          url: base64,
          fileName: blobInfo.blob().name,
          createAt: dayjs().format("YYYY-MM-DD HH:mm:ss"),
          updateAt: dayjs().format("YYYY-MM-DD HH:mm:ss"),
          id: setId(),
        };
        resolve(base64);
      };
      // 读取文件
      reader.readAsDataURL(blobInfo.blob());
    });
  },
};

function inputTinymceFun(data) {
  //如果想富文本编辑器中上传图片同时显示就注释下面代码
  // if (props.user === "desc") {
  //   const content = tinymce.activeEditor.getContent();
  //   if (content.includes('<img src="data:image/')) {
  //     const newContent = content.replace(
  //       /<img[^>]+src="data:image\/[^"]+"[^>]*>/g,
  //       ""
  //     );
  //     tinymce.activeEditor.setContent(newContent);
  //   }
  // }
}

function handleSave() {
  return tinymce.activeEditor.getContent();
}

function handleCancel(val) {
  if (!val) val = "";
  nextTick(() => {
    tinymce.activeEditor.setContent(val);
  });
}

//清空编辑器内容
function cleanEditorVal() {
  tinymce.activeEditor.setContent("");
}

defineExpose({
  handleSave,
  handleCancel,
  imgUrlList,
  setEditorValue,
  cleanEditorVal,
  handleAddCommentSave,
});
</script>

<style lang="scss">
/* 这里不能加scope,否则富文本样式出问题 */
.tox-tinymce-aux {
  z-index: 99999 !important;
}
.tinymce.ui.FloatPanel {
  z-index: 99;
}

.tox-menu {
  &::-webkit-scrollbar {
    width: 10px;
  }

  &::-webkit-scrollbar-track {
    background: #444444;
    border-radius: 10px;
  }

  &::-webkit-scrollbar-thumb {
    background: #e3ece8;
    border-radius: 10px;
  }
}

.opt {
  margin-top: 10px;
}
</style>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过以下步骤来使用tinymce富文本编辑器: 1. 引入tinymce资源文件: 首先,你需要在你的项目中引入tinymce的资源文件。你可以从官方网站下载或者使用CDN链接。在你的HTML文件中添加以下代码来引入tinymce的资源文件: ```html <script src="https://cdn.tiny.cloud/1/your-api-key/tinymce/5/tinymce.min.js"></script> ``` 请将"your-api-key"替换为你自己的API密钥。 2. 创建一个textarea元素: 在你的HTML文件中,创建一个textarea元素来作为tinymce编辑器的容器。例如: ```html <textarea id="myTextarea"></textarea> ``` 3. 初始化tinymce: 使用以下代码来初始化tinymce编辑器: ```javascript tinymce.init({ selector: '#myTextarea' }); ``` 这将把id为"myTextarea"的textarea元素转换成一个tinymce编辑器。 4. 配置编辑器选项: 你可以根据需要配置编辑器的选项,比如设置编辑器的语言、工具栏按钮、插件等。你可以在初始化tinymce时传入一个选项对象来配置编辑器。例如: ```javascript tinymce.init({ selector: '#myTextarea', language: 'zh_CN', plugins: 'link image code', toolbar: 'undo redo | bold italic | alignleft aligncenter alignright | code' }); ``` 这个例子中,我们设置了编辑器的语言为中文,加载了链接、图片和代码插件,并且设置了工具栏按钮。 5. 更多功能和配置: tinymce有很多其他的功能和配置,你可以参考官方文档来了解更多详细信息。官方文档提供了丰富的示例和教程,帮助你快速上手和使用tinymce富文本编辑器。你可以在官方网站的文档页面找到更多信息。 希望这些步骤可以帮助到你使用tinymce富文本编辑器。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [在 Vue 项目中引入 tinymce 富文本编辑器的完整代码](https://download.csdn.net/download/weixin_38688855/12760354)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [tinymce富文本编辑器使用](https://blog.csdn.net/weixin_44867717/article/details/128167874)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值