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 相关文章推荐
document.designMode的功能与使用方法介绍
Nov 22 Javascript
c#+jquery实现获取radio和checkbox的值
Sep 12 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
Sep 08 Javascript
微信小程序 icon组件详细及实例代码
Oct 25 Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
Nov 10 Javascript
webpack4 css打包压缩问题的解决
May 18 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
Nov 28 Javascript
如何使用pm2快速将项目部署到远程服务器
Mar 12 Javascript
js tab栏切换代码实例解析
Sep 03 Javascript
JS实现点餐自动选择框(案例分析)
Dec 10 Javascript
react国际化react-intl的使用
May 06 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环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
javascript 二分法(数组array)
2010/04/24 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
js数组操作常用方法
2014/05/08 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
使用Vue实现简单计算器
2020/02/25 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
python中time.ctime()实例用法
2021/02/03 Python
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
html5用video标签流式加载的实现
2020/05/20 HTML / CSS
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
社区维稳工作方案
2014/06/06 职场文书
教师群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
天谕手游15杯全调酒配方和调酒券的获得方式
2022/04/06 其他游戏