123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- <template>
- <image
- v-if="!state.isError"
- class="su-img"
- :style="customStyle"
- :draggable="false"
- :mode="mode"
- :src="sheep.$url.cdn(src)"
- @tap="onImgPreview"
- @load="onImgLoad"
- @error="onImgError"
- ></image>
- </template>
- <script setup>
- /**
- * 图片组件
- *
- * @property {String} src - 图片地址
- * @property {Number} mode - 裁剪方式
- * @property {String} isPreview - 是否开启预览
- * @property {Number} previewList - 预览列表
- * @property {String} current - 预览首张下标
- *
- * @event {Function} load - 图片加载完毕触发
- * @event {Function} error - 图片加载错误触发
- *
- */
- import { reactive, computed } from 'vue';
- import sheep from '@/sheep';
- // 组件数据
- const state = reactive({
- isError: false,
- imgHeight: 600,
- });
- // 接收参数
- const props = defineProps({
- src: {
- type: String,
- default: '',
- },
- errorSrc: {
- type: String,
- default: '/static/img/shop/empty_network.png',
- },
- mode: {
- type: String,
- default: 'widthFix',
- },
- isPreview: {
- type: Boolean,
- default: false,
- },
- previewList: {
- type: Array,
- default() {
- return [];
- },
- },
- current: {
- type: Number,
- default: -1,
- },
- height: {
- type: Number,
- default: 0,
- },
- width: {
- type: Number,
- default: 0,
- },
- radius: {
- type: Number,
- default: 0,
- },
- });
- const emits = defineEmits(['load', 'error']);
- const customStyle = computed(() => {
- return {
- height: (props.height || state.imgHeight) + 'rpx',
- width: props.width ? props.width + 'rpx' : '100%',
- borderRadius: props.radius ? props.radius + 'rpx' : '',
- };
- });
- // 图片加载完成
- function onImgLoad(e) {
- if (props.height === 0) {
- state.imgHeight = (e.detail.height / e.detail.width) * 750;
- }
- }
- // 图片加载错误
- function onImgError(e) {
- state.isError = true;
- emits('error', e);
- }
- // 预览图片
- function onImgPreview() {
- if (!props.isPreview) return;
- uni.previewImage({
- urls: props.previewList.length < 1 ? [props.src] : props.previewList,
- current: props.current,
- longPressActions: {
- itemList: ['发送给朋友', '保存图片', '收藏'],
- success: function (data) {
- console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
- },
- fail: function (err) {
- console.log(err.errMsg);
- },
- },
- });
- }
- </script>
- <style lang="scss" scoped>
- .su-img {
- position: relative;
- width: 100%;
- height: 100%;
- display: block;
- }
- </style>
|