vue和element上傳圖片以及進(jìn)行拖拽圖片排序問題
需求場景
需求要求進(jìn)行上傳圖片的同時(shí)進(jìn)行排序,使用element的上傳圖片,拖拽使用的是vuedraggable的插件,記錄下
拖拽插件
插件中文翻譯git地址:https://github.com/itmier/Vue.Draggable,具體可去地址瀏覽
對vuedraggbale的插件進(jìn)行安裝使用:
- 1.安裝插件
npm i -S vuedraggable
- 2.局部引入插件(在.vue的文件中);
import draggable from 'uedraggbale' components: {draggable},
- 3.使用插件
//imgList:圖片的數(shù)據(jù)數(shù)組, <draggable v-model="imgList" :animation="1000"> <div v-for="item in imgList" :key="item.id">{{item.name}}</div> </draggable>
el-upload上傳文件組件
// 配合element的本身的樣式,不用寫樣式。全部代碼 <template> <div class='base-updata'> <div class="img-sort"> <ul class="el-upload-list el-upload-list--picture-card"> <draggable v-model="imgList" :animation="1000" :sort="true" v-if="showDraggable" > <li class="el-upload-list__item is-success animated" v-for="(item, index) in imgList" :key="index" style="margin-right:10px" > <img :src="item.url" alt="" class="el-upload-list__item is-success" > <!-- <i class="el-icon-close"></i> --> <span class="el-upload-list__item-actions"> <!-- 預(yù)覽 --> <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(item)" > <i class="el-icon-zoom-in"></i> </span> <!-- 刪除 --> <span class="el-upload-list__item-delete" @click="handleRemove(index)" v-if="!disabled"> <i class="el-icon-delete"></i> </span> </span> </li> </draggable> <template v-else> <li class="el-upload-list__item is-success animated" v-for="(item, index) in imgList" :key="index" style="margin-right:10px" > <img :src="item.url" alt="" class="el-upload-list__item is-success" > <i class="el-icon-close"></i> <span class="el-upload-list__item-actions"> <!-- 預(yù)覽 --> <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(item)" > <i class="el-icon-zoom-in"></i> </span> <!-- 刪除 --> <span class="el-upload-list__item-delete" @click="handleRemove(index)" v-if="!disabled" > <i class="el-icon-delete"></i> </span> </span> </li> </template> </ul> <el-upload style="display: inline-block" ref="uploadFilemain" :show-file-list="false" :file-list="imgList" list-type="picture-card" :before-upload="beforeUpload" :http-request="(file, fileList) => requestImgHttps(file)" :on-preview="handlePictureCardPreview" :limit="limit" :disabled="disabled" :class="imgList.length == limit ? 'mf' : ''" > <!-- :disabled="optType == 'detail'" --> <i class="el-icon-plus"></i> </el-upload> <span style="position: relative; top: 116px; left: 10px">{{ imgList.length }} <span v-if="limit !=100">{{"/" + limit}}</span> <span v-if="showDraggable">(拖拽排序)</span></span> </div> <!-- 圖片預(yù)覽 --> <el-dialog :visible.sync="dialogVisible"> <img width="100%" :src="dialogImageUrl" alt="" /> </el-dialog> </div> </template>
<script> import draggable from "vuedraggable"; export default { name: "base-updata", components: {draggable}, props: { //圖片列表 imgList: { type: Array, default: () => { return []; }, }, //是否顯示拖拽 showDraggable: { type: Boolean, default: () => { return false; }, }, //上傳圖片署名 imgTypeName: { type: String, Request: true, }, //上傳圖片下標(biāo) imgTypeIdex: { type: Number, Request: true, }, //圖片限制 limit: { type: Number, default: () => { return 100; }, }, //圖片禁止 disabled: { type: Boolean, default: () => { return false; }, }, }, data() { return { dialogVisible: false, //圖片預(yù)覽 }; }, created() {}, mounted() {}, methods: { //圖片上傳驗(yàn)證 beforeUpload(file) { return new Promise((resolve, reject) => { this.changeLimt(file).then((res) => { file.isFlag = res; if (file.isFlag) { return resolve(true); } else { return reject(false); } }); }); }, changeLimt(file) { const _this = this; const isSize = new Promise(function (resolve, reject) { const _URL = window.URL || window.webkitURL; const img = new Image(); img.src = _URL.createObjectURL(file); img.onload = function () { let e_width = img.width >= 600 && img.width <= 1200; let e_height = img.height >= 600 && img.height <= 1200; if (file.type == "image/png" || file.type == "image/jpg" || file.type == "image/jpeg") { const valid = e_width && e_height; if (valid) { return resolve(); } else { return reject(); } } else { return reject(); } }; }).then( () => { return true; }, () => { _this.$message.warning({ message: "圖片規(guī)格為jpg或png,建議形狀正方形,尺寸建議800*800像素,最大支持1200*1200像素", btn: false, }); return false; } ); return isSize; }, //預(yù)覽 handlePictureCardPreview(file) { this.dialogImageUrl = file.url; this.dialogVisible = true; }, //刪除 handleRemove(index) { this.$emit("handleRemove", this.imgTypeName, index); }, /** * 上傳圖片 請求 * @param {string} file 圖片文件 * @param {string} imgTypeName 圖片署名 * @param {string} imgTypeIdex 圖片位置下標(biāo) * @return {Function} 拋出函數(shù)requestImgHttps */ requestImgHttps(file) { this.$emit("requestImgHttps", file, this.imgTypeName, this.imgTypeIdex); }, }, }; </script>
<style lang='scss' scoped> .img-sort { display: flex; flex-wrap: wrap; } .mf { ::v-deep .el-upload--picture-card { display: none !important; } } </style>
使用組件
<el-form-item label="商品輪播圖:" prop="images_circulate" > <upload-img :imgList="formInfo.images_circulate" :limit="5" :showDraggable="true" :imgTypeName="`swiperImg`" @handleRemove="handleRemove" @requestImgHttps="requestImgHttps" :disabled="$route.query.type == 3?true:false" ></upload-img> </el-form-item> //圖片刪除 handleRemove(type, index) { switch (type) { //輪播圖刪除 case "swiperImg": this.formInfo.images_circulate.splice(index, 1); break; default: break; } }, //圖片上傳 requestImgHttps(file, key, index) { var formdata = new FormData(); formdata.append("img", file.file); switch (key) { case "mainImg": this.uploadFile(formdata).then((res) => { if (res.code == 200) { let ob = { name: "xxx.jpg", url: res.data }; this.formInfo.image_main.push(ob); } else { thi s.$message({ type: "warning", message: res.msg, }); } }); break; default: break; } },
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue如何通過router-link或者button跳轉(zhuǎn)到一個(gè)新的頁面
這篇文章主要介紹了vue如何通過router-link或者button跳轉(zhuǎn)到一個(gè)新的頁面,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue watch監(jiān)聽數(shù)據(jù)變化的案例詳解
監(jiān)聽數(shù)據(jù)變化,在Vue中是通過偵聽器來實(shí)現(xiàn)的,你也可以將它理解為監(jiān)聽器,時(shí)刻監(jiān)聽某個(gè)數(shù)據(jù)的變化,本文將通過代碼示例為大家詳細(xì)的介紹一下vue watch如何監(jiān)聽數(shù)據(jù)變化,需要的朋友可以參考下2023-07-07Vue中nprogress頁面加載進(jìn)度條的方法實(shí)現(xiàn)
這篇文章主要介紹了Vue中nprogress頁面加載進(jìn)度條的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11解決vue中菜單再次點(diǎn)擊內(nèi)容不刷新問題
當(dāng)elementUI中菜單打開后,再次點(diǎn)擊不會(huì)刷新的問題,導(dǎo)致菜單再次點(diǎn)擊不刷新的根本原因是頁面打開后,再次打開相同的頁面是不會(huì)刷新的,這應(yīng)該是框架的機(jī)制就是如此,小編整理了兩個(gè)比較不錯(cuò)的解決方法,需要的朋友可以參考下2023-08-08VUE中如何調(diào)用高德地圖獲取當(dāng)前位置(VUE2.0和3.0通用)
使用uniapp開發(fā)微信小程序時(shí),多多少少會(huì)遇到獲取當(dāng)前位置的詳細(xì)信息,下面這篇文章主要給大家介紹了關(guān)于VUE中如何調(diào)用高德地圖獲取當(dāng)前位置(VUE2.0和3.0通用)的相關(guān)資料,需要的朋友可以參考下2023-04-04如何基于uniapp開發(fā)android播放webrtc流詳解
這篇文章主要介紹了在uniapp中播放RTSP和WebRTC協(xié)議流的區(qū)別,以及如何封裝WebrtcVideo組件和音視頻實(shí)時(shí)通訊的實(shí)現(xiàn),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02Vue2/3?登錄后用戶無操作半小時(shí)后自動(dòng)清除登錄信息退出登錄下線(示例代碼)
這篇文章主要介紹了Vue2/3?登錄后用戶無操作半小時(shí)后自動(dòng)清除登錄信息退出登錄下線,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07