日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2025/3/20 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于nuxt和iview搭建OM后台管理系统实践(2)-quill富文本组件的封装 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄結構

這是《基于nuxt和iview搭建OM后臺管理系統實踐》這一個系列文章的目錄,大致思路如下:

  • 簡要介紹OM后臺管理系統,以及開發環境
  • 自行開發的公共組件(富文本、地圖、上傳)介紹
  • 項目上線流程,自動化打包(Jenkins)
  • 項目總結

前言

上一篇簡要介紹了一下這個項目的項目背景,從這一篇開始我會寫開發公共組件的過程,這一篇講解一下富文本編輯器quill的集成吧。

少廢話,看東西

如動圖所示,為后臺管理系統添加內容的功能頁面,可以看到已經集成了上傳圖片組件和富文本編輯器組件。

富文本編輯器

這個富文本集成了quill這個開源庫 [[quill中文文檔]](https://github.com/BingKui/Qu...。在vue-cli構建的項目中直接引用quill的包一點問題都沒有,但是我用的nuxt.js是基于服務端渲染的,多數情況下會報下面這個錯誤:

window is not defined

這是因為window對象只存在于瀏覽器端,服務端渲染的時候是不存在window對象的。那么我應該怎么做呢??

我還是直接上代碼吧:

  • 第一步在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) }
  • 第二步以插件形式配置quill
//文件nuxt.config.js,省略其他代碼 plugins: ['~plugins/iview-ui','~plugins/qs','~plugins/urlencode',{src: '~plugins/nuxt-quill-plugin.js',ssr: false} ],
  • 第三步開始封裝組件
//文件 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 optionsmodules: {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>

封裝組件需要注意的幾個點:

  • 在組件頁面(head方法)引用css樣式,不要全局引用,head方法的配置具體參考nuxt官方文檔,這里不做過多贅述
<script> export default {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"}]};}, } </script>
  • 為了保持代碼的簡介,我這里把quill工具欄的配置文件放到了config/index.js文件里了
// 文件config/index.js/*** @description 富文本編輯器quill的配置文件* @argument 參考文檔https://sheweifan.github.io/2018/01/07/nuxt-quill-qiniu/* @argument quill中文文檔https://github.com/BingKui/QuillChineseDoc/blob/master/SUMMARY.md*/ export const quillEditorConfig = {toolbarOptions:[["bold", "italic", "underline", "strike"], // 切換按鈕["blockquote", "code-block"],// [{ header: 1 }, { header: 2 }], // 用戶自定義按鈕值[{ list: "ordered" }, { list: "bullet" }],[{ script: "sub" }, { script: "super" }], // 上標/下標[{ indent: "-1" }, { indent: "+1" }], // 減少縮進/縮進[{ direction: "rtl" }], // 文本下劃線[{ size: ["small", false, "large", "huge"] }], // 用戶自定義下拉[{ header: [1, 2, 3, 4, 5, 6, false] }],[{ color: [] }, { background: [] }], // 主題默認下拉,使用主題提供的值[{ font: [] }],[{ align: [] }],['image'],//上傳圖片['video'],//視頻["clean"] // 清除格式] }
  • 組件原生圖片上傳是直接把圖片處理成base64位的存儲,我這里為了存儲方便,會把圖片上傳到七牛上,這里也遇到了一點小坑。首先要禁用quill內部上傳圖片方法,然后用一個隱藏的input[type=file]實現選擇圖片,然后模擬七牛表單提交不刷新的操作,最終實現圖片上傳七牛(還得在前端應用一個庫生成token),以上完整代碼里有呈現。

  • 編輯時需要傳遞content到子組件我這里用的ref
// 父組件 <template><div class="body"><full-editorref="myFullEditor"v-model="formItem.body"@editorContent="editorContent"></full-editor></div> </template> <script> const fullEditor = () => import("@/components/full-editor"); export default {layout: "nav",components: {fullEditor},mounted() {this.loadData();//加載數據this.$refs.myFullEditor.content = this.body;//父組件給富文本編輯器傳遞值} } </script>

總結

封裝一個富文本組件,開始做之前以為會蠻容易的,以為就引用一下就就可以了,沒想到會遇到以上的那些坑,最終在百度和翻閱github后很好的解決了問題,最終也封裝完成也滿足了需求,后續我會找個時間剔除一些業務代碼把組件放到github上。

總結

以上是生活随笔為你收集整理的基于nuxt和iview搭建OM后台管理系统实践(2)-quill富文本组件的封装的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区二区在线 | 永久看看免费大片 | 六月婷婷激情网 | 中文在线а√天堂官网 | 奇米影视999 | 久久免费资源 | 日本大片黄 | 欧美在线一区二区三区四区 | 伊伊综合网 | 伊人情人综合网 | 色片在线免费观看 | 国产又粗又硬 | 一区久久久 | 玖玖玖国产精品 | 日本少妇色 | 法国空姐电影在线 | 中文无码精品一区二区三区 | 99久久久无码国产精品6 | 香蕉视频网页 | 性生交大片免费看l | 久久潮| jizz一区二区三区 | 中文字幕免费在线看线人 | 国产不卡一区二区视频 | 成年人一级片 | 黄网站色 | 少妇做爰免费理伦电影 | 免费黄av | 国产精品福利一区二区 | 天天天色综合 | 天天干天天操天天摸 | 蜜桃视频在线网站 | 国产农村妇女精品久久久 | 欧美日韩国产成人精品 | 国产113页| 不卡日本视频 | 亚洲国产片 | 亚洲成人av综合 | 91一区| 9.1成人免费看片 | 中文字幕乱码视频 | 无码一区二区三区 | 欧美极品在线观看 | 黄色污污视频 | 欧美日韩一区在线播放 | 久久精品国内 | 在线观看亚洲大片短视频 | 免费成人深夜 | 97爱爱视频 | 蜜臀av午夜精品 | 97超碰免费在线 | 欧美区在线 | 国产在线观看无码免费视频 | 日本一二三不卡视频 | 法国空姐在线观看完整版 | 麻豆传媒网站 | 人人爱人人射 | 完全免费在线视频 | 亚洲九九夜夜 | 亚欧中文字幕 | 日本公妇乱偷中文字幕 | 福利片在线观看 | 成人在线观看黄色 | 久久久久成人精品 | 日韩第八页 | 日日射夜夜操 | avav亚洲| 久久综合在线 | 亚洲深夜av | 成人免费观看a | 久久国产精品国产精品 | 欧美国产日韩在线观看 | 91sex国产| 久久婷婷激情 | 国产无码久久精品 | av手机免费看| 亚洲精品久久夜色撩人男男小说 | 成人在线播放av | 蜜臀国产AV天堂久久无码蜜臀 | 欧美 日韩 国产一区 | 免费一级肉体全黄毛片 | 天堂va蜜桃 | 福利视频在线免费观看 | 野外做受又硬又粗又大视频√ | 欧美亚洲综合在线 | 国产强伦人妻毛片 | 九色.com | 欧美首页| 国产人妻精品午夜福利免费 | 欧洲人妻丰满av无码久久不卡 | k8yy毛片| 国产精品久久久久久久久毛片 | 国产人久久人人人人爽 | 亚洲青涩 | 色人阁五月 | 亚洲色图制服丝袜 | 三级av在线免费观看 | 欧美黄色a级大片 | 国产精品极品白嫩在线 |