最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue-quill-editor二次封裝,實(shí)現(xiàn)自定義文件上傳方式

 更新時(shí)間:2024年03月07日 09:24:06   作者:jsmeng626  
這篇文章主要介紹了vue-quill-editor二次封裝,實(shí)現(xiàn)自定義文件上傳方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

實(shí)現(xiàn)步驟

  • 先將vue-quill-editor組件引入進(jìn)來(lái),自定義配置,在自定義配置中添加upload操作,但是由于vue-quill-editor組件不支持文件上傳,該操作是無(wú)效的,邏輯需要自己去實(shí)現(xiàn)
  • 給添加的upload按鈕自定義css樣式,文件上傳的圖標(biāo),大小等
  • 模擬upload點(diǎn)擊事件,在editor的配置中,有一個(gè)handler對(duì)象,來(lái)處理自定義的upload點(diǎn)擊
  • 點(diǎn)擊之后我們?nèi)プ屗|發(fā)element-ui中的文件上傳組件的上傳操作,所以我們將el-upload組件放在頁(yè)面上,然后用css隱藏起來(lái),在點(diǎn)擊富文本中upload圖標(biāo)時(shí),來(lái)模擬點(diǎn)擊el-upload,彈出上傳文件操作框
  • 然后自定義el-upload的上傳方法,在上傳后的回調(diào)中去調(diào)用自己的接口,拿到一個(gè)文件路徑字符串
  • 再將這個(gè)字符串通過(guò)quill對(duì)象插入到富文本中,也就是vue-quill-editor組件依賴(lài)的父對(duì)象,摻入a鏈接是通過(guò)繼承父類(lèi)中的create方法來(lái)實(shí)現(xiàn)
  • 其他不明白的可以看代碼中的注釋

完整代碼

1、quill-editor-upload自定義組件

<template>
  <div>
    <quill-editor ref="quillEditor" :options="editorOption" :content="content" @change="onEditorChange($event)"
      @blur="$emit('blur')"></quill-editor>
    <!-- 隱藏的upload -->
    <el-upload class="uploadFile" drag action="#" :http-request="uploadFile" :limit="1" :on-exceed="handleExceed"
      :on-remove="handleRemove" :file-list="fileList">
      <i class="el-icon-upload"></i>
      <div class="el-upload__text">
        將文件拖到此處,或<em>點(diǎn)擊上傳</em>
      </div>
    </el-upload>
  </div>
</template>
<script>
import Quill from 'quill';
import { quillEditor } from "vue-quill-editor";
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";
import { editorUploadPath } from "@/api/excel/excel.js";
 
// 工具欄配置
const toolbarOptions = [
  ['bold', 'italic', 'underline', 'strike'],        // toggled buttons
  ['blockquote', 'code-block'],
 
  [{ 'header': 1 }, { 'header': 2 }],               // custom button values
  [{ 'list': 'ordered' }, { 'list': 'bullet' }],
  [{ 'script': 'sub' }, { 'script': 'super' }],      // superscript/subscript
  [{ 'indent': '-1' }, { 'indent': '+1' }],          // outdent/indent
  [{ 'direction': 'rtl' }],                         // text direction
 
  [{ 'size': ['small', false, 'large', 'huge'] }],  // custom dropdown
  [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
 
  [{ 'color': [] }, { 'background': [] }],          // dropdown with defaults from theme
  [{ 'font': [] }],
  [{ 'align': [] }],
  ['link', 'image', 'video', 'upload'],
  ['clean']                                         // remove formatting button
]
 
// 自定義插入a鏈接
var Link = Quill.import('formats/link');
class FileBlot extends Link {  // 繼承Link Blot
  static create(value) {
    let node = undefined
    if (value && !value.href) {  // 適應(yīng)原本的Link Blot
      node = super.create(value);
    }
    else {  // 自定義Link Blot
      node = super.create(value.href);
      node.setAttribute('download', value.innerText);  // 左鍵點(diǎn)擊即下載
      node.innerText = value.innerText;
      node.download = value.innerText;
    }
    return node;
  }
}
FileBlot.blotName = 'link';
FileBlot.tagName = 'A';
Quill.register(FileBlot);
 
export default {
  name: "quill-editor-upload",
  components: { quillEditor },
  // 自定義v-model,prop為props中的屬性,代表v-model傳入的值;event表示反向輸出給v-model的事件名
  model: {
    prop: 'content',
    event: 'changeContent'
  },
  // 自定義v-model, v-model傳入的值
  props: {
    content: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      fileList: [], // 文件列表
      // editor配置
      editorOption: {
        placeholder: '請(qǐng)輸入正文......',
        modules: {
          toolbar: {
            container: toolbarOptions,  // 工具欄
            handlers: {
              // 模擬upload按鈕點(diǎn)擊事件
              'upload': (value => {
                if (value) {
                  document.querySelector('.uploadFile input').click()
                }
              })
            }
          }
        }
      }
    }
  },
  methods: {
    // 自定義v-model,將editor選擇器change事件提供的html傳出去
    onEditorChange(e) {
      this.$emit('changeContent', e.html)
    },
    // 自定義文件上傳
    uploadFile(res) {
      // console.log('上傳成功', res);
      let myFormData = new FormData();
      myFormData.append("file", res.file);
      editorUploadPath(myFormData).then((response) => {
        if (response.code === 0) {
          let fileNameLength = res.file.name.length
          // 插入鏈接
          let quill = this.$refs.quillEditor.quill
          let length = quill.getSelection().index;
          quill.insertEmbed(length, 'link', { href: response.msg, innerText: res.file.name }, "api")
          quill.setSelection(length + fileNameLength)
          this.fileList = []
        }
      });
    },
    // 文件超出限制提示
    handleExceed() {
      this.$message.warning(`當(dāng)前限制選擇 1 個(gè)文件,請(qǐng)刪除后更新!`);
    },
    // 移除文件
    handleRemove() {
      this.fileList = [];
    },
  }
}
</script>
<style scoped>
/* 文件上傳圖標(biāo)樣式 */
/deep/ .quill-editor .ql-snow.ql-toolbar .ql-formats .ql-upload {
  background: url("../assets/file.png");
  background-size: 16px 16px;
  background-position: center center;
  background-repeat: no-repeat;
}
 
