wangeditor 封装组件及使用

版本

"@wangeditor/editor": "^5.1.23",

"@wangeditor/editor-for-vue": "^1.0.2",

封装组件

<template>
  <div>
    <div style="border: 1px solid #ccc; margin-top: 10px">
      <!-- 工具栏 -->
      <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" />
      <!-- 编辑器 -->
      <Editor
        :class="isDisabled?'editor-disabled':''"
        :style="'height: '+height+'px'"
        :defaultConfig="editorConfig"
        v-model="content"
        @onChange="onChange"
        @onCreated="onCreated"
      />
    </div>
  </div>
</template>

<script>
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import { i18nAddResources, i18nChangeLanguage, i18nGetResources } from '@wangeditor/editor'

export default {
  name: 'WangEditor',
  components: { Editor, Toolbar },
  props: {
    html: {
      type: String,
      default: '',
    },
    isDisabled:{
        type: Boolean,
        default: false
    },
    height:{
        type: Number,
        default: 400
    }
  },
  data() {
    return {
      content: this.html,
      editor: null,
      toolbarConfig: {
        // toolbarKeys: [ /* 显示哪些菜单,如何排序、分组 */ ],
        /* 隐藏哪些菜单 */
        excludeKeys: [
          'bgColor',
          'blockquote',
          'underline',
          'italic',
          'lineHeight',
          'todo',
          'codeBlock',
          'group-more-style',
          'emotion', // 表情
          'insertLink', // 插入链接
          'group-image',
          'group-video',
          'insertTable', // 插入表格
          'divider', // 分割线
          'fullScreen', // 全屏
        ],
      },
      editorConfig: {
        placeholder: '',
        // autoFocus: false,
        // 所有的菜单配置,都要在 MENU_CONF 属性下
        MENU_CONF: {},
      },
    }
  },
  watch: {
    //为了解决实时显示编辑器内容
    html: {
      handler(newVal) {
        this.$nextTick(()=>{
          if(!newVal){
            this.content = ''
          }else{
            this.content = newVal
          }
          if(!this.isDisabled&&this.editor){
            this.editor.enable()
          }else if(this.isDisabled&&this.editor){
            this.editor.disable()
          }
        })
      },
      deep: true
    },
  },
  methods: {
    onCreated(editor) {
      this.editor = Object.seal(editor) // 【注意】一定要用 Object.seal() 否则会报错
      if(this.isDisabled){
        this.editor.disable()
      }else{
        this.editor.enable()
      }
      // 富文本多语言
      if (this.editor) {
        // 添加繁体中文语言资源
        i18nAddResources('zh-TW', {
          editor: {
            more: '更多',
            justify: '對齊',
            indent: '縮進',
            image: '圖片',
            video: '視頻',
          },
          common: {
            ok: '確定',
            delete: '刪除',
            enter: '回車',
          },
          blockQuote: {
            title: '引用',
          },
          codeBlock: {
            title: '代碼塊',
          },
          color: {
            color: '文字顏色',
            bgColor: '背景色',
            default: '默認顏色',
            clear: '清除背景色',
          },
          divider: {
            title: '分割線',
          },
          emotion: {
            title: '表情',
          },
          fontSize: {
            title: '字號',
            default: '默認字號',
          },
          fontFamily: {
            title: '字體',
            default: '默認字體',
          },
          fullScreen: {
            title: '全屏',
          },
          header: {
            title: '標題',
            text: '正文',
          },
          image: {
            netImage: '網絡圖片',
            delete: '刪除圖片',
            edit: '編輯圖片',
            viewLink: '查看連結',
            src: '圖片地址',
            desc: '圖片描述',
            link: '圖片連結',
          },
          indent: {
            decrease: '減少縮進',
            increase: '增加縮進',
          },
          justify: {
            left: '左對齊',
            right: '右對齊',
            center: '居中對齊',
            justify: '兩端對齊',
          },
          lineHeight: {
            title: '行高',
            default: '默認行高',
          },
          link: {
            insert: '插入連結',
            text: '連結文本',
            url: '連結地址',
            unLink: '取消連結',
            edit: '修改連結',
            view: '查看連結',
          },
          textStyle: {
            bold: '粗體',
            clear: '清除格式',
            code: '行內代碼',
            italic: '斜體',
            sub: '下標',
            sup: '上標',
            through: '刪除線',
            underline: '下劃線',
          },
          undo: {
            undo: '撤銷',
            redo: '重做',
          },
          todo: {
            todo: '待辦',
          },
          listModule: {
            unOrderedList: '無序列表',
            orderedList: '有序列表',
          },
          tableModule: {
            deleteCol: '刪除列',
            deleteRow: '刪除行',
            deleteTable: '刪除表格',
            widthAuto: '寬度自適應',
            insertCol: '插入列',
            insertRow: '插入行',
            insertTable: '插入表格',
            header: '表頭',
          },
          videoModule: {
            delete: '刪除視頻',
            uploadVideo: '上傳視頻',
            insertVideo: '插入視頻',
            videoSrc: '視頻地址',
            videoSrcPlaceHolder: '視頻文件 url 或第三方 <iframe>',
            videoPoster: '視頻封面',
            videoPosterPlaceHolder: '封面圖片 url',
            ok: '確定',
            editSize: '修改尺寸',
            width: '寬度',
            height: '高度',
          },
          uploadImgModule: {
            uploadImage: '上傳圖片',
            uploadError: '{{fileName}} 上傳出錯',
          },
          highLightModule: {
            selectLang: '選擇語言',
          },
        })
        if(localStorage.getItem('language')=='en-US'){
          i18nChangeLanguage('en')
        }else if(localStorage.getItem('language')=='zh-CN'){
          i18nChangeLanguage('zh-CN')
        }else{
          i18nChangeLanguage('zh-TW')
        }
      }
    },
    onChange(editor) {
      let content = editor.getHtml()
      this.$emit('receiveContent', content)
    },
    getEditorText() {
      const editor = this.editor
      if (editor == null) return
      console.log(editor.getText()) // 执行 editor API
    },
    printEditorHtml() {
      const editor = this.editor
      if (editor == null) return

      console.log(editor.getHtml()) // 执行 editor API
    },
  },
  mounted() {
  },
  beforeDestroy() {
    const editor = this.editor
    if (editor == null) return
    editor.destroy() // 组件销毁时,及时销毁 editor ,重要!!!
  },
}
</script>

<style src="@wangeditor/editor/dist/css/style.css"></style>
<style>
.editor-disabled .w-e-text-container{
  background: #f3f3f3;
  cursor: not-allowed;
}
</style>

使用

<wang-editor :html.sync="stageGoals" @receiveContent="receiveContent" :height="500"></wang-editor>

 methods: {
    receiveContent(content) {
      this.stageGoals = content
    },
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值