<template> <u-popup v-model="show" mode="center" :maskCloseAble="false" :closeable="true" :maskCustomStyle="{ background: 'rgba(0, 0, 0, 0.5)' }" border-radius="18" :z-index="12" @close="onClose()"> <view class="pop-poster pop-example__container"> <view class="image__container" @click="handlePreviewImage()"> <image v-if="imageUrl" show-menu-by-longpress class="image" mode="scaleToFill" :src="imageUrl"></image> </view> <view class="save-btn__container"> <view class="save-btn" @click="handleDownload()">保存海报图</view> </view> </view> </u-popup> </template> <script> export default { name: 'goods-poster-popup', emits: ['update:modelValue'], props: { // 控制组件显示隐藏 modelValue: { Type: Boolean, default: false }, // 获取海报图的api方法 apiCall: { type: Function, default: () => {} }, // 获取海报图的api参数 apiParam: { type: Object, default: () => {} }, }, watch: { // 监听海报图弹层显示隐藏 modelValue: { immediate: true, handler(val) { val ? this.onShowPopup() : this.show = false } }, }, data() { return { // 是否显示弹窗 show: false, // 图片url地址 imageUrl: '' } }, methods: { // 显示海报弹窗 onShowPopup() { const app = this app.apiCall({ ...app.apiParam, channel: app.platform }) .then(result => { app.imageUrl = result.data.imageUrl app.show = true }) .catch(err => app.onClose()) }, // 关闭弹窗 onClose() { this.$emit('update:modelValue', false) }, // 预览图片 handlePreviewImage() { uni.previewImage({ urls: [this.imageUrl] }) }, // 保存海报图片 handleDownload() { const app = this uni.showLoading({ title: '加载中' }) // 下载海报图片 uni.downloadFile({ url: app.imageUrl, success(res) { console.log(res) uni.hideLoading() // 图片保存到相册 app.onSaveImage(res.tempFilePath) }, fail(res) { console.log('fail', res) uni.hideLoading() app.$toast('很抱歉,自动保存失败 请点击图片后长按手动保存', 3000) } }) }, // 图片保存到相册 onSaveImage(tempFilePath) { const app = this // #ifndef H5 uni.saveImageToPhotosAlbum({ filePath: tempFilePath, success(data) { app.$success('保存成功') // 关闭弹窗 app.onClose() }, fail(err) { if (err.errMsg === 'saveImageToPhotosAlbum:fail auth deny') { app.$toast('请允许访问相册后重试 (右上角菜单 - 设置 - 相册)', 3000) } } }) // #endif // #ifdef H5 const names = tempFilePath.split('/') const fileName = names[names.length - 1] app.fileDownLoadForH5({ name: fileName, blob: tempFilePath }) app.onClose() // #endif }, // 兼容H5端下载图片 // #ifdef H5 fileDownLoadForH5({ name, blob }) { const linkElement = document.createElement('a') linkElement.setAttribute('href', blob) linkElement.setAttribute('downLoad', name) linkElement.click() }, // #endif } } </script> <style lang="scss" scoped> .pop-poster { width: 560rpx; position: relative; background: #fff; padding: 76rpx 76rpx 40rpx 76rpx; border-radius: 10rpx; } // 图片容器 .image__container { .image { display: block; width: 420rpx; height: 636rpx; box-shadow: 0 0 25rpx rgba(0, 0, 0, 0.15); } } // 保存按钮 .save-btn__container { margin-top: 30rpx; .save-btn { color: rgb(255, 255, 255); color: $main-text; background: linear-gradient(to right, $main-bg, $main-bg2); font-weight: 500; font-size: 28rpx; border-radius: 38rpx; height: 76rpx; display: flex; justify-content: center; align-items: center; } } </style>