vue和element上傳圖片以及進(jìn)行拖拽圖片排序問題
需求場景
需求要求進(jìn)行上傳圖片的同時(shí)進(jìn)行排序,使用element的上傳圖片,拖拽使用的是vuedraggable的插件,記錄下
拖拽插件
插件中文翻譯git地址:https://github.com/itmier/Vue.Draggable,具體可去地址瀏覽
對(duì)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);
},
/**
* 上傳圖片 請(qǐng)求
* @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à)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
vue 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-07
Vue中nprogress頁面加載進(jìn)度條的方法實(shí)現(xiàn)
這篇文章主要介紹了Vue中nprogress頁面加載進(jìn)度條的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(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-08
VUE中如何調(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-02
Vue2/3?登錄后用戶無操作半小時(shí)后自動(dòng)清除登錄信息退出登錄下線(示例代碼)
這篇文章主要介紹了Vue2/3?登錄后用戶無操作半小時(shí)后自動(dòng)清除登錄信息退出登錄下線,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07

