vue-tynimce

  1. 安装安装包
    $ npm install @tinymce/tinymce-vue -S
    $ npm install tinymce -S

  2. 在 node_modules 中找到 tinymce/skins 目录,然后将 skins 目录拷贝到 static 目录下

// 如果是使用 vue-cli 3.x 构建的 typescript 项目,就放到 public 目录下,文中所有 static 目录相关都这样处理

tinymce 默认是英文界面,所以还需要下载一个中文语言包(记得搭梯子!搭梯子!搭梯子!)

然后将这个语言包放到 static 目录下,为了结构清晰,我包了一层 tinymce 目录

  1. 添加一个editor.vue 文件 作为组件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    <template>
    <div class="tinymce-editor">
    <editor v-model="myValue" :init="init" :disabled="disabled" @onClick="onClick"></editor>
    </div>
    </template>
    <script>
    import tinymce from 'tinymce/tinymce'
    import Editor from '@tinymce/tinymce-vue'
    import 'tinymce/themes/silver'
    // 编辑器插件plugins
    // 更多插件参考:https://www.tiny.cloud/docs/plugins/
    import 'tinymce/plugins/image'// 插入上传图片插件
    import 'tinymce/plugins/media'// 插入视频插件
    import 'tinymce/plugins/table'// 插入表格插件
    import 'tinymce/plugins/lists'// 列表插件
    import 'tinymce/plugins/wordcount'// 字数统计插件
    export default {
    components: {
    Editor
    },
    props: {
    value: {
    type: String,
    default: ''
    },
    disabled: {
    type: Boolean,
    default: false
    },
    plugins: {
    type: [String, Array],
    default: 'lists image media table wordcount'
    },
    toolbar: {
    type: [String, Array],
    default: 'undo redo | formatselect | bold italic forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists image media table | removeformat'
    }
    },
    data () {
    return {
    init: {
    language_url: '/tinymce/langs/zh_CN.js',
    language: 'zh_CN',
    skin_url: '/tinymce/skins/ui/oxide',
    // skin_url: '/tinymce/skins/ui/oxide-dark',//暗色系
    height: 300,
    plugins: this.plugins,
    toolbar: this.toolbar,
    branding: false,
    menubar: false,
    // 此处为图片上传处理函数,这个直接用了base64的图片形式上传图片,
    // 如需ajax上传可参考https://www.tiny.cloud/docs/configure/file-image-upload/#images_upload_handler
    images_upload_handler: (blobInfo, success, failure) => {
    const img = 'data:image/jpeg;base64,' + blobInfo.base64()
    success(img)
    }
    },
    myValue: this.value
    }
    },
    mounted () {
    tinymce.init({})
    },
    methods: {
    // 添加相关的事件,可用的事件参照文档=> https://github.com/tinymce/tinymce-vue => All available events
    // 需要什么事件可以自己增加
    onClick (e) {
    this.$emit('onClick', e, tinymce)
    },
    // 可以添加一些自己的自定义事件,如清空内容
    clear () {
    this.myValue = ''
    }
    },
    watch: {
    value (newValue) {
    this.myValue = newValue
    },
    myValue (newValue) {
    this.$emit('input', newValue)
    }
    }
    }

    </script>
  2. 封装后使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <template>
    <div>
    {{ msg }}
    <tinymce-editor ref="editor"
    v-model="msg"
    :disabled="disabled"
    @onClick="onClick">
    </tinymce-editor>
    <button @click="clear">清空内容</button>
    <button @click="disabled = true">禁用</button>
    </div>
    </template>

    <script>
    import TinymceEditor from './tinymce-editor/tinymce-editor'
    export default {
    components: {
    TinymceEditor
    },
    data () {
    return {
    msg: 'Welcome to Use Tinymce Editor',
    disabled: false
    }
    },
    methods: {
    // 鼠标单击的事件
    onClick (e, editor) {
    console.log('Element clicked')
    console.log(e)
    console.log(editor)
    },
    // 清空内容
    clear () {
    this.$refs.editor.clear()
    }
    }
    }
    </script>