myEditor.vue 4.41 KB
<template>
  <div>
    <a-row>
      <textarea name="" :id="id"></textarea>
      <!-- <a-col :span="24" style="line-height: 1.5;">
        <span>当前字数:{{tinymceWordCount}}</span>
      </a-col> -->
    </a-row>
  </div>
</template>
<script>

export default {
  name: "myEditor",
  data () {
    return {
      tinymceWordCount: 0,
      hasChange: false,
      fullscreen: false,
    };
  },
  props: {
    id: {
      type: String,
      default: function () {
        return 'vue-tinymce-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')
      }
    },
    value: {
      type: String,
      default: () => {
        return ''
      }
    },
  },
  created () {
  },
  methods: {
    initTinymce () {
      const _this = this
      tinymce.remove(`#${_this.id}`)
      tinymce.init({
        selector: `#${_this.id}`,
        fontsize_formats: '12px 14px 16px 18px 24px 36px 48px',
        font_formats: 'PingFang SC;微软雅黑=\'微软雅黑\';宋体=\'宋体\';黑体=\'黑体\';仿宋=\'仿宋\';楷体=\'楷体\';隶书=\'隶书\';幼圆=\'幼圆\';Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,;sans-serif',
        language: 'zh_CN',
        body_class: 'panel-body ',
        content_style: "img {max-width:100%;}",
        // menubar: false,
        // 隐藏底部状态栏
        statusbar: false,
        height: 600,
        plugins: 'code advlist autolink link image lists preview table wordcount',
        toolbar: `undo redo | styleselect | fontsizeselect fontselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist | image 
                    | table tabledelete | tableprops tablerowprops tablecellprops | tableinsertrowbefore tableinsertrowafter tabledeleterow
                    | tableinsertcolbefore tableinsertcolafter tabledeletecol | wordcount`,
        // 初始化完成回调
        init_instance_callback: (editor) => {
          if (_this.value) {
            editor.setContent(_this.value)
          }
          editor.on('NodeChange Change KeyUp SetContent', () => {
            this.$emit('input', editor.getContent())
          })
        },
        // 图片上传操作
        images_upload_handler: (blobInfo, succFun, failFun) => {
          _this.$api.base.asyncUpload(this.uploadHandle(blobInfo.blob(), blobInfo.filename())).then(({ data = {} }) => {
            if (data) {
              succFun(data.downloadUrl)
            }
          }).catch((err) => {
            failFun(err)
          })
        },
        setup (editor) {
          editor.on('FullscreenStateChanged', (e) => {
            _this.fullscreen = e.state
          })
        },
      })
      // 设置富文本内容
      // tinymce.activeEditor.setContent(htmlText)
      // 监听输入计算字数
      let mark = 1
      tinymce.activeEditor.on('keyup', (e) => {
        if (mark === 1) {
          let wordcount = tinymce.activeEditor.plugins.wordcount
          this.tinymceWordCount = wordcount.body.getWordCount()
          mark = 0
          setTimeout(() => { mark = 1 }, 500)
        }
      })
    },
    uploadHandle (file, fileName) {
      let data = new FormData()
      data.append('file', file)
      data.append('fileName', fileName)
      return data
    },
    destroyTinymce () {
      const tinymce = window.tinymce.get(this.id)
      if (this.fullscreen) {
        tinymce.execCommand('mceFullScreen')
      }
      if (tinymce) {
        tinymce.destroy()
      }
    },
    setContent (value) {
      window.tinymce.get(this.id).setContent(value)
    },
    getContent () {
      window.tinymce.get(this.id).getContent()
    },
  },
  watch: {
    value (val) {
      if (!!val && !this.hasChange) {
        this.$nextTick(() => {
          this.hasChange = true
          window.tinymce.get(this.id).setContent(val)
        })
      }
    },
  },
  mounted () {
    this.initTinymce()
  },
  activated () {
    if (window.tinymce) {
      this.initTinymce()
    }
  },
  deactivated () {
    this.destroyTinymce()
  },
  destroyed () {
    this.destroyTinymce()
  },
}
</script>