vue中利用simplemde实现markdown编辑器(增加图片上传功能)


Posted in Javascript onApril 29, 2019

前言

最近在搭个人博客网站,需要一个 markdown 编辑器,来进行博客的编写

看了网上的教程,决定使用 simplemde

以为可以直接能拿来用的

不过实际运用的时候发现还是有要完善的地方

比如令人头疼的图片上传

最终效果

 vue中利用simplemde实现markdown编辑器(增加图片上传功能)

安装及初始化

npm install simplemde --save

在html中加入一个textarea

<textarea id="simplemde"></textarea>

在vue的生命周期函数 mounted 中,添加 simplemde 的实例化

var simplemde = new SimpleMDE({
   el: document.getElementById(simplemde)
  })

el 通过dom指定为我们建立的textarea元素,如果省略,则会自动抓取html结构中的第一个textarea

绑定事件,使我们的内容数据始终与 simplemde 获取到的键入数据同步

simplemde.codemirror.on("change", () => {
   this.content = simplemde.value()
  })

上传图片

在原本的 simplemde 中

点击图片按钮的效果是这样的

vue中利用simplemde实现markdown编辑器(增加图片上传功能)

这是个啥??本地上传的选择框呢??

没办法,既然没有就只好自己做一个了

首先我们建立一个隐藏的 input

<input style="display:none" accept="image/gif,image/jpeg,image/jpg,image/png" type="file" id="upInput" ref="upInput">

接收图片格式的文件,点击即可弹出本地上传的文件选择框

之所以要隐藏,是因为我们并不想要这个按钮

我们还是想通过点击 simplemde 的图片按钮来上传

虽然人家没啥用,但好看呀

所以我们就把这个 input 给隐藏,只用一下它的 click 方法

这样我们点击图片按钮就相当于在点击这个 input

在 simplemde 的源码里,找到图片按钮调用的函数

把原来的都注释掉,加上这两句

vue中利用simplemde实现markdown编辑器(增加图片上传功能)

这样我们就可以调用本地上传的选择框了

vue中利用simplemde实现markdown编辑器(增加图片上传功能)

那么选择了图片之后,为了能即时预览

我们希望选择之后,就发到后端存储起来

在前端我们运用 axios + formdata 进行发送

var input = this.$refs.upInput
var formData = new FormData()
formData.append("i", input.files[0])
var config = {
   headers: {
    "Content-Type": "multipart/form-data"
   }
  }
this.$axios.post("/data/myupload", formData, config)

后端我是用的 node ,运用 multer 模块来接收

multer 是专门用来处理 mulipart/form-data 格式的数据的

var multer = require('multer')
    //定义存储器
  var storage = multer.diskStorage({
  //存储路径
  destination: function (req, file, cb) {
    cb(null, '../static/upload/')
  },
  //存储文件名
  filename: function (req, file, cb) {
    cb(null, `${Date.now()}-${file.originalname}`)
  }
  })
  //运用存储器
  var upload = multer({ storage: storage })

  // 接受单图的上传
  router.post('/data/myupload', upload.single('i'), function (req,  res, next) {
  //将存储后的文件名发还给前端
  res.send(req.file.filename)
  });

前端收到文件名后,将其跟存储路径打包写进文本框中

也就是之前点击图片按钮看到的那串字符

写入后就可预览

this.$axios.post("/data/myupload", formData, config).then((res)=> {
  var urlname=`![](/static/upload/${res.data})`
  simplemde.value(`${this.content}\n${urlname}\n`)
 })

看起来万事大吉了

但其实还漏了一点

那就是input的click()本身不是异步的,但是你选择图片需要时间,在这过程中后面的代码(即便是异步代码)都执行了一遍,也就是说现在写的这些发送存储都在选完图片之前就执行完了

为了在选择完图片之后再执行

我们新增一个监听事件,监听 input 的 change ,把之前的代码都丢到这里面来

var input = this.$refs.upInput
input.addEventListener("change", () => {
 var formData = new FormData()
 formData.append("i", input.files[0])
 var config = {
  headers: {
   "Content-Type": "multipart/form-data"
  }
 }
 this.$axios.post("/data/myupload", formData, config).then((res)=> {
  var urlname=`![](/static/upload/${res.data})`
  simplemde.value(`${this.content}\n${urlname}\n`)
 })
})

这样就实现了我们的图片上传效果

显示

比如通过编辑器,我们写了一篇博客,并存储进了后台

想在别的组件中把它调出来显示

也就是字符串转为html

只需要调用 simplemde 的原型链方法

this.contentMarkdown = SimpleMDE.prototype.markdown(content)

然后把数据放到v-html中

<div v-html="contentMarkdown"></div>

即可显示

再看一遍最终效果

vue中利用simplemde实现markdown编辑器(增加图片上传功能)

PS

还有一些可以完善的地方

比如直接拖拽图片进来,或者粘贴

后期有时间研究一下再加上

总结

以上所述是小编给大家介绍的vue中利用simplemde实现markdown编辑器(增加图片上传功能),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
用htc组件制作windows选项卡
Jan 13 Javascript
用javascript实现的仿Flash广告图片轮换效果
Apr 24 Javascript
javascript document.execCommand() 常用解析
Dec 14 Javascript
动态加载js的方法汇总
Feb 13 Javascript
javascript实现2016新年版日历
Jan 25 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
Aug 24 Javascript
jQuery滑动效果实现方法分析
Sep 05 jQuery
详解javascript replace高级用法
Feb 17 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
Mar 07 Javascript
javascript使用Blob对象实现的下载文件操作示例
Apr 18 Javascript
Vue作用域插槽实现方法及作用详解
Jul 08 Javascript
Ant-design-vue Table组件customRow属性的使用说明
Oct 28 Javascript
微信小程序调用微信支付接口的实现方法
Apr 29 #Javascript
vue实现微信分享链接添加动态参数的方法
Apr 29 #Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
Apr 29 #Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
Apr 28 #Javascript
详解vue 路由跳转四种方式 (带参数)
Apr 28 #Javascript
使用vue完成微信公众号网页小记(推荐)
Apr 28 #Javascript
详解VUE项目中安装和使用vant组件
Apr 28 #Javascript
You might like
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
分享3个php获取日历的函数
2015/09/25 PHP
javascript知识点收藏
2007/02/22 Javascript
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
python解析xml简单示例
2019/06/21 Python
python之拟合的实现
2019/07/19 Python
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
linux面试题参考答案(10)
2016/10/26 面试题
个人找工作求职简历的自我评价
2013/10/20 职场文书
电子商务专业学生的学习自我评价
2013/10/27 职场文书
财会自我鉴定范文
2013/12/27 职场文书
社区庆八一活动方案
2014/02/02 职场文书
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
2016国培学习心得体会
2016/01/08 职场文书