vue常用富文本编辑器

wangeditor

** 最终效果**
在这里插入图片描述
首先安装wangeditor
$ npm install wangeditor

将wangeditor 封装成组件方便使用
封装成组件

子组件代码

// wangeditor
<template>
    <div id="wangeditor" >
        <div ref="editorElem"  style="text-align:left;width: 1085px"></div>
        <div class="wangeditorVideo">
		//element的上传组件
            <el-upload
                    size="mini"
                    :on-success="handleAvatarSuccess"
                    :before-upload="beforeAvatarUpload"
                    class="upload-demo"
                    drag
                    tip="false"
                    :headers="headers"
                    :action='scurl'
                    multiple>
                <i class="el-icon-upload"></i>
                <div class="el-upload__text">上传视频</div>
            </el-upload>
        </div>
    </div>
</template>

<script>
    import E from 'wangeditor'
    import URL from "@/js/URL";
    // import Upload from '@/components/Upload'
    export default {
        name: 'editorElem',
        data() {
            return {
                scurl: URL.info.NewBroadcast.uploadItem,
                editor:null,
                editorContent:'',
                headers:{
                    ttsx_auth_token:localStorage.getItem('token')
                },
            }
        },
        props: ['catchData','content'],    //接收父组件的方法

        watch: {
            content () {
                this.editor.txt.html(this.content)
            }
        },
        mounted() {
            this.editor = new E(this.$refs.editorElem)        //创建富文本实例
            this.editor.customConfig.onchange = (html) => {
		console.log(html)
                this.editorContent = html
                this.catchData(html)  //把这个html通过catchData的方法传入父组件
            }
          
            this.editor.customConfig.uploadImgServer = ‘uploadItem’ //------上传图片的接口
            this.editor.customConfig.uploadFileName = 'file'	     //-------上传图片的名称
            this.editor.customConfig.uploadImgHeaders = {
                'Accept': '*/*',
                'ttsx_auth_token': localStorage.getItem('token')    //头部token
            }
            this.editor.customConfig.menus = [          //菜单配置
                'head',
                'list',  // 列表
                'justify',  // 对齐方式
                'bold',
                'fontSize',  // 字号
                'italic',
                'underline',
                'image',  // 插入图片
                'foreColor',  // 文字颜色
                'undo',  // 撤销
                'redo',  // 重复
                // 'video'//视频
            ]
            //下面是最重要的的方法
            this.editor.customConfig.uploadImgHooks = {
                before: function (xhr, editor, files) {
                    // 图片上传之前触发
                    // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件

                    // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
                    // return {
                    //     prevent: true,
                    //     msg: '放弃上传'
                    // }
                },
                success: function (xhr, editor, result) {
                    // 图片上传并返回结果,图片插入成功之后触发
                    // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
                    let imgURl ='/api/resource/download/'+ result.data.data[0].encryptId
                    this.imgUrl = Object.values(imgURl).toString()
                },
                fail: function (xhr, editor, result) {
                    // 图片上传并返回结果,但图片插入错误时触发
                    // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
                },
                error: function (xhr, editor) {
                    // 图片上传出错时触发
                    // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
                },
                timeout: function (xhr, editor) {
                    // 图片上传超时时触发
                    // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
                },

                // 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置
                // (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)
                customInsert: function (insertImg, result, editor) {
                    // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
                    // insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果

                    // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
                    let imgURl ='/api/resource/dow' +
                        'nload/'+ result.data.data[0].encryptId
                    let imgName ='/api/resource/download/'+ result.data.data[0].fileName
                    let imgArr = {
                        url:imgURl
                    }
                    let url = Object.values(imgArr)      //result.data就是服务器返回的图片名字和链接
                    JSON.stringify(url)    //在这里转成JSON格式
                    insertImg(url)
                    // result 必须是一个 JSON 格式字符串!!!否则报错
                }
            }
            this.editor.customConfig.pasteFilterStyle = false
            this.editor.create()
            this.editor.txt.html(this.content)
       
        },
        methods:{
		//上传视频
            handleAvatarSuccess(res, file) {
                let iframe ='res.url'; //上传成功后将视频地址赋值到video
                this.editor.txt.append("<video  src='"+iframe+"' controls='controls' style='width: 50%'></video><br>")   //上传成功之后赋值给editor
                this.editor.change()
                if(iframe){
                    this.$message.success('上传视频成功!');
                }else{
                    this.$message.error('上传视频失败!');
                }
            },
            beforeAvatarUpload(file) {
            }
        }
    }
</script>
<style>
    .w-e-text-container{
        height: auto!important;
        min-height:300px;
    }
    .w-e-text{
        min-height: 300px!important;
    }
    .el-upload-list{
        display: none;
    }
    .el-upload-dragger{
        width: 160px;
        height: 130px;
    }
    .el-upload-dragger{
        border: none;

    }

    .wangeditorVideo .upload-demo{
            text-align: center;
    }
    .wangeditor img{
        max-width: 100%;
    }


</style>

父组件代码

父组件引入富文本编辑器
父组件代码

<wangeditor v-if="iswanged" :catchData="catchData" :content="wznr"></wangeditor>

在这里接受子组件传过来的参数,赋值给data里的参数

    catchData(value) {
                this.form.content = value      //在这里接受子组件传过来的参数,赋值给data里的参数
                this.form.content = encodeURI(this.form.content.replace(/&quot;|&#39;|&lt;|&gt;/g, "\‘").replace(/&nbsp;/g, "").replace(/《/g, "《").replace(/》/g, "》"))
            },
版权声明:本文为qq_39856705原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39856705/article/details/96327054