全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)

0x00 前言

VueJS 社区里面关于富文本编辑器的集成也不少了,但是之前小调研了一下,基本上就是 quill,medium-editor,因为之前用 AngularJS 用过 medium-editor,并且需要自定义某些按钮,而且最好还是选中弹出式的,所以就决定用 medium-editor。

社区里面 star 较多的就是这个了:vue-medium-editor,但是打开它官网,看了看文档,越看越别扭,来看看它用法:

<!-- index.html -->
<medium-editor :text='myText' :options='options' custom-tag='h2' v-on:edit='applyTextEdit'>

gosh,传这么多参数,我只想要一个简单的 editor 啊

打开源码一看,就 62 行,所以决定自己动手来一个简单点的

0x01 最简版

最简版,其实就在 vue 组件中实例化一下 medium-editor 就可以了

<template>
 <div class="textEditor" @input="handleInput">
 </div>
</template>
<script>
/* eslint-disable no-new */
import MediumEditor from 'medium-editor'
export default {
 props: {
  value: String,
  options: {
   type: Object,
   default: () => ({})
  }
 },
 data () {
  return {
   editor: null // 用来存放 editor 
  }
 },
 watch: {
  // refer: https://github.com/FranzSkuffka/vue-medium-editor/blob/master/index.js
  value (newVal, oldVal) {
   if (newVal !== this.$el.innerHTML) { // 用 $el.innerHTML 来解决 v-html 的光标跳到行首的问题
    this.$el.innerHTML = newVal || ''
   }
  }
 },
 methods: {
  handleInput (e) {
   this.$emit('input', e.target.innerHTML)
  }
 },
 mounted () {
  // 处理初始值的情况
  this.$el.innerHTML = this.value
  // 这里当然可以自定义 options 啦
  this.editor = new MediumEditor(this.$el, Object.assign({}, this.options))
  // medium-editor 的 api,监听内容改变化
  this.editor.subscribe('editableInput', this.handleInput)
 },
 beforeDestroy () {
  this.editor.unsubscribe('editableInput', this.handleInput)
  this.editor.destroy()
 }
}
</script>

完成~,是不是很简单~~哈哈,最简版是一个 v-html 控制的,但是会有自动跳转到首行的问题,所以这里是最终版,细节问题看注释啦

0x02 用法

咋用呢?很简单,在其他组件中这样:

<text-editor v-model="vm.richText"></text-editor>

当然 你首先得安装 medium-editor的 js 和 css了

0x03 自定义 button

下面是我项目中用到的自定义 button 的相关代码,是一个 buttonBuilder:

import MediumEditor from 'medium-editor'
import rangy from 'rangy/lib/rangy-core.js'
import 'rangy/lib/rangy-classapplier'
import 'rangy/lib/rangy-highlighter'
import 'rangy/lib/rangy-selectionsaverestore'
import 'rangy/lib/rangy-textrange'
import 'rangy/lib/rangy-serializer'
const pHash = {
 p1: { name: 'p1', class: 'fs-36' },
 p2: { name: 'p2', class: 'fs-30' },
 p3: { name: 'p3', class: 'fs-24' },
 p4: { name: 'p4', class: 'fs-18' },
 p5: { name: 'p5', class: 'fs-14' },
 p6: { name: 'p6', class: 'fs-12' }
}
function pButtonCreator (p) {
 return MediumEditor.Extension.extend({
  name: p.name,
  init: function () {
   this.classApplier = rangy.createClassApplier(p.class, {
    elementTagName: 'span',
    normalize: false
   })
   this.button = this.document.createElement('button')
   this.button.classList.add('medium-editor-action')
   this.button.innerHTML = p.name
   this.button.title = p.class
   this.on(this.button, 'click', this.handleClick.bind(this))
  },
  getButton: function () {
   return this.button
  },
  clearFontSize: function () {
   MediumEditor.selection.getSelectedElements(this.document).forEach(function (el) {
    if (el.nodeName.toLowerCase() === 'span' && el.hasAttribute('class')) {
     el.removeAttribute('class')
    }
   })
  },
  handleClick: function (event) {
   this.clearFontSize()
   this.classApplier.toggleSelection()
   // Ensure the editor knows about an html change so watchers are notified
   // ie: <textarea> elements depend on the editableInput event to stay synchronized
   this.base.checkContentChanged()
  }
 })
}
export default {
 P1: pButtonCreator(pHash['p1']),
 P2: pButtonCreator(pHash['p2']),
 P3: pButtonCreator(pHash['p3']),
 P4: pButtonCreator(pHash['p4']),
 P5: pButtonCreator(pHash['p5']),
 P6: pButtonCreator(pHash['p6'])
}

