wangeditor封装

wangEditor富文本编辑器图片/视频上传 Vue + wangEditor富文本编辑器上传图片和视频。 阅读详情
<template>
  <div>
    <div style="border: 1px solid #ccc">
      <!-- 工具栏 -->
      <Toolbar
        style="border-bottom: 1px solid #ccc"
        :editor="editor"
        :defaultConfig="toolbarConfig"
      />
      <!-- 编辑器 -->
      <Editor
        :style="styles"
        :defaultConfig="editorConfig"
        v-model="html"
        @onChange="onChange"
        @onCreated="onCreated"
      />
    </div>
  </div>
</template>

<script>
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { getToken } from "@/utils/auth";
import axios from "axios";
export default {
  name: "MyEditor",
  components: {
    Editor,
    Toolbar,
  },
  props: {
    /* 编辑器的内容 */
    value: {
      type: String,
    },
    /* 高度 */
    height: {
      type: Number,
      default: null,
    },
    /* 最小高度 */
    minHeight: {
      type: Number,
      default: null,
    },
    /* 只读 */
    readOnly: {
      type: Boolean,
      default: false,
    },
    // 上传文件大小限制(MB)
    fileSize: {
      type: Number,
      default: 9,
    },
    /* 类型(base64格式、url格式) */
    type: {
      type: String,
      default: "url",
    },
  },
  //监控传参,及时更新为新值
  watch: {
    value: {
      handler(val) {
        if (val !== this.html) {
          this.html = val === null ? "" : val;
        }
      },
      immediate: true,
    },
  },
  computed: {
    styles() {
      let style = {};
      if (this.minHeight) {
        style.minHeight = `${this.minHeight}px`;
      }
      if (this.height) {
        style.height = `${this.height}px`;
      }
      return style;
    },
  },
  data() {
    return {
      editorVisible: false,
      editor: null,
      currentValue: "",
      html: "",
      toolbarConfig: {
        // toolbarKeys: [ /* 显示哪些菜单,如何排序、分组 */ ],
        // excludeKeys: [ /* 隐藏哪些菜单 */ ],
      },
      showUpload: false, //是否显示上传对话框
      uploadUrl: process.env.VUE_APP_BASE_API + "api/manage/article/upload", // 上传的图片服务器地址

      headers: {
        Authorization: "Bearer " + getToken(),
      },
      editorConfig: {
        placeholder: "请输入内容你要上传的内容...",
        // 所有的菜单配置,都要在 MENU_CONF 属性下
        MENU_CONF: {
          // 配置上传图片
          uploadImage: {
            customUpload: this.update,
          },
          // 继续其他菜单配置...
          uploadVideo: {
            customUpload: this.update,
          },
        },
      },
    };
  },
  methods: {
    onCreated(editor) {
      this.editor = Object.seal(editor); // 【注意】一定要用 Object.seal() 否则会报错
      this.$nextTick(() => {
        setTimeout(() => {
          this.editor.toolbar.change(); // 重新计算工具栏样式
        }, 100);
      });
    },
    onChange(editor) {
      this.$emit("input", this.html); // onChange 时获取编辑器最新内容
    },
    insertTextHandler() {
      const editor = this.editor;
      if (editor == null) return;
      editor.insertText(" hello ");
    },
    printEditorHtml() {
      const editor = this.editor;
      if (editor == null) return;
      console.log(editor.getHtml());
    },
    disableHandler() {
      const editor = this.editor;
      if (editor == null) return;
      editor.disable();
    },
    // 上传前校检格式和大小
    handleBeforeUpload(file) {
      console.log("上传前校验");
      // 校检文件大小
      if (this.fileSize) {
        const isLt = file.size / 1024 / 1024 < this.fileSize;
        if (!isLt) {
          this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
          return false;
        }
      }
      return true;
    },
    //自定义上传图片
    // update(file, insertFn) {
    //   if (this.handleBeforeUpload(file)) {
    //     let formData = new FormData();
    //     formData.append("file", file);
    //     console.log(file);
    //     axios({
    //       method: "post",
    //       url: this.uploadUrl,
    //       data: formData,
    //       headers: this.headers,
    //     }).then((res) => {
    //       console.log(res);
    //       if (res.data.code == 200) {
    //         console.log("上传成功");
    //         let url = process.env.VUE_APP_BASE_API + res.data.fileName;
    //         insertFn(url);
    //       } else {
    //         this.$modal.msgError("插入失败");
    //       }
    //     });
    //   }
    // },
    update(file, insertFn) {
      if (!file) {
        this.$modal.msgError("文件不能为空");
        return;
      }

      if (this.handleBeforeUpload(file)) {
        let formData = new FormData();
        formData.append("file", file);

        const headers = {
          "Content-Type": "multipart/form-data",
          ...this.headers,
        };

        // 添加文件类型检查
        const allowedTypes = [
          "video/mp4",
          "video/webm",
          "video/ogg",
          "image/jpeg",
          "image/png",
          "image/gif",
        ];
        if (!allowedTypes.includes(file.type)) {
          this.$modal.msgError("不支持的文件类型");
          return;
        }

        // 添加文件大小检查(例如限制为100MB)
        const maxSize = 100 * 1024 * 1024;
        if (file.size > maxSize) {
          this.$modal.msgError("文件大小超出限制");
          return;
        }

        axios({
          method: "post",
          url: this.uploadUrl,
          data: formData,
          headers: headers,
          // 添加上传进度处理
          onUploadProgress: (progressEvent) => {
            const percentCompleted = Math.round(
              (progressEvent.loaded * 100) / progressEvent.total
            );
            console.log("上传进度:", percentCompleted);
          },
        })
          .then((res) => {
            if (res.data.code == 200) {
              console.log("上传成功");
              let url =
                process.env.VUE_APP_BASE_API +
                "api/manage/annex/" +
                res.data.data.id;
              insertFn(url);
              this.$modal.msgSuccess("上传成功");
            } else {
              this.$modal.msgError(res.data.msg || "上传失败");
            }
          })
          .catch((error) => {
            console.error("上传失败:", error);
            this.$modal.msgError(error.response?.data?.msg || "上传失败");
          });
      }
    },
  },
  mounted() {
    this.$nextTick(() => {
    setTimeout(() => {
      console.log("初始化菜单 DOM:", document.querySelector(".w-e-menu-panel"));
      console.log("margin:", getComputedStyle(document.querySelector(".w-e-menu-panel")).margin);
    }, 200);
  });
  },
  beforeDestroy() {
    const editor = this.editor;
    if (editor == null) return;
    editor.destroy(); // 组件销毁时,及时销毁 editor ,重要!!!
  },
};
</script>

