当前位置:   article > 正文

vue3中使用wangeditor_vue3 wangeditor

vue3 wangeditor

前言

看了wangeditor 的官方文档,觉得很多的配置项很难找,对刚刚想用wangeditor的小伙伴不友好,于是站在开发使用的角度上来写写稍微详细一点点的使用说明,本案例只对我项目上需要的一些功能进行讲解,至于其他的api还需要自行研究官方文档才行,先来看看最终效果

实现流程

1.参考官网安装方法

yarn add @wangeditor/editor

yarn add @wangeditor/editor-for-vue@next

2.编写vue代码

onchange是我们需要用到的函数,我们在这个函数里返回html内容给外部

mode:工具栏的模式,这里我使用的是simple,也就是简洁模式

toolbarConfig:这里主要是配置工具栏哪些按钮功能需要排除的

3.编写样式

样式很简单,没什么可以说的

4.编写js

1.引入wangeditor库

2.定义props、emits

3.定义常量

4.onMounted中回显父组件传过来的html内容,有值就显示,没值设置为""

5.设置工具栏和编辑器的配置项

excludeKeys: 指定哪些功能按钮是我们不需要的

如果不知道有哪些key,我们可以通过如下方法获取

这里打印出来的key集合如下

uploadImage:上传图片的配置向,此处我们不上传图片到服务器,这里使用的是file转base64,能自己解决的绝不麻烦后台人员,哈哈

file转base64方法很多,网上一搜一大堆,我使用的是下面的这个

insertFn:这个是wangeditor提供的内置api,就是将我们处理后的图片路径传入,wangeditor会将它插入到编辑器中

5.定义handleCreated函数,用于记录editor实例

6.组件卸载时从内存中销毁

完整代码如下

  1. <template>
  2. <div class="editor">
  3. <Toolbar
  4. :editor="editorRef"
  5. :defaultConfig="toolbarConfig"
  6. :mode="mode"
  7. />
  8. <Editor
  9. style="height: 500px; overflow-y: hidden;"
  10. v-model="valueHtml"
  11. :defaultConfig="editorConfig"
  12. :mode="mode"
  13. @onChange="contentChange"
  14. @onCreated="handleCreated"
  15. />
  16. </div>
  17. </template>
  18. <script setup name='WangEditor' lang='ts'>
  19. import '@wangeditor/editor/dist/css/style.css' // 引入 css
  20. import { onBeforeUnmount, ref, shallowRef, onMounted } from 'vue'
  21. import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
  22. import { DomEditor } from "@wangeditor/editor";
  23. const props = defineProps<{
  24. text?:string //text:用于做数据回显功能
  25. }>()
  26. const emits = defineEmits<{
  27. (e:"change",data:any):void //主要用于父组件接收wangeditor实时编辑的内容
  28. }>()
  29. // 编辑器实例,必须用 shallowRef
  30. const editorRef = shallowRef()
  31. // 内容 HTML
  32. const valueHtml = ref('')
  33. // 工具栏模式
  34. const mode = ref("simple") //简洁
  35. onMounted(() => {
  36. setTimeout(() => {
  37. valueHtml.value = props.text??"" //回显数据
  38. // const toolbar = DomEditor.getToolbar(editorRef.value) as any;
  39. // const curToolbarConfig = toolbar.getConfig();
  40. // console.log(curToolbarConfig.toolbarKeys); //这里会打印出所有的key
  41. }, 200)
  42. })
  43. /**
  44. * file 转Base64 DataURL
  45. * @param {File} file
  46. * @returns
  47. */
  48. const fileToBase64Async = (file:File)=> {
  49. return new Promise((resolve, reject) => {
  50. let reader = new FileReader();
  51. reader.readAsDataURL(file);
  52. reader.onload = (e:any) => {
  53. resolve(e.target.result);
  54. };
  55. });
  56. }
  57. // [
  58. // "blockquote",
  59. // "header1",
  60. // "header2",
  61. // "header3",
  62. // "|",
  63. // "bold",
  64. // "underline",
  65. // "italic",
  66. // "through",
  67. // "color",
  68. // "bgColor",
  69. // "clearStyle",
  70. // "|",
  71. // "bulletedList",
  72. // "numberedList",
  73. // "todo",
  74. // "justifyLeft",
  75. // "justifyRight",
  76. // "justifyCenter",
  77. // "|",
  78. // "insertLink",
  79. // {
  80. // "key": "group-image",
  81. // "title": "图片",
  82. // "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M959.877 128l0.123 0.123v767.775l-0.123 0.122H64.102l-0.122-0.122V128.123l0.122-0.123h895.775zM960 64H64C28.795 64 0 92.795 0 128v768c0 35.205 28.795 64 64 64h896c35.205 0 64-28.795 64-64V128c0-35.205-28.795-64-64-64zM832 288.01c0 53.023-42.988 96.01-96.01 96.01s-96.01-42.987-96.01-96.01S682.967 192 735.99 192 832 234.988 832 288.01zM896 832H128V704l224.01-384 256 320h64l224.01-192z\"></path></svg>",
  83. // "menuKeys": [
  84. // "insertImage",
  85. // "uploadImage"
  86. // ]
  87. // },
  88. // "insertVideo",
  89. // "insertTable",
  90. // "codeBlock",
  91. // "|",
  92. // "undo",
  93. // "redo",
  94. // "|",
  95. // "fullScreen"
  96. // ]
  97. // 工具栏配置项
  98. const toolbarConfig = {
  99. excludeKeys: ["insertLink", "viewImageLink", "insertVideo", "emotion", "fullScreen","codeBlock","todo"] //排除不需要的菜单
  100. }
  101. // 编辑器配置项
  102. const editorConfig = {
  103. placeholder: '请输入内容...',
  104. MENU_CONF:{
  105. uploadImage:{
  106. async customUpload(file:File, insertFn:any) {
  107. const fileBase64 = fileToBase64Async(file)
  108. insertFn(fileBase64) // 最后插入图片 insertFn(url, alt, href),alt:描述,href:链接,后面非必填
  109. console.log(fileBase64)
  110. },
  111. },
  112. }
  113. }
  114. // 组件销毁时,也及时销毁编辑器
  115. onBeforeUnmount(() => {
  116. if (editorRef.value == null) return
  117. editorRef.value.destroy()
  118. })
  119. const handleCreated = (editor:any) => {
  120. editorRef.value = editor // 记录 editor 实例,重要!
  121. }
  122. const contentChange = (editor:any)=>{
  123. emits("change",editor.getHtml())
  124. }
  125. </script>
  126. <style lang="scss">
  127. .editor{
  128. width: 100%;
  129. //修改工具栏的背景色
  130. .w-e-bar{
  131. background: var(--w-e-bar-bg-color);
  132. }
  133. }
  134. // 去除内置样式
  135. .w-e-text-container blockquote, .w-e-text-container li,
  136. .w-e-text-container p,
  137. .w-e-text-container td,
  138. .w-e-text-container th,
  139. .w-e-toolbar *{
  140. line-height: unset !important;
  141. }
  142. </style>

到此,简单的wangeditor组件大功告成! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/635025
推荐阅读
相关标签
  

闽ICP备14008679号