当前位置:   article > 正文

vue3 wangEditor

vue3 wangeditor

1.首先去安装,这里使用npm下载依赖,vue2和vue3下载的版本不同

  1. vue2(@wangeditor/editor-for-vue)
  2. vue3(@wangeditor/editor-for-vue@next

2.创建index.vue,引入编辑器

  1. import "@wangeditor/editor/dist/css/style.css"; // 引入 css
  2. import { Editor, Toolbar } from "@wangeditor/editor-for-vue";//编辑器

 html部分

  1. <Toolbar
  2. class="toolbar"
  3. :editor="editorRef"
  4. :defaultConfig="toolbarConfig"
  5. :mode="mode"
  6. />
  7. <Editor
  8. class="editor"
  9. v-model="valueHtml"
  10. :defaultConfig="editorConfig"
  11. @onCreated="handleCreated"
  12. :mode="mode"
  13. />

注意:toolbarConfig 不配置时,工具栏为默认配置

  1. // 编辑器内容
  2. const valueHtml = ref("<p>hello</p>");
  3. //工具栏
  4. const toolbarConfig = {};
  5. //配置项
  6. const editorConfig = {placeholder: "请输入内容...",};

目前操作,编辑器就生成了,如下图:

3.编辑器实例

注意:编辑器实例,必须用 shallowRef

  1. import {shallowRef,} from "vue";//vue3引入
  2. const editorRef = shallowRef();
  3. // 组件销毁时,也及时销毁编辑器
  4. onBeforeUnmount(() => {
  5. const editor = editorRef.value;
  6. if (editor == null) return;
  7. editor.destroy();
  8. });

 4.工具栏配置

(1)查询编辑器注册的所有菜单 key (可能有的不在工具栏上)

  1. import { createEditor } from "@wangeditor/editor";//查看工具栏
  2. const editor = createEditor({});
  3. console.log(editor.getAllMenuKeys(), "工具栏");

打印出配置项的各个key(2)toolbarKeys

   重新配置工具栏,显示哪些菜单,以及菜单的排序、分组。

  1. const toolbarConfig = {
  2. toolbarKeys:[
  3. // 菜单 key
  4. 'headerSelect',
  5. // 分割线
  6. '|',
  7. // 菜单 key
  8. 'bold', 'italic',
  9. // 菜单组,包含多个菜单
  10. {
  11. key: 'group-more-style', // 必填,要以 group 开头
  12. title: '更多样式', // 必填
  13. iconSvg: '<svg>....</svg>', // 可选
  14. menuKeys: ["through", "code", "clearStyle"] // 下级菜单 key ,必填
  15. },
  16. // 继续配置其他菜单...
  17. ]
  18. };

(3) excludeKeys

   如果仅仅想排除掉某些菜单,其他都保留,可以使用 excludeKeys 来配置。

  1. const toolbarConfig = {
  2. excludeKeys = [
  3. 'headerSelect',
  4. 'italic',
  5. 'group-more-style' // 排除菜单组,写菜单组 key 的值即可
  6. ]
  7. };

4.自定义上传图片的配置 

 上传本地图片到后端,后端返回图片地址,在插入编辑器中

  1. const editorConfig = {
  2. placeholder: "请输入内容...",
  3. MENU_CONF: {
  4. uploadImage: {
  5. //上传图片配置
  6. server: baseUrl + "/microsoft/api/v1/plane/messageTemplate/uploadImage", //上传接口地址
  7. fieldName: "file", //上传文件名
  8. methods: "post",
  9. // timeout: 5 * 1000, // 5s
  10. // meta: { token: "xxx", a: 100 },
  11. metaWithUrl: true, // 参数拼接到 url 上
  12. // headers: { Accept: "text/x-json" },
  13. maxFileSize: 10 * 1024 * 1024, // 10M
  14. // base64LimitSize: 5 * 1024, // 5kb 以下插入 base64
  15. onBeforeUpload(files: any) {
  16. if (files.extension == "svg") {
  17. globalProperties.$message.info("不支持此格式图片");
  18. return false; // 返回哪些文件可以上传 会阻止上传
  19. }
  20. },
  21. onProgress(progress: any) {
  22. console.log("onProgress", progress);
  23. },
  24. onSuccess(file: any, res: any) {
  25. console.log("onSuccess", file, res);
  26. },
  27. onFailed(file: any, res: any) {
  28. console.log("onFailed", file, res);
  29. },
  30. onError(file: any, err: any, res: any) {
  31. console.error("onError", file, err, res);
  32. },
  33. // // 用户自定义插入图片
  34. customInsert(res: any, insertFn: any) {
  35. const imgInfo = res || {};
  36. //data为后端返回的图片地址
  37. const { data } = imgInfo;
  38. if (!data) throw new Error(`Image url is empty`);
  39. // 自己插入图片
  40. insertFn(data);
  41. },
  42. },
  43. },
  44. };

5.预览编辑器的html内容

  1. <div v-html="lookContent" class="content-text"></div>
  2. let lookContent=ref("<div>有内容</div>")//定义数据

注意:这里将预览的框大小设置为A4纸的尺寸,宽为21cm,高可以自行设置,而且预览时浏览器将图片解析为文本,也就是行内元素,所以图片的格式不生效,只需要将图片设置为inline-block行内块元素。

  1. .content-text {
  2. width: 21cm;
  3. height: 690px;
  4. overflow-y: auto;
  5. img {
  6. display: inline-block;
  7. }
  8. }

6.将编辑的内容html转换为doc和docx格式的文档

(1)下载成doc格式

  1. let header = `<html><body>${valueHtml.value}</body></html>`;
  2. let source ="data:application/vnd.ms-word;charset=utf-8," +encodeURIComponent(header);
  3. let fileDownload = document.createElement("a");
  4. document.body.appendChild(fileDownload);
  5. fileDownload.href = source;
  6. fileDownload.download = "文件.doc";
  7. fileDownload.click();
  8. document.body.removeChild(fileDownload);

(2)下载成docx格式

注意:html-docx-js不支持目前的主流框架,直接安装npm install html-docx-js-typescript --save就可以

  1. npm i file-saver --save
  2. npm i html-docx-js-typescript --save
  3. import { saveAs } from "file-saver";
  4. import { asBlob } from "html-docx-js-typescript";
  1. const htmlString = `<!DOCTYPE html>
  2. <html lang="en"><head><meta charset="UTF-8">
  3. <title>Document</title></head>
  4. <body>${valueHtml.value}</body>
  5. </html>`;
  6. const fileData = asBlob(htmlString).then((data: any) => {
  7. saveAs(data, "文件.docx"); // 保存为docx文件
  8. });

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

闽ICP备14008679号