经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
vue3项目中使用tinymce的方法
来源:jb51  时间:2023/4/26 8:50:00  对本文有异议

tinymce是一个功能齐全的富文本编辑器插件,但在vue中引入tinymce并不像别的Vue富文本插件一样那么顺利,tinymce本身并不适配Vue,还需要引入@tinymce/tinymce-vue,并且它是国外的富文本插件,没有通过中文版本,需要在其官网下载翻译包(可能需要翻墙)。下面给大家介绍下vue3项目中使用tinymce的方法。

1、安装相关依赖

  1. npm install tinymce -S
  2. npm install @tinymce/tinymce-vue -S

2、下载中文包

地址 https://www.tiny.cloud/get-tiny/language-packages/

3. 引入皮肤和汉化包

在项目public文件夹下新建tinymce文件夹,
将下载的汉化包解压到此文件夹
然后在node_modules/tinymce中找到skins文件夹,也复制到public/tinymce里

4. 封装组件:在src/components下新建TEditor.vue,并写入以下代码

  1. <template>
  2. <editor v-model="myValue" :init="init" :disabled="disabled" :id="tinymceId"></editor>
  3. </template>
  4.  
  5.  
  6. <script setup lang="ts">
  7. //JS部分
  8. //在js中引入所需的主题和组件
  9. import tinymce from 'tinymce/tinymce'
  10. import 'tinymce/skins/content/default/content.css'
  11. import Editor from '@tinymce/tinymce-vue'
  12. import 'tinymce/themes/silver'
  13. import 'tinymce/themes/silver/theme'
  14. import 'tinymce/icons/default'; //引入编辑器图标icon,不引入则不显示对应图标
  15. import 'tinymce/models/dom' // 这里是个坑 一定要引入
  16.  
  17.  
  18. //在TinyMce.vue中接着引入相关插件
  19. import "tinymce/icons/default/icons"
  20. // import "tinymce/plugins/image" // 插入上传图片插件
  21. // import "tinymce/plugins/media" // 插入视频插件
  22. import "tinymce/plugins/table" // 插入表格插件
  23. import "tinymce/plugins/lists" // 列表插件
  24. import "tinymce/plugins/wordcount" // 字数统计插件
  25. import "tinymce/plugins/code" // 源码
  26. // import "tinymce/plugins/fullscreen" //全屏
  27.  
  28. //接下来定义编辑器所需要的插件数据
  29. import { reactive, ref } from "vue"
  30. import { onMounted, defineEmits, watch } from "@vue/runtime-core"
  31. import axios from 'axios'
  32. // import { updateImg } from '@/api/order/order'
  33. const emits = defineEmits(["getContent"])
  34. //这里我选择将数据定义在props里面,方便在不同的页面也可以配置出不同的编辑器,当然也可以直接在组件中直接定义
  35. const props = defineProps({
  36. value: {
  37. type: String,
  38. default: () => {
  39. return ""
  40. },
  41. },
  42. baseUrl: {
  43. type: String,
  44. default: "",
  45. },
  46. disabled: {
  47. type: Boolean,
  48. default: false,
  49. },
  50. plugins: {
  51. type: [String, Array],
  52. default: "lists table",
  53. },//必填
  54. toolbar: {
  55. type: [String, Array],
  56. default:
  57. "codesample bold italic underline alignleft aligncenter alignright alignjustify | undo redo | formatselect | fontselect | fontsizeselect | forecolor backcolor | bullist numlist outdent indent | lists link table code | removeformat ",
  58. },//必填
  59. })
  60. //用于接收外部传递进来的富文本
  61. const myValue = ref(props.value)
  62. const tinymceId = ref("vue-tinymce-" + +new Date() + ((Math.random() * 1000).toFixed(0) + ""))
  63. //定义一个对象 init初始化
  64. const init = reactive({
  65. selector: '#' + tinymceId.value, //富文本编辑器的id,
  66. language_url: "/tinymce/langs/zh_CN.js", // 语言包的路径,具体路径看自己的项目,文档后面附上中文js文件
  67. language: "zh_CN", //语言
  68. skin_url: "/tinymce/skins/ui/oxide", // skin路径,具体路径看自己的项目
  69. height: 400, //编辑器高度
  70. branding: false, //是否禁用“Powered by TinyMCE”
  71. menubar: true, //顶部菜单栏显示
  72. image_dimensions: false, //去除宽高属性
  73. plugins: props.plugins, //这里的数据是在props里面就定义好了的
  74. toolbar: props.toolbar, //这里的数据是在props里面就定义好了的
  75. font_formats: 'Arial=arial,helvetica,sans-serif; 宋体=SimSun; 微软雅黑=Microsoft Yahei; Impact=impact,chicago;', //字体
  76. fontsize_formats: '11px 12px 14px 16px 18px 24px 36px 48px 64px 72px', //文字大小
  77. // paste_convert_word_fake_lists: false, // 插入word文档需要该属性
  78. paste_webkit_styles: "all",
  79. paste_merge_formats: true,
  80. nonbreaking_force_tab: false,
  81. paste_auto_cleanup_on_paste: false,
  82. file_picker_types: 'file',
  83. content_css: '/tinymce/skins/content/default/content.css', //以css文件方式自定义可编辑区域的css样式,css文件需自己创建并引入
  84. //图片上传
  85. images_upload_handler: (blobInfo, progress) => new Promise((resolve, reject) => {
  86.  
  87. if (blobInfo.blob().size / 1024 / 1024 > 2) {
  88. reject({ message: '上传失败,图片大小请控制在 2M 以内', remove: true })
  89. return
  90. } else {
  91. const ph = import.meta.env.VITE_BASE_PATH + ":" + import.meta.env.VITE_SERVER_PORT + "/"
  92. let params = new FormData()
  93. params.append('file', blobInfo.blob())
  94.  
  95. let config = {
  96. headers: {
  97. "Content-Type": "multipart/form-data",
  98.  
  99. }
  100. }
  101.  
  102. axios.post('xxxx', params, config).then(res => {
  103. if (res.data.code == 200) {
  104. resolve(ph + res.data.msg) //上传成功,在成功函数里填入图片路径
  105. } else {
  106. reject('HTTP Error: 上传失败' + res.data.code);
  107. return
  108. }
  109. }).catch(() => {
  110. reject('上传出错,服务器开小差了呢')
  111. return
  112. })
  113. }
  114. }),
  115.  
  116. // 文件上传
  117. file_picker_callback: (callback, value, meta) => {
  118. // Provide file and text for the link dialog
  119. if (meta.filetype == 'file') {
  120. callback('mypage.html', { text: 'My text' });
  121. }
  122.  
  123. // Provide image and alt text for the image dialog
  124. if (meta.filetype == 'image') {
  125. callback('myimage.jpg', { alt: 'My alt text' });
  126. }
  127.  
  128. // Provide alternative source and posted for the media dialog
  129. if (meta.filetype == 'media') {
  130. callback('movie.mp4', { source2: 'alt.ogg', poster: 'image.jpg' });
  131. }
  132. }
  133. })
  134.  
  135. //监听外部传递进来的的数据变化
  136. watch(
  137. () => props.value,
  138. () => {
  139. myValue.value = props.value
  140. emits("getContent", myValue.value)
  141. }
  142. )
  143. //监听富文本中的数据变化
  144. watch(
  145. () => myValue.value,
  146. () => {
  147. emits("getContent", myValue.value)
  148. }
  149. )
  150. //在onMounted中初始化编辑器
  151. onMounted(() => {
  152. tinymce.init({})
  153. })
  154. </script>

5. 注册及使用组件

  1. // 使用
  2. <TEditor ref="editor" v-model="formState.content" :disabled='disabled' @getContent="getContent"/>
  3. <script setup lang="ts">
  4. import { reactive } from "vue";
  5. // 引入
  6. import TEditor from '@/components/TEditor.vue';
  7. const formState = reactive({contents :''})
  8. const getContent = (v: string) => {
  9. formState.contents = v
  10. }
  11. </script>

Tinymce 版本

  1. "@tinymce/tinymce-vue": "^5.0.0"
  1. "tinymce": "^6.0.3"

参考文章

https://blog.csdn.net/weixin_47180815/article/details/121748486

到此这篇关于vue3使用tinymce的文章就介绍到这了,更多相关vue3使用tinymce内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号