/* 隱藏upload上傳,用模擬事件觸發(fā) */
.uploadFile {
  width: 0;
  height: 0;
  display: none;
}
</style>

2、使用該組件

<el-form-item label="內(nèi)容" prop="content">
    <quillEditorUpload v-model="form.content"></quillEditorUpload>
</el-form-item>

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue3使用h函數(shù)封裝組件和$attrs和props的區(qū)別詳解

    vue3使用h函數(shù)封裝組件和$attrs和props的區(qū)別詳解

    這篇文章主要為大家詳細(xì)介紹了vue3使用h函數(shù)封裝組件和$attrs和props的區(qū)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-10-10
  • Vue3本地環(huán)境Vite與生產(chǎn)環(huán)境Nginx反向代理配置的方法匯總

    Vue3本地環(huán)境Vite與生產(chǎn)環(huán)境Nginx反向代理配置的方法匯總

    在前后端分離架構(gòu)中,前端訪(fǎng)問(wèn)后端資源的反向代理配置是一個(gè)常見(jiàn)且容易踩坑的問(wèn)題,最近在開(kāi)發(fā)一個(gè)?Vue3?+?.NET8?的項(xiàng)目時(shí),我就遇到了開(kāi)發(fā)環(huán)境配置正常,但部署到生產(chǎn)環(huán)境后圖片無(wú)法訪(fǎng)問(wèn)的問(wèn)題,本文將詳細(xì)記錄這個(gè)問(wèn)題的解決過(guò)程,需要的朋友可以參考下
    2025-05-05
  • vue制作點(diǎn)擊切換圖片效果的詳細(xì)思路與步驟

    vue制作點(diǎn)擊切換圖片效果的詳細(xì)思路與步驟

    這篇文章主要給大家介紹了關(guān)于vue制作點(diǎn)擊切換圖片效果的詳細(xì)思路與步驟,圖片切換是一個(gè)很經(jīng)典的Vue入門(mén)學(xué)習(xí)案例,在你學(xué)習(xí)完一些基本的v-指令后,你可以嘗試去寫(xiě)一個(gè)簡(jiǎn)單的demo去鞏固和熟悉這些指令的使用方法,需要的朋友可以參考下
    2023-11-11
  • VUE事件處理之@click用法示例代碼

    VUE事件處理之@click用法示例代碼

    在Vue進(jìn)行前端開(kāi)發(fā)中事件處理是必不可少的功能,下面這篇文章主要給大家介紹了關(guān)于VUE事件處理之@click用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 在vue2.x里面簡(jiǎn)單使用socketio問(wèn)題

    在vue2.x里面簡(jiǎn)單使用socketio問(wèn)題

    這篇文章主要介紹了在vue2.x里面簡(jiǎn)單使用socketio問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue實(shí)現(xiàn)拖拽排序效果

    vue實(shí)現(xiàn)拖拽排序效果

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)拖拽排序效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • vue基于input實(shí)現(xiàn)密碼的顯示與隱藏功能

    vue基于input實(shí)現(xiàn)密碼的顯示與隱藏功能

    這篇文章主要介紹了vue基于input實(shí)現(xiàn)密碼的顯示與隱藏功能,文末給大家介紹了vue?如何實(shí)現(xiàn)切換密碼的顯示與隱藏效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • vue3如何優(yōu)雅的實(shí)現(xiàn)移動(dòng)端登錄注冊(cè)模塊

    vue3如何優(yōu)雅的實(shí)現(xiàn)移動(dòng)端登錄注冊(cè)模塊

    這篇文章主要給大家介紹了關(guān)于vue3如何優(yōu)雅的實(shí)現(xiàn)移動(dòng)端登錄注冊(cè)模塊的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 使用Vue3+PDF.js實(shí)現(xiàn)PDF預(yù)覽功能

    使用Vue3+PDF.js實(shí)現(xiàn)PDF預(yù)覽功能

    項(xiàng)目中有一個(gè)需要預(yù)覽下載pdf的需求,網(wǎng)上找了很久,決定使用 pdf.js 完成,下面這篇文章主要給大家介紹了關(guān)于使用Vue3+PDF.js實(shí)現(xiàn)PDF預(yù)覽功能的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • vue頁(yè)面批量引入組件的操作代碼

    vue頁(yè)面批量引入組件的操作代碼

    這篇文章主要介紹了vue頁(yè)面批量引入組件,本文結(jié)合示例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12

最新評(píng)論

昌都县| 临城县| 盈江县| 广宗县| 罗城| 钟山县| 庆元县| 当雄县| 布尔津县| 潜山县| 尉氏县| 西乌珠穆沁旗| 新宁县| 西充县| 盐池县| 讷河市| 含山县| 连州市| 东乌| 林甸县| 潞城市| 芷江| 南通市| 马边| 盘锦市| 东乡族自治县| 巴彦县| 墨玉县| 迭部县| 双流县| 浦江县| 佛坪县| 边坝县| 盘山县| 壤塘县| 汪清县| 渝北区| 浦县| 修武县| 会理县| 阳原县|