wangEditor富文本编辑器导入图片和视频配置(Vue)

前言

wangEditor的导入图片和视频的详细配置,官网上面有配置很详细。自己简单在项目中使用了一下,总结一下。

官方地址

wangEditorhttps://www.wangeditor.com/

技术配置

wangEditor 5版本

vue2 + vuecli脚手架

element-plus组件库(我使用的是vue+element-plus版本,个人觉得ui更好一点)

配置方式

下面直接在data中进行配置就可以了,下面的就是上传视频和图片的配置方式,由于接口是我自己写的,所以server的地址是本地的。

javascript 复制代码
data() {
    return {
      editorConfig: {
        placeholder: '请输入内容...',
        // autoFocus: false,
        // 所有的菜单配置,都要在 MENU_CONF 属性下
        MENU_CONF: {
          // 图片上传
          uploadImage: {
            server: 'http://127.0.0.1/upload/up',
            fieldName: 'file',
            // 单个文件的最大体积限制,默认为 2M
            maxFileSize: 10 * 1024 * 1024, // 10M
            // 最多可上传几个文件,默认为 100
            maxNumberOfFiles: 10,
            // 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
            allowedFileTypes: ['image/*'],
            // 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。
            meta: {
              // token: 'xxx',
              // otherKey: 'yyy'
              // file:''
            },
            // 将 meta 拼接到 url 参数中,默认 false
            metaWithUrl: false,
            // 自定义增加 http  header
            headers: {
              Authorization:getToken()
              // Accept: 'text/x-json',
              // otherKey: 'xxx'
            },
            withCredentials: false,// 跨域是否传递 cookie ,默认为 false
            timeout: 10 * 1000, // 超时时间,默认为 10 秒
            // 上传前
            onBeforeUpload(files) {
              ElMessage({
                message: '图片正在上传中,请耐心等待',
                duration: 0,
                customClass: 'uploadTip',
                iconClass: 'el-icon-loading',
                showClose: true
              });
              return files;
            },
            // 自定义插入图片
            customInsert(res, insertFn) {
              // 因为自定义插入导致onSuccess与onFailed回调函数不起作用,自己手动处理
              // 先关闭等待的Message
              ElMessage.closeAll();
              if (res.code === 1) {
                ElMessage.success({
                  message: `${res.data.name} 上传成功`
                });
              } else {
                ElMessage.error({
                  message: `${res.data.name} 上传失败,请重新尝试`
                });
              }
              insertFn(res.data.path, res.data.name, res.data.path);
            },
            // 单个文件上传成功之后
            onSuccess(file, res) {
              console.log(`${file.name} 上传成功`, res);
            },
            // 单个文件上传失败
            onFailed(file, res) {
              console.log(`${file.name} 上传失败`, res);
            },
            // 上传进度的回调函数
            onProgress(progress) {
              console.log('progress', progress);
              // progress 是 0-100 的数字
            },
            // 上传错误,或者触发 timeout 超时
            onError(file, err, res) {
              console.log(`${file.name} 上传出错`, err, res);
            }
          },
          //视频上传
          uploadVideo: {
            fieldName: 'file',
            server: 'http://127.0.0.1/upload/up',
            // 单个文件的最大体积限制,默认为 10M
            maxFileSize: 50 * 1024 * 1024, // 50M
            // 最多可上传几个文件,默认为 5
            maxNumberOfFiles: 3,
            // 选择文件时的类型限制,默认为 ['video/*'] 。如不想限制,则设置为 []
            allowedFileTypes: ['video/*'],
            // 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。
            meta: {
              // token: 'xxx',
              // otherKey: 'yyy'
            },
            // 将 meta 拼接到 url 参数中,默认 false
            metaWithUrl: false,
            // 自定义增加 http  header
            headers: {
              Authorization:getToken()
              // Accept: 'text/x-json',
              // otherKey: 'xxx'
            },
            // 跨域是否传递 cookie ,默认为 false
            withCredentials: false,
            // 超时时间,默认为 30 秒
            timeout: 1000 * 1000, // 1000 秒,
            // 上传之前触发
            onBeforeUpload(file) {
              ElMessage({
                message: '视频正在上传中,请耐心等待',
                duration: 0,
                customClass: 'uploadTip',
                iconClass: 'el-icon-loading',
                showClose: true
              });
              return file;
            },
            // 自定义插入视频
            customInsert(res, insertFn) {
              // 因为自定义插入导致onSuccess与onFailed回调函数不起作用,自己手动处理
              // 先关闭等待的Message
              ElMessage.closeAll();
              if (res.code === 1) {
                ElMessage.success({
                  message: `${res.data.name} 上传成功`
                });
              } else {
                ElMessage.error({
                  message: `${res.data.name} 上传失败,请重新尝试`
                });
              }
              insertFn(res.data.path, res.data.path);
            },
            // 上传进度的回调函数
            onProgress(progress) {
              console.log(progress);
              // onProgress(progress) {       // JS 语法
              // progress 是 0-100 的数字
            },

            // // 单个文件上传成功之后
            // onSuccess(file, res) {
            //   console.log(`${file.name} 上传成功`, res);
            //   this.successMsg(file);
            // },

            // // 单个文件上传失败
            // onFailed(file, res) {
            //   console.log(`${file.name} 上传失败`, res);
            //   this.errorMsg(file);
            // },

            // 上传错误,或者触发 timeout 超时
            onError(file, err, res) {
              console.log(`${file.name} 上传出错`, err, res);
              Notification.error({
                title: '错误',
                message: `${file.name} 上传失败,请重新尝试`
              });
            }
          }
        }
      },
    }
  },

