詳解vue如何封裝封裝一個上傳多張圖片的組件
上傳圖片不管是后臺還是前端小程序,上傳圖片都是一個比不可少的功能有時候需要好幾個頁面都要上傳圖片,每個頁面都寫一個非常不方便,這時候就沒有封裝起來用的方便。跟上我的步伐帶你了解如何封裝
首先:創(chuàng)建一個文件夾在components目錄下創(chuàng)建一個為UploadImage的文件夾,UploadImage文件夾下創(chuàng)建個文件我這里用index命名了。

在UploadImage的index文件中:
<template>
<el-upload
v-model:file-list="upload.fileList"
:action="upload.action"
list-type="picture-card"
:before-upload="upload.before"
:on-success="upload.success"
:on-preview="upload.proview"
:data-fileListCount="upload.fileList.length"
:name="upload.name"
:on-remove="upload.remove"
:limit="upload.limit"
:on-exceed="upload.exceed"
class="UploadFile"
data-cardSize="75px"
>
<el-icon>
<Plus />
</el-icon>
</el-upload>
<el-image-viewer
:url-list="upload.fileList.map((item) => item.url)"
v-if="upload.dialogVisible"
:initial-index="upload.index"
@close="upload.dialogVisible = false"
teleported
/>
</template>
<script setup>
import { reactive, watch } from 'vue';
import { Plus } from '@element-plus/icons-vue';
import { ElMessage } from 'element-plus';
const props = defineProps({
imageList: String,
baseUrl: String,
limit: Number,
});
const { baseUrl } = { baseUrl: `http://sk.yyds.blue` } || {
baseUrl: props.baseUrl,
};
watch(
() => props.imageList,
(imageList) => {
upload.fileList = imageList
? imageList.split(`,`).map((item) => {
return {
url: baseUrl + item,
};
})
: [];
console.log(upload.fileList);
}
);
const emit = defineEmits(['getImageUrl']);
const upload = reactive({
limit: props.limit || 4,
name: 'file',
action: '/api/common/upload',
fileList: props.imageList
? props.imageList.split(`,`).map((item) => {
return {
url: baseUrl + item,
};
})
: [],
dialogVisible: false,
index: 0,
exceed: () => {
ElMessage({ type: 'warning', message: `最多上傳${upload.limit}張圖片` });
},
before: (file) => {
const type = ['image/png', 'image/jpeg', 'image/gif'];
if (!type.includes(file.type)) {
ElMessage.error('不支持該類型文件');
return false;
}
},
proview: (file) => {
const { url } = file;
upload.index = upload.fileList.findIndex((item) => item.url === url);
upload.dialogVisible = true;
},
success: (res, uploadFile, uploadFiles) => {
// console.log(uploadFiles);
let imageList = uploadFiles
.map((item) => {
return {
url:
item.response && item.status === `success`
? item.response.data.url
: item.url.split(baseUrl)[1],
};
})
.map((item) => item.url)
.join(',');
emit('getImageUrl', imageList);
ElMessage({ type: res.code === 1 ? `success` : 'warning', message: res.msg });
},
remove: (file, files) => {
console.log(files);
let imageList = files
.map((item) => {
return {
url:
item.response && item.status === `success`
? item.response.data.url
: item.url.split(baseUrl)[1],
};
})
.map((item) => item.url)
.join(',');
emit('getImageUrl', imageList);
},
handleClickPreview: () => {
console.log(1);
},
});
</script>
<style lang="scss">
// [data-fileListCount='5'] {
// .el-upload--picture-card {
// display: none !important;
// }
// }
.UploadFile {
display: flex;
align-items: center;
.el-upload-list--picture-card {
// --el-upload-list-picture-card-size: 70px !important;
.el-upload-list__item {
margin-top: 0;
margin-bottom: 0;
}
}
.el-upload--picture-card {
// --el-upload-picture-card-size: 70px !important;
}
.el-upload-dragger {
height: 100%;
display: grid;
place-content: center;
}
}
</style>需要上傳圖片的頁面:
<template>
<div class="name_inpasd"
><b>商品輪播:</b>
<div class="asdasd">
<UploadImage
@getImageUrl="
(fileList) => {
avatar = fileList;
}
"
:limit="2"
:imageList="avatar"
/>
</div>
</div>
</template>
<script setup>
import UploadImage from '../../components/UploadImage/index.vue'; //引入創(chuàng)建的組件
const avatar = ref(``); //'/uploads/...png,/uploads/...jpg'
console.log(avatar);
</script>打印console.log(avatar);可以直接拿到圖片路徑。由于圖片是上傳到我的服務(wù)器了所以拿過來的路徑直接就是網(wǎng)絡(luò)路徑。
到此這篇關(guān)于詳解vue如何封裝封裝一個上傳多張圖片的組件的文章就介紹到這了,更多相關(guān)vue封裝上傳圖片組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node+vue前后端分離實現(xiàn)登錄時使用圖片驗證碼功能
這篇文章主要介紹了node+vue前后端分離實現(xiàn)登錄時使用圖片驗證碼,記錄前端使用驗證碼登錄的過程,后端用的是node.js,關(guān)鍵模塊是svg-captcha,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-11-11
Vue3+TypeScript+printjs實現(xiàn)標(biāo)簽批量打印功能的完整過程
最近在做vue項目時使用到了print-js打印,這里給大家分享下,這篇文章主要給大家介紹了關(guān)于Vue3+TypeScript+printjs實現(xiàn)標(biāo)簽批量打印功能的完整過程,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-09-09
基于vue-upload-component封裝一個圖片上傳組件的示例
這篇文章主要介紹了基于vue-upload-component封裝一個圖片上傳組件的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
vue3+typescript實現(xiàn)圖片懶加載插件
這篇文章主要介紹了vue3+typescript實現(xiàn)圖片懶加載插件,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下2020-10-10
vue3中遇到reactive響應(yīng)式失效的問題記錄
這篇文章主要介紹了vue3中遇到reactive響應(yīng)式失效的問題記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06

