vxe-pc-ui
Version:
A vue based PC component library
112 lines (111 loc) • 3.98 kB
JavaScript
import { defineComponent, computed, h, provide } from 'vue';
import { getConfig, createEvent, useSize } from '@vxe-ui/core';
import { openPreviewImage } from './util';
import XEUtils from 'xe-utils';
import VxeImageComponent from './image';
export default defineComponent({
name: 'VxeImageGroup',
props: {
urlList: [Array, String],
showPreview: {
type: Boolean,
default: () => getConfig().imageGroup.showPreview
},
imageStyle: Object,
size: { type: String, default: () => getConfig().imageGroup.size || getConfig().size },
showPrintButton: {
type: Boolean,
default: () => getConfig().imageGroup.showPrintButton
},
showDownloadButton: {
type: Boolean,
default: () => getConfig().imageGroup.showDownloadButton
}
},
emits: [
'click'
],
setup(props, context) {
const { emit } = context;
const xID = XEUtils.uniqueId();
const { computeSize } = useSize(props);
const computeImgList = computed(() => {
const { urlList } = props;
if (urlList) {
return (XEUtils.isArray(urlList) ? urlList : [urlList]).map(item => {
if (XEUtils.isString(item)) {
return {
url: item,
alt: ''
};
}
return {
url: item.url,
alt: item.alt
};
});
}
return [];
});
const computeImgStyleOpts = computed(() => {
return Object.assign({}, getConfig().imageGroup.imageStyle, props.imageStyle);
});
const computeMaps = {
computeSize
};
const $xeImageGroup = {
xID,
props,
context,
getComputeMaps: () => computeMaps
};
const imageGroupMethods = {
dispatchEvent(type, params, evnt) {
emit(type, createEvent(evnt, { $imageGroup: $xeImageGroup }, params));
}
};
const imageGroupPrivateMethods = {
handleClickImgEvent(evnt, params) {
const { showPreview, showPrintButton, showDownloadButton } = props;
const { url } = params;
const imgList = computeImgList.value;
if (showPreview && url) {
openPreviewImage({
activeIndex: Math.max(0, XEUtils.findIndexOf(imgList, item => item.url === url)),
urlList: imgList,
showPrintButton,
showDownloadButton
});
}
imageGroupMethods.dispatchEvent('click', { url, urlList: imgList }, evnt);
}
};
Object.assign($xeImageGroup, imageGroupMethods, imageGroupPrivateMethods);
const renderVN = () => {
const imgList = computeImgList.value;
const vSize = computeSize.value;
const imgStyleOpts = computeImgStyleOpts.value;
return h('div', {
class: ['vxe-image-group', {
[`size--${vSize}`]: vSize
}]
}, imgList
? imgList.map((item, index) => {
return h(VxeImageComponent, {
key: index,
src: item.url,
alt: item.alt,
width: imgStyleOpts.width,
height: imgStyleOpts.height
});
})
: []);
};
$xeImageGroup.renderVN = renderVN;
provide('$xeImageGroup', $xeImageGroup);
return $xeImageGroup;
},
render() {
return this.renderVN();
}
});