项目完整代码

javascript 复制代码
<template>
  <div>
    <el-button type="primary" @click="goBack" class="top_back">返回</el-button>
    <div style="border: 1px solid #ccc;">
      <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" />
      <Editor style="height: 500px; overflow-y: hidden;" v-model="html" :defaultConfig="editorConfig" :mode="mode"
        @onCreated="CreateContent" />
    </div>
    <div class="onsumbit">
      <el-button type="primary" @click="onSumbit">提交内容</el-button>
    </div>
  </div>
</template>

<script>
import '@wangeditor/editor/dist/css/style.css' // 引入 css
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import { ElMessage } from 'element-plus'
import { getToken } from '@/utils/common/common'
import { ArticleDetailApi, ArticleEditApi } from '../../api/index'
export default {
  name: "WangContent",
  components: { Editor, Toolbar },
  data() {
    return {
      editor: null,
      html: '',
      toolbarConfig: {},
      editorConfig: { placeholder: '请输入内容...' },
      mode: 'default', // or 'simple'
      upload:"http://127.0.0.1:80" + "/upload/up",
      editorConfig: {
        placeholder: '请输入内容...',
        // autoFocus: false,
        // 所有的菜单配置,都要在 MENU_CONF 属性下
        MENU_CONF: {
          // 图片上传
          uploadImage: {
            server: 'http://127.0.0.1/upload/up',
            fieldName: 'file',
            // 单个文件的最大体积限制,默认为 2M
            maxFileSize: 10 * 1024 * 1024, // 10M
            // 最多可上传几个文件,默认为 100
            maxNumberOfFiles: 10,
            // 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
            allowedFileTypes: ['image/*'],
            // 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。
            meta: {
              // token: 'xxx',
              // otherKey: 'yyy'
              // file:''
            },
            // 将 meta 拼接到 url 参数中,默认 false
            metaWithUrl: false,
            // 自定义增加 http  header
            headers: {
              Authorization:getToken()
              // Accept: 'text/x-json',
              // otherKey: 'xxx'
            },
            withCredentials: false,// 跨域是否传递 cookie ,默认为 false
            timeout: 10 * 1000, // 超时时间,默认为 10 秒
            // 上传前
            onBeforeUpload(files) {
              ElMessage({
                message: '图片正在上传中,请耐心等待',
                duration: 0,
                customClass: 'uploadTip',
                iconClass: 'el-icon-loading',
                showClose: true
              });
              return files;
            },
            // 自定义插入图片
            customInsert(res, insertFn) {
              // 因为自定义插入导致onSuccess与onFailed回调函数不起作用,自己手动处理
              // 先关闭等待的Message
              ElMessage.closeAll();
              if (res.code === 1) {
                ElMessage.success({
                  message: `${res.data.name} 上传成功`
                });
              } else {
                ElMessage.error({
                  message: `${res.data.name} 上传失败,请重新尝试`
                });
              }
              insertFn(res.data.path, res.data.name, res.data.path);
            },
            // 单个文件上传成功之后
            onSuccess(file, res) {
              console.log(`${file.name} 上传成功`, res);
            },
            // 单个文件上传失败
            onFailed(file, res) {
              console.log(`${file.name} 上传失败`, res);
            },
            // 上传进度的回调函数
            onProgress(progress) {
              console.log('progress', progress);
              // progress 是 0-100 的数字
            },
            // 上传错误,或者触发 timeout 超时
            onError(file, err, res) {
              console.log(`${file.name} 上传出错`, err, res);
            }
          },
          //视频上传
          uploadVideo: {
            fieldName: 'file',
            server: 'http://127.0.0.1/upload/up',
            // 单个文件的最大体积限制,默认为 10M
            maxFileSize: 50 * 1024 * 1024, // 50M
            // 最多可上传几个文件,默认为 5
            maxNumberOfFiles: 3,
            // 选择文件时的类型限制,默认为 ['video/*'] 。如不想限制,则设置为 []
            allowedFileTypes: ['video/*'],
            // 自定义上传参数,例如传递验证的 token 等。参数会被添加到 formData 中,一起上传到服务端。
            meta: {
              // token: 'xxx',
              // otherKey: 'yyy'
            },
            // 将 meta 拼接到 url 参数中,默认 false
            metaWithUrl: false,
            // 自定义增加 http  header
            headers: {
              Authorization:getToken()
              // Accept: 'text/x-json',
              // otherKey: 'xxx'
            },
            // 跨域是否传递 cookie ,默认为 false
            withCredentials: false,
            // 超时时间,默认为 30 秒
            timeout: 1000 * 1000, // 1000 秒,
            // 上传之前触发
            onBeforeUpload(file) {
              ElMessage({
                message: '视频正在上传中,请耐心等待',
                duration: 0,
                customClass: 'uploadTip',
                iconClass: 'el-icon-loading',
                showClose: true
              });
              return file;
            },
            // 自定义插入视频
            customInsert(res, insertFn) {
              // 因为自定义插入导致onSuccess与onFailed回调函数不起作用,自己手动处理
              // 先关闭等待的Message
              ElMessage.closeAll();
              if (res.code === 1) {
                ElMessage.success({
                  message: `${res.data.name} 上传成功`
                });
              } else {
                ElMessage.error({
                  message: `${res.data.name} 上传失败,请重新尝试`
                });
              }
              insertFn(res.data.path, res.data.path);
            },
            // 上传进度的回调函数
            onProgress(progress) {
              console.log(progress);
              // onProgress(progress) {       // JS 语法
              // progress 是 0-100 的数字
            },

            // // 单个文件上传成功之后
            // onSuccess(file, res) {
            //   console.log(`${file.name} 上传成功`, res);
            //   this.successMsg(file);
            // },

            // // 单个文件上传失败
            // onFailed(file, res) {
            //   console.log(`${file.name} 上传失败`, res);
            //   this.errorMsg(file);
            // },

            // 上传错误,或者触发 timeout 超时
            onError(file, err, res) {
              console.log(`${file.name} 上传出错`, err, res);
              Notification.error({
                title: '错误',
                message: `${file.name} 上传失败,请重新尝试`
              });
            }
          }
        }
      },
    }
  },
  methods: {
    CreateContent(editor) {
      this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错
    },
    goBack() {
      this.$router.go(-1)
    },
    getDetailArticle() {
      ArticleDetailApi(this.$route.query.id).then(res => {
        console.log(res, '文章的详情');
        if (res.data.code == 1) {
          this.html = res.data.data.content
        } else {
          this.$message.error(res.msg)
        }
      })
    },
    onSumbit() {
      console.log(123456);
      ArticleEditApi({
        id: this.$route.query.id,
        content: this.html
      }).then(res => {
        console.log(123456);
        if (res.data.code == 1) {
          this.$message({
            type: "success",
            message: res.data.msg,
            duration: 1500,
            onClose: () => {
              this.goBack()
            },
          });
        } else {
          this.$message({
            type: "error",
            message: res.data.msg,
            onClose: () => {
              this.goBack()
            },
          });
        }
      })
    }
  },
  mounted() {
    // 模拟 ajax 请求,异步渲染编辑器
    this.getDetailArticle()
  },
  beforeDestroy() {
    const editor = this.editor
    if (editor == null) return
    editor.destroy() // 组件销毁时,及时销毁编辑器
  },

}
</script>

<style lang="scss" scoped>
.top_back {
  margin-bottom: 20px
}

.onsumbit {
  display: flex;
  justify-content: center;
  align-items: center;
  margin-top: 40px
}
</style>

结束语

希望可以帮助到大家啦,上面的方式亲测有效!

相关推荐
虾球xz11 分钟前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇16 分钟前
HTML常用表格与标签
前端·html
疯狂的沙粒20 分钟前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员36 分钟前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐38 分钟前
前端图像处理(一)
前端
程序猿阿伟1 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
疯狂的沙粒1 小时前
对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?
前端·javascript·typescript
瑞雨溪1 小时前
AJAX的基本使用
前端·javascript·ajax
力透键背1 小时前
display: none和visibility: hidden的区别
开发语言·前端·javascript
程楠楠&M1 小时前
node.js第三方Express 框架
前端·javascript·node.js·express