tinymce封装成vue3组件

封装成组件

复制代码
<script setup >
import Editor from '@tinymce/tinymce-vue'
//引入tinymce开启本地模式
import 'tinymce/tinymce'
//引入图标和主题等
import 'tinymce/themes/silver/theme'
import 'tinymce/icons/default/icons'
import 'tinymce/models/dom'
//引入插件
import 'tinymce/plugins/codesample'
import 'tinymce/plugins/lists'
import 'tinymce/plugins/advlist'
import 'tinymce/plugins/link'
import 'tinymce/plugins/autolink'
import 'tinymce/plugins/charmap'
import 'tinymce/plugins/emoticons'
import 'tinymce/plugins/fullscreen'
import 'tinymce/plugins/preview'
import 'tinymce/plugins/code'
import 'tinymce/plugins/searchreplace'
import 'tinymce/plugins/table'
import 'tinymce/plugins/visualblocks'
import 'tinymce/plugins/wordcount'
import 'tinymce/plugins/insertdatetime'
import 'tinymce/plugins/image'

const emit = defineEmits(['setData','file'])
const props = defineProps({
    value: {
        type: String,
        default: '',
    },
    disabled: {
        type: Boolean,
        default: false, 
    },
    init: { type: Object },
})

let initObj = reactive({
    // 选择器
    selector: 'textarea#tinymceVue',
    // 设置本地主题
    skin_url: '/tinymce/skins/ui/oxide',
    // 设置本地css
    content_css: '/tinymce/skins/content/default/content.css',
    // 设置本地plugins中emojis的位置,用来获取表情
    emoticons_database_url: '/tinymce/plugins/emoticons/js/emojis.js',
    // 设置本地语言
    language_url: '/tinymce/langs/zh-Hans.js',
    // 设置本地语言
    language: 'zh-Hans',
    // 设置工具栏
    toolbar: [
        'bold italic hr | fontsize forecolor backcolor | blocks blockquote removeformat | undo redo ',
        'bullist table insertdatetime | link charmap emoticons wordcount searchreplace code | codesample visualblocks image fullscreen preview',
    ],
    // 设置插件
    plugins: 'codesample lists advlist link autolink charmap emoticons fullscreen preview code searchreplace table visualblocks wordcount insertdatetime image',
    // 设置图片上传
    images_upload_handler: blobInfo => new Promise((resolve, reject) => {
        emit('file', blobInfo, resolve, reject)
    }),
})
//有新设定就覆盖init
if (props.init){
    Object.assign(initObj, props.init)
}
//content内容变量
let content = ref(props.value)
//更新父组件内容
const handlerFunction = () => {
    emit('setData', content.value)
}
</script>
<template>
     <Editor id="tinymceVue" v-model="content" :init="initObj" :disabled="disabled" @selectionChange="handlerFunction" />
</template>
复制代码

使用

复制代码
<script setup>
import tinymce from '@/components/tinymce.vue'

let data = ref('')

const getData = str => {
    data.value = str
}

let init = reactive({ })

let upFile = (blobInfo, resolve, reject) => {
    let formdata = new FormData()
    formdata.append('file', blobInfo.blob(), blobInfo.filename())
    ajax.post('/file/up', formdata).then(res => {
        resolve(res.url)
    }).catch(err => {
        reject(err)
    })
}
</script>
<template>
    <tinymce :value="data" @setData="getData" :init="init" @file="upFile" />
</template>
复制代码

 

posted @   Pavetr  阅读(372)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示