vue和element上傳圖片以及進(jìn)行拖拽圖片排序問(wèn)題
需求場(chǎng)景
需求要求進(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的本身的樣式,不用寫(xiě)樣式。全部代碼
<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實(shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)加載數(shù)據(jù)
在vuejs中,我們經(jīng)常使用axios來(lái)請(qǐng)求數(shù)據(jù),但是有時(shí)候,我們請(qǐng)求的數(shù)據(jù)量很大,那么我們?nèi)绾螌?shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)加載數(shù)據(jù)呢,接下來(lái)小編就給大家介紹一下在vuejs中如何實(shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)動(dòng)態(tài)加載數(shù)據(jù),需要的朋友可以參考下2023-10-10
vue開(kāi)發(fā)頁(yè)面自適應(yīng)屏幕尺寸的實(shí)例代碼
使用vue開(kāi)發(fā)的頁(yè)面都是通過(guò)px設(shè)置它的尺寸,如果換了一個(gè)不同尺寸的屏幕就會(huì)出現(xiàn)頁(yè)面排版錯(cuò)亂,顯示不完整等情況,下面通過(guò)插件將px裝換為rem單位適應(yīng)不同尺寸的屏幕,需要的朋友可以參考下2022-12-12
element tree懶加載:load="loadNode"只觸發(fā)一次的解決方案
本文主要介紹了element tree懶加載:load="loadNode"只觸發(fā)一次的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Vuex實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車(chē)
這篇文章主要為大家詳細(xì)介紹了Vuex實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車(chē),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
詳解vue中使用axios對(duì)同一個(gè)接口連續(xù)請(qǐng)求導(dǎo)致返回?cái)?shù)據(jù)混亂的問(wèn)題
這篇文章主要介紹了詳解vue中使用axios對(duì)同一個(gè)接口連續(xù)請(qǐng)求導(dǎo)致返回?cái)?shù)據(jù)混亂的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
vue.js源代碼core scedule.js學(xué)習(xí)筆記
這篇文章主要為大家詳細(xì)介紹了vue.js源代碼core scedule.js的學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
vue中echarts圖表大小適應(yīng)窗口大小且不需要刷新案例
這篇文章主要介紹了vue中echarts圖表大小適應(yīng)窗口大小且不需要刷新案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07

