vue中使用wangEditor,并且富文本图片上传到oss

oss.js新建(需安装依赖)

npm install ali-oss //安装依赖

新建一个oss.js文件

import OSS from 'ali-oss';
// import { bucket} from '@/api/baseUrl';
const bucket = process.env.NODE_ENV === 'prod' ? '****' : '****';//是否生产
const accessKeyId = process.env.NODE_ENV === 'prod' ? '****' : '****';
const accessKeySecret = process.env.NODE_ENV === 'prod' ? '****' : '****';
export function client() {
    var client = new OSS({
        bucket: bucket,
        endpoint: 'oss-cn-hangzhou.aliyuncs.com',
        accessKeyId: accessKeyId,
        accessKeySecret: accessKeySecret
    });
    return client;
}
/**
 * 生成随机uuid
 */
export const getFileNameUUID = () => {
    function rx() {
        return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    }
    return `${+new Date()}_${rx()}${rx()}`;
};

wangEditor.vue新建(需安装依赖)

npm install wangeditor

新建一个组件wangEditor.vue

<template lang="html">
    <div class="wangeditor">
        <div ref="toolbar" class="toolbar"></div>
        <div ref="wangeditor" class="text"></div>
    </div>
  </template>
   
  <script>
import E from 'wangeditor';
import { client, getFileNameUUID, getTimeNow } from '../../utils/oss.js';
import { OSS_URL } from '@/api/config';
export default {
    data() {
        return {
            wangEditor: null,
            wangEditorInfo: null
        };
    },
    model: {
        prop: 'value',
        event: 'change'
    },
    props: {
        value: {
            type: String,
            default: ''
        },
        isClear: {
            type: Boolean,
            default: false
        }
    },
    watch: {
        isClear(val) {
            // 触发清除文本域内容
            if (val) {
                this.wangEditor.txt.clear();
                this.wangEditorInfo = null;
            }
        },
        value: function (value) {
            if (value !== this.wangEditor.txt.html()) {
                this.isClear = false;
                this.wangEditor.txt.html(this.value); //value为编辑框输入的内容,这里我监听了一下值,当父组件调用得时候,如果给value赋值了,子组件将会显示父组件赋给的值
            }
        }
    },
    mounted() {
        this.initEditor();
        this.wangEditor.txt.html(this.value);
    },
    methods: {
        initEditor() {
            this.wangEditor = new E(this.$refs.toolbar, this.$refs.wangeditor);
            this.wangEditor.customConfig = this.wangEditor.customConfig ? this.wangEditor.customConfig : this.wangEditor.config;
            this.wangEditor.customConfig.uploadImgShowBase64 = false; // base64存储图片(推荐)
            // this.wangEditor.customConfig.uploadImgServer = "https://jsonplaceholder.typicode.com/posts/"; // 配置服务器端地址(不推荐)
            var fileName = '/messageEditor/' + getTimeNow() + '/' + getFileNameUUID() + '.jpg';
            this.wangEditor.customConfig.customUploadImg = async (files, insert) => {
                const res = await client().multipartUpload(fileName, files[0]);
                this.wangEditor.cmd.do('insertHTML', `<img style="width:100%;display:block" src=${OSS_URL + fileName} alt=''>`);
            };
            this.wangEditor.customConfig.uploadImgHeaders = {}; // 自定义header
            this.wangEditor.customConfig.uploadFileName = 'file'; // 后端接受上传文件的参数名
            this.wangEditor.customConfig.uploadImgMaxLength = 1; // 限制一次最多上传6张图片

            // 配置菜单
            this.wangEditor.customConfig.menus = [
                'head', // 标题
                'bold', // 粗体
                'fontSize', // 字号
                'fontName', // 字体
                'italic', // 斜体
                'underline', // 下划线
                'strikeThrough', // 删除线
                'foreColor', // 文字颜色
                'backColor', // 背景颜色
                'link', // 插入链接
                'list', // 列表
                'justify', // 对齐方式
                'quote', // 引用
                'emoticon', // 表情
                'image', // 插入图片
                'table', // 表格
                'video', // 插入视频
                'code', // 插入代码
                'undo', // 撤销
                'redo', // 重复
                'fullscreen' // 全屏
            ];
            this.wangEditor.customConfig.uploadImgHooks = {
                fail: (xhr, editor, result) => {
                    // 插入图片失败回调
                },
                success: (xhr, editor, result) => {
                    // 图片上传成功回调
                },
                timeout: (xhr, editor) => {
                    // 网络超时的回调
                },
                error: (xhr, editor) => {
                    // 图片上传错误的回调
                },
                customInsert: (insertImg, result, editor) => {
                    // 图片上传成功,插入图片的回调(不推荐)
                    insertImg(result.url);
                }
            };
            this.wangEditor.customConfig.onchange = (html) => {
                this.wangEditorInfo = html;
                this.$emit('change', this.wangEditorInfo); // 将内容同步到父组件中
            };
            // 创建富文本编辑器
            this.wangEditor.create();
        }
    }
};
</script>
   
  <style lang="scss">
