亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

基于nuxt和iview搭建OM后臺管理系統實踐(2)-quill富文本組件的封裝

基于nuxt和iview搭建OM后台管理系统实践(2)-quill富文本组件的封装

文章地址:愿爱无忧dk_---原文地址

目录结构

这是《基于nuxt和iview搭建OM后台管理系统实践》这一个系列文章的目录,大致思路如下:

前言

上一篇简要介绍了一下这个项目的项目背景,从这一篇开始我会写开发公共组件的过程,这一篇讲解一下富文本编辑器quill的集成吧。

少废话,看东西

如动图所示,为后台管理系统添加内容的功能页面,可以看到已经集成了上传图片组件和富文本编辑器组件。

富文本编辑器和上传组件的结合


富文本编辑器

这个富文本集成了quill这个开源库 [quill中文文档]。在vue-cli构建的项目中直接引用quill的包一点问题都没有,但是我用的nuxt.js是基于服务端渲染的,多数情况下会报下面这个错误:

window is not defined 复制代码

这是因为window对象只存在于浏览器端,服务端渲染的时候是不存在window对象的。那么我应该怎么做呢??


https://img1.sycdn.imooc.com//5b45ab450001b33009760357.jpg


我还是直接上代码吧:

  1. 第一步在plugins下新建quill插件文件nuxt-quill-plugins.js

// 文件plugins/nuxt-quill-plugins.js import Vue from 'vue' // import VueQuillEditor from 'vue-quill-editor' // Vue.use(VueQuillEditor) 直接引用会报错 if (process.browser) { //加一个浏览器端判断,只在浏览器端才渲染就不会报错了   const VueQuillEditor = require('vue-quill-editor/dist/ssr')   Vue.use(VueQuillEditor) } 复制代码
  1. 第二步以插件形式配置quill

//文件nuxt.config.js,省略其他代码 plugins: [     '~plugins/iview-ui',     '~plugins/qs',     '~plugins/urlencode',     {src: '~plugins/nuxt-quill-plugin.js',ssr: false} ], 复制代码
  1. 第三步开始封装组件

//文件 components/full-editor.vue <template>   <section class="container">     <!-- <form id="uploadForm"> -->     <input class="file" type="file" style="display:none" id="file" ref="input" @change="doUpload">     <!-- </form> -->     <div class="quill-editor"         ref="myQuillEditor"           :content="content"          @change="onEditorChange($event)"          @blur="onEditorBlur($event)"          @focus="onEditorFocus($event)"          @ready="onEditorReady($event)"          v-quill:myQuillEditor="editorOption">     </div>   </section> </template> <script> import {qiniuConfig,quillEditorConfig} from '~/config';//七牛上传和富文本toolbar配置文件 const QiniuUPToken = require('qiniu-uptoken');//前端生成七牛上传token import axios from '~/plugins/axios'; export default {   name: "full-editor",   head() {     return {       link: [         {           href: "/full-editor/quill.core.css",           rel: "stylesheet"         },         {           href: "/full-editor/quill.snow.css",           rel: "stylesheet"         },         {           href: "/full-editor/quill.bubble.css",           rel: "stylesheet"         }       ]     };   },   data() {     const self = this;     return {       content: "",       editorOption: {         // some quill options         modules: {           toolbar: {             container:quillEditorConfig.toolbarOptions,             handlers:{               'image':function(){                 // console.log(this)                 this.quill.format('image', false);//禁用quill内部上传图片方法                 self.imgHandler(this)               }             }           },         },         placeholder: '请输入信息',         theme: "snow",         quill:''       }     };   },   mounted() {     // console.log("app init");   },   methods: {     onEditorBlur(editor) {       // console.log("editor blur!", editor);     },     onEditorFocus(editor) {       // console.log("editor focus!", editor);     },     onEditorReady(editor) {       // console.log("editor ready!", editor);     },     onEditorChange({ editor, html, text }) {       // console.log("editor change!", editor, html, text);       this.content = html;       this.$emit('editorContent',html)       // console.log(this.content);     },     imgHandler(handle){       this.quill = handle.quill;       var inputfile = document.getElementById('file');       inputfile.click();     },     doUpload(){       let files = document.getElementById('file');       // console.log(files.files[0]);       let uptoken = QiniuUPToken(qiniuConfig.access_key,qiniuConfig.secret_key,qiniuConfig.bucketname)       // console.log(uptoken);          this.qiniuUpload(files.files[0],uptoken);     },     qiniuUpload(file, token){       let param = new FormData(); //创建form对象       param.append('file',file,file.name);//通过append向form对象添加数据       param.append('token',token);//添加form表单中其他数据       // console.log(param. `get('file')); //FormData私有类对象,访问不到,可以通过get判断值是否传进去       let config = {         headers:{'Content-Type':'multipart/form-data'}       }; //添加请求头       axios.post(qiniuConfig.action_url,param,config)       .then(res=>{         // console.log(res);         // console.log(this.quill);         let length = this.quill.getSelection().index;         const imgUrl = qiniuConfig.pic_hostname+res.key;//插入上传的图片         this.quill.insertEmbed(length, 'image', imgUrl);         // this.quill.insertEmbed(index, 'image', imgUrl);//插入上传的图片         // console.log(res.data);       })       .then((err)=>{         // console.log(err)       })     }   } }; </script> <style  scoped> .container {   width: 100%;   margin: 0 auto;   /* padding: 10px 0; */ } .quill-editor {   min-height: 200px;   max-height: 400px;   overflow-y: auto; } </style> 复制代码

封装组件需要注意的几个点:

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消