TinyMCE在vue中的使用

7 篇文章 0 订阅
3 篇文章 0 订阅

概要

TinyMCE是个插件丰富,可扩展性强,功能配置灵活简单,加载速度快,界面好看,符合现代审美,可支持多种语言的富文本编辑器,支持嵌入web应用页面中使用,最大的优点是开源且大部分功能免费,常用的有内联样式和经典样式

官网地址:TinyMCE
中文文档可参考(该文档是仅支持原生html):TinyMCE中文

使用场景例子:

要求将几十种word文档的内容动态展示到web页面,并且支持免费离线编辑页面内容


整体实现思路

利用mommoth将word文档内容先转化为html代码,再将html代码渲染到富文本编辑器内,这期间可能会导致部分样式流失,可以根据replace替换添加样式等

vue下载安装依赖

	//vue3安装命令
	npm install tinymce
	npm install @tinymce/tinymce-vue

	//vue2安装命令
	npm install tinymce@5.1.0
	npm install @tinymce/tinymce-vue@3.0.1

vue2项目要安装低版本的,否则因为不兼容会报错

安装之后在node_modules里面找到tiynmce文件,将里面的文件复制到根目录下的public或者assets文件夹下,这里我放在public里面的,如下图,删除多余的文件,这几个文件即可。(最底下的文件是tinymce.min.js,被水印遮住了,估计看不清)在这里插入图片描述

里面的langs文件是需要汉化的语言包,从官网网页下载,下滑找到你想要的的语言包,这里我用的是中文包。
在这里插入图片描述
点击download下载下来是个压缩包,解压后就是langs文件放在对应的tinymce目录下

在这里插入图片描述

代码实现

 	   <tiny-editor
        ref="tinymceRefs"
        v-model="content"
        :init="init"
        id="textarea"
        @onClick="clickBtn"
      ></tiny-editor>

//js部分
import editorss from "@tinymce/tinymce-vue";
export default {
  name: "HelloWorld",
  components: {
    "tiny-editor": editorss,
  },
}

配置

	init: {
        // 配置信息
        selector: "#textarea", //这里selector是绑定上面组件
        height: 600,
        width: 1000,
        min_height: 450,
        language_url: "public/js/tinymce/langs/zh-Hans.js", // 中文包的存放路径
        language: "zh-Hans",
        statusbar: false, // 底部的状态栏
        // skin_url: "public/js/tinymce/skins/ui/oxide-dark",
        // content_css: "public/js/tinymce/skins/content/dark/content.min.css",
        // resize: false,
        //inline: true, //使用selector无法开启内联样式 这块待研究
        font_formats:
          "仿宋体=FangSong,serif;微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;",
        plugins:
          "print preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help emoticons autosave bdmap indent2em autoresize formatpainter axupimgs",
        toolbar:
          "code undo redo restoredraft | cut copy paste pastetext | forecolor backcolor bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify outdent indent | \
        styleselect formatselect fontselect fontsizeselect | bullist numlist | blockquote subscript superscript removeformat | \
        table image media charmap emoticons hr pagebreak insertdatetime print preview | fullscreen | bdmap indent2em lineheight formatpainter axupimgs",
        //setup 和init_instance_callback是tinymce的两个生命周期
        setup(editor) {
          console.log("setup函数开始执行>>>>>>", editor);
        },
        init_instance_callback: function (editor) 
          console.log("init_instance_callback函数开始执行>>>>>>", editor);
        },
      },

一共有两个生命周期

  1. setup —— 还没渲染到页面之前所执行的方法

  2. init_instance_callback —— 页面渲染完毕所执行的函数

此时富文本编辑器的页面会有一段黄色的文本提示:
在这里插入图片描述
解决办法:在public的文件夹下面index.html文件里面引入tinymce.min.js文件

	<script type="text/javascript" src="./js/tinymce/tinymce.min.js"></script>
    <script type="text/javascript" src="./js/tinymce/langs/zh-Hans.js"></script>

完整代码如下

提示:这里我是先上传文件拿到html元素后再渲染内容到编辑器内

<template>
  <div>
    <input id="document" @change="Buffer" type="file" />
    <div ref="output"></div>
    <div class="ceshi">
      76890-
      <tiny-editor
        ref="tinymceRefs"
        v-model="content"
        :init="init"
        id="textarea"
        @onClick="clickBtn"
      ></tiny-editor>
    </div>
  </div>