<style src="@wangeditor/editor/dist/css/style.css">
.w-e-toolbar {
  z-index: 10000 !important;
}
/* .w-e-bar-item {
  .title {
    margin: 0 auto;
  }
} */

.w-e-menu-panel {
  display: block !important;
  visibility: visible !important;
  opacity: 1 !important;
}
</style>

vue简单封装wangeditor4 wangeditor v4版本已经发布了,地址:https://doc.wangeditor.com/ 抱着尝鲜的态度在新项目中实践,做了一个简单组件封装 实现思路 定义常用属性(height/zIndex/placeholder/focus); 实现v-model指令; 监听编辑器onchange事件,更新组件value; watch组件value改变,更新编辑器内容,此处需要注意:在编辑器编辑时,触发onchange事件,更新了组件value值导致watch回调被触发,此时,需判断value 阅读详情

相关推荐

VUE #4 封装一个 wangEditor 组件

以封装 wangEditor 富文本编辑器为例,浅记 VUE 组件封装方式。本篇不涉及 wangEditor 具体使用方法介绍,如需要了解,请移步官网:wangEditor-轻量级 web 富文本编辑器。 VUE 版本:3.0。 插件页面定义 <template> <div id="demoEditor"> </div> </template> <script> //导入 WangEditor 插件 import WangE

FSYML 672

若依项目整合wangEditor实现视频文件上传

若依项目自带的富文本组件缺少视频上传功能,作为一个CV专家当然是找一个支持视频上传的富文本组件(我就不会,)出现报错不用管,忽略错误强行安装就好了,或者你有更好的解决版本可以在评论区留言,我来改改教程。至此若依项目引入wangEditor算是完成了,组件编写好了,接下来就是引入组件,挂载组件。最后盯上了wangEditor,实现方式。在main.js里面相对应位置添加如下。下新建一个index.vue。

这里没有简介 3052

vue 富文本组件封装之wangeditor

一、准备工作: 1、npm install wangeditor 2、文档地址:https://www.kancloud.cn/wangfupeng/wangeditor3/ISSUE.md 二、组件代码 <template> <div> <div id="editor" ref='myEditor'></div> &...

qq_37530404的博客 1523