简单来说就是给选中的文字加一些 class (上面是 fs-xx 之类的),其中需要引一个鼠标选中的库 rangy,挺烦人的也是,然后在 text-editor 中这样用:

先实例化

import ButtonBuilder from './buttonBuilder'
var editorOptions = {
 toolbar: {
  buttons: ['bold', 'italic', 'underline', 'removeFormat', 'p3', 'p4', 'p5', 'p6']
 },
 buttonLabels: 'fontawesome', // use font-awesome icons for other buttons
 extensions: {
  p3: new ButtonBuilder.P3(),
  p4: new ButtonBuilder.P4(),
  p5: new ButtonBuilder.P5(),
  p6: new ButtonBuilder.P6()
 },
 placeholder: false
}

再放到 editor 上

复制代码 代码如下:
this.editor = new MediumEditor(this.$el, Object.assign({}, editorOptions, this.options))

当然上面实例化的步骤不一定要写到这个组件里面,配置 options 也可以从组件外传入

0x04 细节和坑

1、这里用到了 v-model 的自定义实现,详见官方文档:v-model

简单来说呢就是 props: value ,和 this.$emit('input', model) 就可以实现在组件中模拟 v-model 啦

2、多个 editor 使用的自定义button 实例的问题。由于我自己应用的时候有两个挨着的 <text-editor>,用的上面的代码会导致两个 editor 实例用的是同一个 button 实例,这会导致一个很严重的问题:即编辑下面编辑器的内容,可能会修改的上面的编辑器!!

要解决这个也很简单,修改这一行:

复制代码 代码如下:
this.editor = new MediumEditor(this.$el, Object.assign({}, _.cloneDeep(editorOptions), this.options))

将自定义的 options 深复制一下,这里借助了 lodash 的函数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Vue集成Medium  # Editor  # Vue  # Medium  # vue项目中应用ueditor自定义上传按钮功能  # Vue写一个简单的倒计时按钮功能  # vue实现验证码按钮倒计时功能  # vue 开发一个按钮组件的示例代码  # Vue.js 点击按钮显示/隐藏内容的实例代码  # Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题  # 详解vue + vuex + directives实现权限按钮的思路  # Vue.js实现按钮的动态绑定效果及实现代码  # vue组件中点击按钮后修改输入框的状态实例代码  # 使用vue实现点击按钮滑出面板的实现代码  # Vue波纹按钮组件制作  # 自定义  # 是一个  # 编辑器  # 很简单  # 就可以  # 的是  # 文档  # 也不  # 会有  # 就在  # 鼠标  # 弹出式  # 多个  # 我只  # 这么多  # 也很  # 看了看  # 少了  # 较多  # 用过 


相关文章: 一键网站制作软件,义乌购一件代发流程?  青岛网站建设如何选择本地服务器?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  如何通过VPS建站无需域名直接访问?  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何快速生成ASP一键建站模板并优化安全性?  如何快速登录WAP自助建站平台?  制作网站的基本流程,设计网站的软件是什么?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  广德云建站网站建设方案与建站流程优化指南  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  开封网站制作公司,网络用语开封是什么意思?  建站之星上传入口如何快速找到?  制作旅游网站html,怎样注册旅游网站?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何选择域名并搭建高效网站?  制作宣传网站的软件,小红书可以宣传网站吗?  如何用PHP工具快速搭建高效网站?  建站之星代理费用多少?最新价格详情介绍  如何彻底删除建站之星生成的Banner?  ,巨量百应是干嘛的?  网站企业制作流程,用什么语言做企业网站比较好?  南宁网站建设制作定制,南宁网站建设可以定制吗?  ,交易猫的商品怎么发布到网站上去?  C#如何序列化对象为XML XmlSerializer用法  公司网站设计制作厂家,怎么创建自己的一个网站?  常州企业网站制作公司,全国继续教育网怎么登录?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  小程序网站制作需要准备什么资料,如何制作小程序?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  网站制作模板下载什么软件,ppt模板免费下载网站?  实现虚拟支付需哪些建站技术支撑?  建站之星安装需要哪些步骤及注意事项?  制作网站公司那家好,网络公司是做什么的?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  建站之星安装步骤有哪些常见问题?  Swift开发中switch语句值绑定模式  如何高效利用亚马逊云主机搭建企业网站?  北京网站制作网页,网站升级改版需要多久?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  如何选择CMS系统实现快速建站与SEO优化?  h5在线制作网站电脑版下载,h5网页制作软件?  如何选择建站程序?包含哪些必备功能与类型?  公司网站的制作公司,企业网站制作基本流程有哪些?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  活动邀请函制作网站有哪些,活动邀请函文案? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。