vue-froala-wysiwyg富文本编辑器

这里推荐使用自己写的富文本编辑器
这个富文本编辑器,感觉收费麻烦我后续又更新了一个braft_editor富文本编辑器
在这里插入图片描述
安装

npm i vue-froala-wysiwyg -S;
如果出现 Cannot find module '@babel/runtime/core-js/object/keys'
执行下面这个
npm install --save-dev @babel/runtime-corejs2

main.js

import 'froala-editor/css/froala_editor.pkgd.min.css'
import 'froala-editor/css/froala_style.min.css'
import 'froala-editor/js/froala_editor.pkgd.min.js'
import 'froala-editor/js/languages/zh_cn.js'
import 'froala-editor/js/plugins.pkgd.min.js'
import VueFroala from 'vue-froala-wysiwyg'

Vue.use(VueFroala)

froala-editor.vue

<!--
label:用于给富文本赋予默认值,清空值label=" ",必须加空格,负责不会清空
v-model:单向绑定,由于富文本监听问题,不能用v-model赋予默认值
  -->
<template>
    <div class="editor-wrap">
        <froala
            id="froala-editor"
            :tag="'textarea'"
            :config="froalaConfig"
            v-model="body"
        ></froala>
    </div>
</template>
<script>
export default {
    props: {
        // 显示的工具列表
        tool:{
        type:Array,
        default:[
                    'undo',
                    'redo',
                    'clearFormatting',
                    'bold',
                    'italic',
                    'underline',
                    'strikeThrough',
                    'fontFamily',
                    'fontSize',
                    'color',
                    'inlineStyle',
                    'paragraphFormat',
                    'align',
                    'formatOL',
                    'formatUL',
                    'outdent',
                    'indent',
                    'quote',
                    'insertLink',
                    'insertImage',
                    'insertVideo',
                    'embedly',
                    'insertFile',
                    'insertTable',
                    'emoticons',
                    'specialCharacters',
                    'insertHR',
                    'selectAll',
                    'print',
                    'spellChecker',
                    'html',
                    'help',
                    'fullscreen'
                ]
        },
        placeholder: {
            type: String
            //   required: true
        },
        height: {
            type: Number
        },
        value: {
            type: String,
            default: null
        },
        label: {
            type: String,
            default: ''
        },
        index: {
            type: Number,
            default: 1
        }
    },
    name: 'froala-editor',
    data() {
        var that = this
        return {
            editor: null,
            body: null,
            froalaConfig: {
                toolbarButtons: this.tool,
                // theme: "dark",//主题
                placeholderText: this.placeholder || '请在此输入',
                language: 'zh_cn', //国际化
                imageUploadURL: '', //上传url
                imageUploadParams: { token: '', i: '', ak: '', f: 9 },
                fileUploadURL: '',
                fileUploadParams: { token: '', i: '', ak: '', f: 9 },
                videoUploadURL: '',
                videoUploadParams: { token: '', i: '', ak: '', f: 9 },
                quickInsertButtons: ['image', 'table', 'ul', 'ol', 'hr'], //快速插入项
                // toolbarVisibleWithoutSelection: true,//是否开启 不选中模式
                // disableRightClick: true,//是否屏蔽右击
                colorsHEXInput: false, //关闭16进制色值
                toolbarSticky: false, //操作栏是否自动吸顶,
                zIndex: 2501,
                height: this.height || '400',
                // autofocus: true,
                events: {
                    initialized: function() {
                        // console.log("initialized1111");
                        // this.editor = editor;
                        // console.log(editor.opts.imageUploadParams);
                        that.editor = this
                        // console.log("initial");
                        // that.editor.html.set(that.value);
                        that.body = that.value
                        // that.setHtml()
                    },
                    blur: () => {
                        // console.log("blur....");
                        this.$emit('blur')
                    },
                    'image.beforeUpload': function() {
                        // Image was uploaded to the server.
                        // var i = generateUUID()
                        // this.opts.imageUploadParams.token = getToken()
                        // this.opts.imageUploadParams.i = i
                        // this.opts.imageUploadParams.ak = md5(COMM_API_KEY + i)

                        return true
                    },
                    'file.beforeUpload': function() {
                        // Image was uploaded to the server.

                        // var i = generateUUID()
                        // this.opts.fileUploadParams.token = getToken()
                        // this.opts.fileUploadParams.i = i
                        // this.opts.fileUploadParams.ak = md5(COMM_API_KEY + i)
                        return true
                    },
                    'video.beforeUpload': function() {
                        // Image was uploaded to the server.
                        // var i = generateUUID()
                        // this.opts.videoUploadParams.token = getToken()
                        // this.opts.videoUploadParams.i = i
                        // this.opts.videoUploadParams.ak = md5(COMM_API_KEY + i)
                        return true
                    },
                    contentChanged: () => {}
                }
            }
        }
    },
    watch: {
        body: function(newVal, old) {
            if (old !== newVal) {
                let val = this.getSimpleText(this.editor.html.get(true))
                this.$emit('input', val)
            }
        },
        label: function(newVal, old) {
            if (old !== newVal) {
                this.editor.html.set(newVal)
            }
        }
    },
    mounted() {
        setTimeout(() => {
            this.setIndex(this.index)
        }, 200)
    },
    methods: {
        //更改富文本层级
        setIndex(val) {
            this.$nextTick(() => {
                let dv = document.getElementsByClassName('fr-box')
                for (let i in dv) {
                    if (!dv[i].style) {
                        return
                    }
                    dv[i].style.cssText = 'z-index:' + val
                }
            })
        },
        //富文本中提取纯文本
        getSimpleText: (html) => {
            var re1 = new RegExp('<p data-f-id="pbf".+?</p>', 'g') //匹配html标签的正则表达式,"g"是搜索匹配多个符合的内容
            var msg = html.replace(re1, '') //执行替换成空字符
            return msg
        },
        //重置富文本
        resetValue(val) {
            this.body = val || ''
        }
    }
}
</script>
<style>
.editor-wrap {
    width: 900px;
}
.editor-wrap > div {
    width: 100%;
}
.fr-wrapper > div[style*='z-index:9999;'],
.fr-wrapper > div[style*='z-index: 9999;'] {
    height: 0;
    overflow: hidden;
}
.fr-box .second-toolbar #logo {
    width: 0 !important;
    height: 0 !important;
    overflow: hidden;
}
.fr-box .fr-toolbar {
    border-radius: 4px 4px 0 0;
    border-color: #dcdfe6;
}
.fr-box .second-toolbar {
    border-radius: 0 0 4px 4px;
    border-color: #dcdfe6;
}
.fr-box .fr-wrapper {
    border-color: #dcdfe6 !important;
}
</style>


运用组件

<template>
<froalaEditor :label="editorContentLaebl" v-model="basicForm.editorContent"></froalaEditor>
</template>
<script>
import froalaEditor from '../../components/common/froala-editor.vue'
export default {
    components: { froalaEditor },
    data() {
        return {
        editorContentLaebl:"",
        basicForm:{editorContent:""}
        }
     }
}

这款富文本编辑器需要解决一个bug
在node-modules下面找到这个文件夹替换s文件夹下面两个js文件,文件代码太多,不方便发布在博客上,把文件放在腾讯微云上方便下载
文件腾讯微云链接:https://share.weiyun.com/5aqW8Wj
在这里插入图片描述

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值