[TOC]
多个位置都需要进⾏图⽚上传,可封装为组件便于复⽤。
class=“course-image”>
label=“课程封⾯”>
class=“avatar-uploader”
action=“https://jsonplaceholder.typicode.com/posts/“
:show-file-list=“false”
:on-success=“handleAvatarSuccess”
:before-upload=“beforeAvatarUpload”
:http-request=“handleUpload”
>
v-if=“course.courseListImg” :src=“course.courseListImg” class=“avatar”>
v-else class=“el-icon-plus avatar-uploader-icon”>
// 引⼊上传图⽚接⼝(⽗组件可以删除对应代码)
import { uploadCourseImage } from ‘@/services/course’
export default {
name: ‘CourseImage’,
methods: {
// ⽂件上传成功时的钩⼦
handleAvatarSuccess (res, file) {
// 保存预览图⽚地址
this.imageUrl = URL.createObjectURL(file.raw)
},
// 上传⽂件之前的钩⼦
beforeAvatarUpload (file) {
const isJPG = file.type === ‘image/jpeg’
const isLt2M = file.size / 1024 / 1024 < 2
if (!isJPG) {
this.$message.error(‘上传头像图⽚只能是 JPG 格式!’)
}
if (!isLt2M) {
this.$message.error(‘上传头像图⽚⼤⼩不能超过 2MB!’)
}
return isJPG && isLt2M
},
// ⾃定义⽂件上传操作
async handleUpload (options) {
// 创建 FormData 对象保存数据
const fd = new FormData()
// 添加数据的键要根据接⼝⽂档设置
fd.append(‘file’, options.file)
// 发送请求
const { data } = await uploadCourseImage(fd)
if (data.code === ‘000000’) {
// 图⽚预览为组件在 on-success 时设置的本地预览功能
// 默认2个上传功能都是检测 imgUrl,可分别设置(后续会封装功能,此处
不处理)
// before-upload ⽤于在上传⽂件前进⾏规则校验(例如⽂件格式与⼤⼩,
可⾃⾏调整)
// data.data.name 为服务器提供的地址
this.course.courseListImg = data.data.name
// 提示
this.$message.success(‘上传成功’)
}
}
}
}
引⼊到 create.vue 中
// create.vue
…
// 引⼊图⽚上传组件
import CourseImage from ‘./components/course-image’
export default {
name: ‘CourseCreate’,
components: {
CourseImage
},
…
使⽤组件⽅式:
⼦组件需要使⽤⽗组件中上传的⽂件数据进⾏上传与预览(⽗传⼦、传⼊)
⽗组件需要使⽤⼦组件上传后的线上地址⽤于提交(⼦传⽗、传出)
这时可以通过 v-model 对组件进⾏数据操作(v-model ⽤于组件操作的本质)给⼦组件传递 value 数据,⼦组件需要通过 props 接收。
默认监听⼦组件的 input 事件,⼦组件需要触发⾃定义事件并传值。
// create.vue …封装组件时,除了可以通过传值设置必选数据外,还可以通过传参增强组件的使⽤灵活性,这⾥演示通过传参定制上传⽂件⼤⼩。
// course-image.vue … props: { … // 限制上传⼤⼩ limit: { type: Number, default: 2 } }, … // 上传⽂件之前的钩⼦ beforeAvatarUpload (file) { … const isLt2M = file.size / 1024 / 1024 < this.limit if (!isJPG) { this.$message.error(‘上传头像图⽚只能是 JPG 格式!’) } if (!isLt2M) { this.$message.error(上传头像图⽚⼤⼩不能超过 ${</font><font style="color:rgb(215,58,73);">this</font><font style="color:rgb(89,89,89);">.</font><font style="color:rgb(0,92,197);">limit</font><font style="color:rgb(102,153,0);">}MB!
)
}
return isJPG && isLt2M
},
…