</template>
<script>
import mammoth from "mammoth";
import tinymce from "tinymce/tinymce"; //tinymce默认hidden,不引入不显示
import editorss from "@tinymce/tinymce-vue";
export default {
  name: "HelloWorld",
  components: {
    "tiny-editor": editorss,
  },
  data() {
    return {
      content: "",
      htmlContent: "",
      html: "",
      editorfll: "",
      init: {
        // 配置信息
        selector: "#textarea", //这里selector是绑定上面组件
        height: 600,
        width: 1000,
        min_height: 450,
        language_url: "public/js/tinymce/langs/zh-Hans.js", // 中文包的存放路径
        language: "zh-Hans",
        statusbar: false, // 底部的状态栏
        // skin_url: "public/js/tinymce/skins/ui/oxide-dark",
        // content_css: "public/js/tinymce/skins/content/dark/content.min.css",
        // resize: false,
        //inline: true, //使用selector无法开启内联样式 这块待研究
        font_formats:
          "仿宋体=FangSong,serif;微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;",
        plugins:
          "print preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help emoticons autosave bdmap indent2em autoresize formatpainter axupimgs",
        toolbar:
          "code undo redo restoredraft | cut copy paste pastetext | forecolor backcolor bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify outdent indent | \
        styleselect formatselect fontselect fontsizeselect | bullist numlist | blockquote subscript superscript removeformat | \
        table image media charmap emoticons hr pagebreak insertdatetime print preview | fullscreen | bdmap indent2em lineheight formatpainter axupimgs",
        setup(editor) {
          console.log("setup函数开始执行>>>>>>", editor);
          editor.on("click", function () {
            // console.log("click事件触发>>>>>>", editor.getContent());
          });
        },
        init_instance_callback: function (editor) {
          editor.setContent("");
          console.log("init_instance_callback函数开始执行>>>>>>", editor);
        },
      },
    };
  },
  watch: {},
  methods: {
    clickBtn() {},
    Buffer(event) {
      var file = event.target.files[0];
      var reader = new FileReader();
      reader.onload = function (loadEvent) {
        var arrayBuffer = loadEvent.target.result;
        mammoth.convertToHtml({ arrayBuffer: arrayBuffer }).then((res) => {
          this.html = res.value;
          // 将解析出来的dom元素的展示替换成自己想要的样子
          this.content = this.html.replace(/<table>/g,'<table style="border-collapse: collapse;width:860px;">')
            .replace(/<tr>/g, '<tr style="border: 1px solid rgb(204, 204, 204);color:#555555;">')
            .replace(/<td>/g,'<td style="border: 1px solid rgb(204, 204, 204); padding: 8px 15px;">')
            .replace(/<p>|<\/p>/g, "")
            //拿到html代码,再次渲染内容到编辑器内
          window.tinymce.get("textarea").setContent(this.content);
          // this.showResult(this.content);
        });
      };
      reader.readAsArrayBuffer(file);
    },
    showResult(result) 
      // 将解析出来的html展示在页面上
      document.getElementById("#output").html(result);
    },
  },
};
</script>

效果如下

在这里插入图片描述

插入mammoth的使用

刚开始我用新的脚手架(config文件啥也没配置),下载mammoth插件会报错,懒得改了,套个现成的框架就好使的很

//下载命令
npm install mammoth

项目里我是局部引入的,在用到的vue文件里面引入即可:

import mammoth from "mammoth";

使用:

<input id="document" @change="Buffer" type="file" />


Buffer(event) {
      var file = event.target.files[0];
      var reader = new FileReader();
      reader.onload = function (loadEvent) {
        var arrayBuffer = loadEvent.target.result;
        mammoth.convertToHtml({ arrayBuffer: arrayBuffer }).then((res) => {
          this.html = res.value;
          // 将解析出来的dom元素的展示替换成自己想要的样子
          this.content = this.html.replace(/<table>/g,'<table style="border-collapse: collapse;width:860px;">')
      		// 将解析出来的html展示在页面上
      		document.getElementById("#output").html(result);      		
        });
      };
      reader.readAsArrayBuffer(file);
    },
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TinyMCEVue使用可以通过引入相应的组件来实现。有几种不同的组件可以选择使用,比如vue-tinymcetinymce-vue。引用\[1\]提到了使用vue-tinymce的方法,首先需要安装组件,然后在Vue项目引入并使用该组件。具体的安装和使用方法可以参考引用\[1\]的代码示例。引用\[2\]提到了使用tinymce-vue组件的方法,需要在Vue项目的components注册该组件,并在模板直接使用。引用\[3\]提到了另一种初始化TinyMCE的方法,需要将相关文件复制到指定目录,并引入相应的文件和语言包。根据具体的需求和项目情况,可以选择适合的方法来使用TinyMCEVue进行富文本编辑。 #### 引用[.reference_title] - *1* [TinyMCE富文本编辑器在Vue使用](https://blog.csdn.net/weixin_40252368/article/details/123369109)[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^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [tinymcevue使用](https://blog.csdn.net/qq_45164516/article/details/122435291)[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^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值