wangeditor: 上传图片+上传视频+上传附件(自定义)完整使用

wangeditor: 上传图片+上传视频+上传附件(自定义)完整使用 一:项目需求:①角色为管理员可以新增编辑文章 + ②点击可以看文章详情 +③ 角色为管理员可以修改编辑文章 二:效果: ①角色为管理员可以新增编辑文章 步骤: ①下载安装相关依赖 npm i wangeditor --save ②引入 ③初始化创建编辑器 代码中的initialEditor函数 ④自定义上传附件按钮 主要思路:在编辑器上增加新的菜单按钮 --》实例化按钮 --》结合an...

qq_44173499的博客 1万+

wangeditor:一个页面使用多个wangeditor编辑器,并对wangeditor进行组件封装以及上传图片到自己的服务器

这里记录两个地方 1.如何在富文本编辑器中上传图片到自己的服务器 2.对富文本编辑器进行组件封装,并在一个页面使用多个编辑器 一、如何在富文本编辑器中上传图片到自己的服务器(只需要两步绝对可以解决问题) ...

qq_45791799的博客 3670

wangEditor3上传本地视频

<!--下载js和贴上这段代码即可--> [removed][removed] <!-- 注意, 只需要引用 JS,无需引用任何 CSS !!!--> [removed] function loadEditor(){ var E = window.wangEditor; var editor = new E('#editor'); //上传视频 editor.customConfig.customUploadVideo = function (files, obj) { var date = new FormData(); date.append("file", files[0]); $.ajax({ type: "POST", url: "../../import/upload", data: date, dataType: 'json', async: false, cache: false, contentType: false, processData: false, success: function (result) { obj.callback(result.data); } }); }; editor.create();//创建富文本 } [removed]

wangeditor封装使用

wangeditor定制化需求的封装使用

weixin_42878641的博客 3472

WangEditor-3.1.1-本地视频上传.rar

添加了对本地视频上传的支持 具体教程看 https://blog.csdn.net/I_am_Yong_Ge/article/details/100118109

vue3封装wangEditor插件

vue3、富文本框、wangEditor

m0_62857167的博客 2125

Cadence IC618/Spectre231安装避坑指南:详解环境变量配置与License管理那些事儿

本文深入解析Cadence IC618/Spectre231安装过程中的环境变量配置与License管理难题,提供从变量冲突解决到高效License管理的实用方案。针对常见的64位标识冲突、路径污染及License服务器连接问题,给出具体诊断步骤和优化建议,帮助用户构建稳定可靠的EDA环境。

weixin_33737134的博客 616

ESP32连接OneNet云平台实现多设备联动控制完整示例

通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。

weixin_42360733的博客 547

在vue中封装一个wangeditor组件

在Vue封装一个富文本组件 以后使用就方遍了 wangeditor文档 第一步安装 npm install wangeditor --save 第二步封装组件 在@/components/Editor/WangEditor.vue <template> <div :class="prefixCls"> <div ref="editor" class="editor-wrapper"></div> </div> </templ

Var的博客 1869

Jetson Orin NX上PyTorch环境搭建与性能优化指南

本文详细指导如何在Jetson Orin NX上搭建高效的PyTorch开发环境。内容涵盖CUDA与cuDNN的“隐藏”配置、Miniconda虚拟环境管理、PyTorch for Jetson的正确安装与验证,并提供了电源模式设置、TensorRT加速、混合精度等关键性能优化实战技巧,帮助开发者充分释放边缘AI设备的算力。

weixin_29090089的博客 337

超详细!在vue 中二次封装 wangEditor 富文本

在vue 中二次封装 wangEditor 富文本 wangEditor真的非常简洁好用,而且一直有更新,缺点就是文档内容比较少。 wangEditor文档链接 看网上很多二次封装都把逻辑放到 mounted 中,对于新手的我不太友好,逻辑不太清晰。决定自己封装一个。将各配置以方法分割,在初始化调用。 //以下是封装的组件 SimpleEditor <template> <div> <div ref="editor" style="text-align:

小白菜的博客 1938

Plecs standalone 4.9.5最新版本,赶紧来下载使用吧,需要做并网逆变器及光伏储能变换器的朋友赶紧下载起来

PLECS 4.9.5较4.7.1版实现全面升级:采用自适应求解器切换技术,支持多核CPU/GPU加速,仿真速度提升30-50%;新增模型引用功能,实现模块化设计;强化光伏/风电等新能源组件,支持多物理场耦合分析;优化代码生成功能,兼容多种硬件平台和FMU导入。新版特别适用于复杂电力电子系统、多域联合仿真及硬件在环测试项目,但对硬件配置要求更高。基础教学项目仍可使用4.7.1版本。建议用户根据项目复杂度选择升级方案。

2437

建模simulink - 手把手教你搭建xpc平台

概述xpc半实物仿真目标是个基于RTW对低端实时仿真和开发平台,可将计算机或者工控机转变为一个实时系统,不需要第三方操作系统对支持,在计算机上配置输入输入出设备就能和外部交换信息,进行硬件...

不只会拍照的程序猿 7087

Vue3 富文本组件封装wangeditor

在找到这个组件之前尝试了vue-quill-editor,onChange事件失效,搜到说是不支持vue3tinymce-vue,报搜不到model.js,没找到解决方案都不好用,封装过程中存在bug最后找到了wangeditor这个富文本组件,封装成功,直接上代码引入参照文档中正常引入就好

黑胡子大叔的博客 1990

电脑硬件:电脑主板上的接口介绍,看完你就懂了

它们主要用于连接老式的键盘和鼠标,虽然速度和兼容性不如USB接口,但在某些特定场合依然发挥着重要作用。PCIe接口是主板上的扩展能力象征,可以连接各种扩展卡,如显卡、声卡、网卡等。电脑主板作为电脑硬件组成关键的部分,今天给大家分享一下电脑主板上有哪些接口,具体每一个接口的特点、使用场景,有需要的朋友可以来了解一下!它们不仅能连接鼠标、键盘、U盘、打印机,还能连接各种外设,如移动硬盘、游戏手柄等。:虽然现在用得越来越少,但在一些特定场合,如工业控制、老旧设备上,仍然需要使用PS/2接口。

IT技术分享社区 2787

vue轻度封装wangEditor

由于有点点嫌弃QuillEditor呢,于是简单的封装了wangEditior,不过从长期来看,QuillEditor的自定义和拓展更强。 完整代码如下(部分代码来自网上,引用出处忘了,作者要是看到觉得侵权的,联系我): <template lang="html"> <div class="editor"> <div ref="toolbar" class...

qq_30729829的博客 559

Windows10环境下激活虚拟环境报错【source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称】

在使用Django创建Web程序前,需要创建一个虚拟的工作环境,在使用【source ll_env/bin/activate】命令激活虚拟环境时报错:source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 2。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

基于Python的上市公司年报PDF文本抓取与财务风险分析系统

随着大数据时代的到来,金融数据分析已成为投资决策和风险管理的重要工具。上市公司年报包含了丰富的财务信息和经营数据,通过对这些数据的提取和分析,可以评估公司的财务状况和潜在风险。本文将详细介绍如何使用Python构建一个完整的上市公司年报文本抓取与财务风险分析系统,涵盖PDF文本提取、数据清洗、财务指标计算和风险分析等全流程。

2201_76125261的博客 312

wangeditor 封装组件及使用

【代码】wangeditor 封装组件及使用。

jiangjiang_ing的博客 879

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

vue项目中使用wangeditor开发并进行二次封装

vue中使用wangeditor并进行二次封装

月色真美121的博客 1700

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Vue3: 二次封装WangEditor富文本编辑器为hook

作者:糖墨夕原文:https://juejin.cn/post/7279346413914718263初衷是基于WangEditor[1]进行了一次特殊处理,使其更加易于使用和灵活。这个编辑器可以让你像写文字一样轻松地编辑富文本内容。不论你是要写一篇精彩的博客文章,还是设计一个华丽的网页,这个编辑器都能满足我们的需求。我使用了“Hook”的机制,可以自由地定制和控制编辑器的各种功能。其实,主要是方...

前端下午茶 925

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

wangEditor编辑器封装组件

2、emmiter.js自行搜索。

qq_34116774的博客 363

Vue封装WangEditor富文本编辑器

Vue中很多用vue-quill-editor编辑器的,但是感觉并不是很好用,于是决定使用以前感觉不错的WangEditor编辑器。 1、安装WangEditor npm install wangeditor 注:wangeditor全小写 2、封装WangEditor组件(WangEditor.vue) <template lang="html"> <div class="editor"> <div ref="toolbar" class="toolbar.

suncsf的博客 1864
上一篇: canvas给图片加动态水印
下一篇: 人脸识别Demo
irisMoon06
博客等级 码龄5年 280粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值