vue实现表格上传头像
Vue 实现表格上传头像
使用 Element UI 的 Upload 组件
在 Vue 项目中结合 Element UI 的 Upload 组件可以轻松实现表格内上传头像的功能。以下是一个完整的实现示例:
<template>
<el-table :data="tableData">
<el-table-column prop="name" label="姓名"></el-table-column>
<el-table-column prop="avatar" label="头像">
<template #default="{row}">
<el-upload
class="avatar-uploader"
action="/api/upload"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload">
<img v-if="row.avatar" :src="row.avatar" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</template>
</el-table-column>
</el-table>
</template>
<script>
export default {
data() {
return {
tableData: [
{ name: '张三', avatar: '' },
{ name: '李四', avatar: '' }
]
}
},
methods: {
handleAvatarSuccess(res, file, row) {
row.avatar = URL.createObjectURL(file.raw)
},
beforeAvatarUpload(file) {
const isImage = /\.(jpg|jpeg|png|gif)$/.test(file.name.toLowerCase())
const isLt2M = file.size / 1024 / 1024 < 2
if (!isImage) {
this.$message.error('只能上传图片!')
}
if (!isLt2M) {
this.$message.error('图片大小不能超过2MB!')
}
return isImage && isLt2M
}
}
}
</script>
<style>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 80px;
height: 80px;
line-height: 80px;
text-align: center;
}
.avatar {
width: 80px;
height: 80px;
display: block;
}
</style>
使用自定义上传逻辑
如果需要自定义上传逻辑而非使用 Element UI 的默认上传,可以修改如下:

methods: {
handleAvatarSuccess(res, file, row) {
// 自定义上传逻辑
const formData = new FormData()
formData.append('file', file.raw)
axios.post('/api/upload', formData).then(response => {
row.avatar = response.data.url
})
}
}
实现头像预览功能
在用户选择文件后立即显示预览效果:

methods: {
handleAvatarChange(file, row) {
const reader = new FileReader()
reader.onload = (e) => {
row.avatar = e.target.result
}
reader.readAsDataURL(file.raw)
}
}
响应式更新表格数据
确保上传头像后表格数据能及时更新:
methods: {
handleAvatarSuccess(res, file, row) {
this.$set(row, 'avatar', URL.createObjectURL(file.raw))
}
}
后端接口处理
后端需要提供相应的接口处理文件上传,例如使用 Node.js Express:
const express = require('express')
const multer = require('multer')
const upload = multer({ dest: 'uploads/' })
app.post('/api/upload', upload.single('file'), (req, res) => {
res.json({
url: `/uploads/${req.file.filename}`
})
})
以上实现方案可以根据具体项目需求进行调整和扩展。






