Vue学习笔记-富文本编辑器wangEditor

最近开发Vue项目,想要一个功能更全面的编辑器,我找了好久,目前常见的编辑器有这些:

UEditor:百度前端的开源项目,功能强大,基于 jQuery,但已经没有再维护,而且限定了后端代码,修改起来比较费劲,并且比较重。

bootstrap-wysiwyg:微型,易用,小而美,只是 Bootstrap + jQuery...

kindEditor:功能强大,代码简洁,需要配置后台,而且好久没见更新了。

quill:本身功能不多,不过可以自行扩展,api 也很好懂,如果能看懂英文的话...

summernote:没深入研究,UI挺漂亮,也是一款小而美的编辑器,就是用的人不多。

tinymce:GitHub 上星星很多,功能也齐全;唯一一个从 word 粘贴过来还能保持绝大部分格式的编辑器; 不需要找后端人员扫码改接口,前后端分离;但是,在项目里配置麻烦一点。

wangEditor:轻量、简洁、易用,但是升级到 3.x 之后,不便于定制化开发。不过作者很勤奋,广义上和我是一家人,打个call。

于是就选择则WangEditor2。

  1. 安装:

    点击 https://github.com/wangfupeng1988/wangEditor/releases 下载最新版
    使用git下载: git clone https://github.com/wangfupeng1988/wangEditor.git
    使用npm安装: npm install wangeditor (注意 wangeditor 全部是小写字母)
    使用bower下载:bower install wangEditor (前提保证电脑已安装了bower)
    

    在项目中直接 npm install wangeditor --save,如果安装了淘宝镜像,就使用 cnpm install wangeditor --save,会快一点。

  2. 在页面中放入

    <div id="editor"></div>
    

    然后

    import WangEditor from 'wangeditor'
    
    let that = this
    this.editor = new WangEditor('#WangEditor')  //这个地方传入div元素的id 需要加#号
    // 配置 onchange 事件
    this.editor.change = function () {          // 这里是change 不是官方文档中的 onchange
      // 编辑区域内容变化时,实时打印出当前内容
      console.log(this.txt.html())
    }
    this.editor.create()     // 生成编辑器
    this.editor.txt.html('<p>输入内容...</p>')   //注意:这个地方是txt  不是官方文档中的$txt
    
  3. 在开发中碰到过这么个问题,就是在用v-if动态显示隐藏页面元素时,页面会进行重绘,目标元素div依然存在于dom树中,但是wanEditor实例需要重新生成,且需要在this.$nextTick方法中调用

    this.editor = new WangEditor('#WangEditor')
    

    方可生效

  4. wangEditor的输入控制栏与输入区域默认的z-index为100001 10000,当富文本编辑框上方有下拉菜单时,选择框会被覆盖。解决办法

    .w-e-menu{
      z-index: 2 !important;
    }
      .w-e-text-container{
        z-index: 1 !important;
      }
    

    注:w-e-menu的z-index必须比container的大,不然选择菜单栏选项时,会选不上

    代码示例:

    import WangEditor from 'wangeditor';
    export default {
        data(){
            return{
                dataInterface: {
                    editorUpImgUrl: 'http://xxxx'  // 编辑器插入的图片上传地址
                },
                editor: '',  // 存放实例化的wangEditor对象,在多个方法中使用
            }
        },
        ready(){
            this.createEditor();
        },
        beforeDestroy(){
            this.destroyEditor();
        },
        methods: {
            createEditor(){  // 创建编辑器
                this.editor = new WangEditor('account--editor');
                this.initEditorConfig();  // 初始化编辑器配置,在create之前
                this.editor.create();  // 生成编辑器
                this.editor.$txt.html('<p>要初始化的内容</p>');  // 初始化内容
                $('#account--editor').css('height', 'auto');  // 使编辑器内容区自动撑开,在css中定义min-height
            },
            destroyEditor(){  // 销毁编辑器,官方没有给出完美方案。此方案是作者给出的临时方案
                this.editor.destroy();  // 这个没有完全销毁实例,只是作了隐藏
                // $('#account--editor').remove();  // 不报错的话,这一步可以省略
                this.editor = null;
                WangEditor.numberOfLocation--;  // 手动清除地图的重复引用,作者的临时解决方案。否则单页面来回切换时,地图报错重复引用
            },
            initEditorConfig(){  // 初始化编辑器配置
                this.editor.config.fontsizes = {  // 字号配置,增加14px
                    // 格式:'value': 'title'
                    1: '12px',
                    2: '13px',
                    3: '14px',
                    4: '16px',
                    5: '18px',
                    6: '24px',
                    7: '32px',
                    8: '48px'
                };
                this.editor.config.uploadImgUrl = this.dataInterface.editorUpImgUrl;  // 图片上传地址
    
                this.editor.config.uploadImgFileName = '_img';  // 统一指定上传的文件name,需要指定。否则默认不同的上传方式是不同的name
    
                const usersecret = window.localStorage.getItem('usersecret');  // 获取 usersecret
    
                this.editor.config.uploadParams = {  // 自定义上传参数配置
                    usersecret: usersecret
                };
            },
            getEditorContent(){  // 获取编辑器 内容区内容
                this.editorContent = this.editor.$txt.html();  // 获取 html 格式
                // this.editor.$txt.text();  // 获取纯文本
                // this.editor.$txt.formatText();  // 获取格式化后的纯文本
            },
        }
    }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容