.wangeditor {
    border: 1px solid #e6e6e6;
    box-sizing: border-box;
    .toolbar {
        border-bottom: 1px solid #e6e6e6;
        box-sizing: border-box;
    }
    .text {
        height: 400px;
    }
}
</style>
  

页面中使用和效果

<template>
    <div>
       <wangEditor v-model="wangEditorDetail" :isClear="isClear" @change="wangEditorChange" style="height: 500px"></wangEditor>
    </div>
</template>
<script>
import wangEditor from '@/components/common/wangEditor';
export default {
    components: {
        wangEditor
    },
    data() {
        return {
            isClear: false, //设置为true的时候,这个可以用this.wangEditorDetail=''来替代
            wangEditorDetail: '',
        };
    },
    methods: {
        wangEditorChange(val) {
            this.form.content = val;
        }
    }
}
</script>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下使用Vue3封装WangEditor富文本组件的步骤。 首先,我们需要安装WangEditorVue3,可以通过以下命令进行安装: ```bash npm install wangeditor@latest npm install vue@next ``` 接着,我们可以在Vue3的组件使用WangEditor。下面是一个简单的示例: ```vue <template> <div ref="editorElem"></div> </template> <script> import WangEditor from 'wangeditor' export default { mounted() { const editor = new WangEditor(this.$refs.editorElem) editor.create() } } </script> ``` 在上面的代码,我们通过import导入了WangEditor,并在mounted钩子函数创建了一个新的编辑器实例。注意,我们需要在组件的模板添加一个ref属性,用于引用编辑器的DOM元素。 如果您需要进一步封装WangEditor组件,可以考虑将其封装为一个Vue组件,以便在其他地方重复使用。下面是一个简单的示例: ```vue <template> <div :id="editorId"></div> </template> <script> import WangEditor from 'wangeditor' export default { props: { value: String, placeholder: String, height: { type: String, default: '300px' } }, data() { return { editorId: `editor-${Math.random().toString(36).substr(2, 9)}`, editor: null } }, mounted() { this.editor = new WangEditor(`#${this.editorId}`) this.editor.config.height = this.height this.editor.config.placeholder = this.placeholder this.editor.config.onchange = this.handleChange this.editor.create() this.editor.txt.html(this.value) }, methods: { handleChange() { this.$emit('input', this.editor.txt.html()) } }, beforeUnmount() { this.editor.destroy() } } </script> ``` 在上面的代码,我们定义了一个WangEditor组件,并通过props接收了一些参数,包括组件的初始值、占位符和高度等。在mounted钩子函数,我们创建了一个新的编辑器实例,并通过config属性设置了一些编辑器的配置项,包括高度、占位符和内容变化时的回调函数等。我们还通过handleChange方法监听了编辑器内容的变化,并通过$emit方法向父组件发送了一个input事件,以便在父组件更新组件的绑定值。最后,我们在beforeUnmount钩子函数销毁了编辑器实例,以避免内存泄漏。 使用时,您可以像使用其他自定义组件一样,在Vue3的模板引用WangEditor组件,并通过v-model指令绑定组件的值: ```vue <template> <div> <wangeditor v-model="content" placeholder="请输入内容" height="500px" /> <div>{{ content }}</div> </div> </template> <script> import WangEditor from '@/components/WangEditor.vue' export default { components: { WangEditor }, data() { return { content: '' } } } </script> ``` 在上面的代码,我们通过import导入了WangEditor组件,并在模板引用了该组件。我们还通过v-model指令绑定了组件的值,以便在父组件获取和更新该值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值