perf: 表格组件预览字段拆分

This commit is contained in:
kailong321200875 2024-01-06 15:38:53 +08:00
parent c2dde25229
commit 8c5858e2c5
5 changed files with 47 additions and 31 deletions

View File

@ -66,6 +66,7 @@ for (let i = 0; i < count; i++) {
importance: '@integer(1, 3)', importance: '@integer(1, 3)',
display_time: '@datetime', display_time: '@datetime',
pageviews: '@integer(300, 5000)', pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'),
children: [ children: [
{ {
id: toAnyString(), id: toAnyString(),
@ -76,6 +77,7 @@ for (let i = 0; i < count; i++) {
importance: '@integer(1, 3)', importance: '@integer(1, 3)',
display_time: '@datetime', display_time: '@datetime',
pageviews: '@integer(300, 5000)', pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'),
children: [ children: [
{ {
id: toAnyString(), id: toAnyString(),
@ -85,7 +87,8 @@ for (let i = 0; i < count; i++) {
content: baseContent, content: baseContent,
importance: '@integer(1, 3)', importance: '@integer(1, 3)',
display_time: '@datetime', display_time: '@datetime',
pageviews: '@integer(300, 5000)' pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
}, },
{ {
id: toAnyString(), id: toAnyString(),
@ -95,7 +98,8 @@ for (let i = 0; i < count; i++) {
content: baseContent, content: baseContent,
importance: '@integer(1, 3)', importance: '@integer(1, 3)',
display_time: '@datetime', display_time: '@datetime',
pageviews: '@integer(300, 5000)' pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
} }
] ]
}, },
@ -107,7 +111,8 @@ for (let i = 0; i < count; i++) {
content: baseContent, content: baseContent,
importance: '@integer(1, 3)', importance: '@integer(1, 3)',
display_time: '@datetime', display_time: '@datetime',
pageviews: '@integer(300, 5000)' pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
}, },
{ {
id: toAnyString(), id: toAnyString(),
@ -117,7 +122,8 @@ for (let i = 0; i < count; i++) {
content: baseContent, content: baseContent,
importance: '@integer(1, 3)', importance: '@integer(1, 3)',
display_time: '@datetime', display_time: '@datetime',
pageviews: '@integer(300, 5000)' pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
}, },
{ {
id: toAnyString(), id: toAnyString(),
@ -127,7 +133,8 @@ for (let i = 0; i < count; i++) {
content: baseContent, content: baseContent,
importance: '@integer(1, 3)', importance: '@integer(1, 3)',
display_time: '@datetime', display_time: '@datetime',
pageviews: '@integer(300, 5000)' pageviews: '@integer(300, 5000)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
} }
] ]
// image_uri // image_uri

View File

@ -17,7 +17,6 @@ import { set, get } from 'lodash-es'
import { CSSProperties } from 'vue' import { CSSProperties } from 'vue'
import { getSlot } from '@/utils/tsxHelper' import { getSlot } from '@/utils/tsxHelper'
import TableActions from './components/TableActions.vue' import TableActions from './components/TableActions.vue'
import { isImgPath } from '@/utils/is'
import { createVideoViewer } from '@/components/VideoPlayer' import { createVideoViewer } from '@/components/VideoPlayer'
import { Icon } from '@/components/Icon' import { Icon } from '@/components/Icon'
import { BaseButton } from '@/components/Button' import { BaseButton } from '@/components/Button'
@ -59,8 +58,13 @@ export default defineComponent({
type: Array as PropType<Recordable[]>, type: Array as PropType<Recordable[]>,
default: () => [] default: () => []
}, },
// //
preview: { imagePreview: {
type: Array as PropType<string[]>,
default: () => []
},
//
videoPreview: {
type: Array as PropType<string[]>, type: Array as PropType<string[]>,
default: () => [] default: () => []
}, },
@ -339,7 +343,8 @@ export default defineComponent({
}) })
const renderTreeTableColumn = (columnsChildren: TableColumn[]) => { const renderTreeTableColumn = (columnsChildren: TableColumn[]) => {
const { align, headerAlign, showOverflowTooltip, preview } = unref(getProps) const { align, headerAlign, showOverflowTooltip, imagePreview, videoPreview } =
unref(getProps)
return columnsChildren.map((v) => { return columnsChildren.map((v) => {
if (v.hidden) return null if (v.hidden) return null
const props = { ...v } as any const props = { ...v } as any
@ -350,10 +355,10 @@ export default defineComponent({
const slots = { const slots = {
default: (...args: any[]) => { default: (...args: any[]) => {
const data = args[0] const data = args[0]
let isImageUrl = false let isPreview = false
if (preview.length) { isPreview =
isImageUrl = preview.some((item) => (item as string) === v.field) imagePreview.some((item) => (item as string) === v.field) ||
} videoPreview.some((item) => (item as string) === v.field)
return children && children.length return children && children.length
? renderTreeTableColumn(children) ? renderTreeTableColumn(children)
@ -361,8 +366,8 @@ export default defineComponent({
? props.slots.default(...args) ? props.slots.default(...args)
: v?.formatter : v?.formatter
? v?.formatter?.(data.row, data.column, get(data.row, v.field), data.$index) ? v?.formatter?.(data.row, data.column, get(data.row, v.field), data.$index)
: isImageUrl : isPreview
? renderPreview(get(data.row, v.field)) ? renderPreview(get(data.row, v.field), v.field)
: get(data.row, v.field) : get(data.row, v.field)
} }
} }
@ -384,10 +389,11 @@ export default defineComponent({
}) })
} }
const renderPreview = (url: string) => { const renderPreview = (url: string, field: string) => {
const { imagePreview, videoPreview } = unref(getProps)
return ( return (
<div class="flex items-center"> <div class="flex items-center">
{isImgPath(url) ? ( {imagePreview.includes(field) ? (
<ElImage <ElImage
src={url} src={url}
fit="cover" fit="cover"
@ -396,7 +402,7 @@ export default defineComponent({
preview-src-list={[url]} preview-src-list={[url]}
preview-teleported preview-teleported
/> />
) : ( ) : videoPreview.includes(field) ? (
<BaseButton <BaseButton
type="primary" type="primary"
icon={<Icon icon="ep:video-play" />} icon={<Icon icon="ep:video-play" />}
@ -408,7 +414,7 @@ export default defineComponent({
> >
预览 预览
</BaseButton> </BaseButton>
)} ) : null}
</div> </div>
) )
} }
@ -423,7 +429,8 @@ export default defineComponent({
headerAlign, headerAlign,
showOverflowTooltip, showOverflowTooltip,
reserveSelection, reserveSelection,
preview imagePreview,
videoPreview
} = unref(getProps) } = unref(getProps)
return (columnsChildren || columns).map((v) => { return (columnsChildren || columns).map((v) => {
@ -463,10 +470,10 @@ export default defineComponent({
default: (...args: any[]) => { default: (...args: any[]) => {
const data = args[0] const data = args[0]
let isImageUrl = false let isPreview = false
if (preview.length) { isPreview =
isImageUrl = preview.some((item) => (item as string) === v.field) imagePreview.some((item) => (item as string) === v.field) ||
} videoPreview.some((item) => (item as string) === v.field)
return children && children.length return children && children.length
? renderTreeTableColumn(children) ? renderTreeTableColumn(children)
@ -474,8 +481,8 @@ export default defineComponent({
? props.slots.default(...args) ? props.slots.default(...args)
: v?.formatter : v?.formatter
? v?.formatter?.(data.row, data.column, get(data.row, v.field), data.$index) ? v?.formatter?.(data.row, data.column, get(data.row, v.field), data.$index)
: isImageUrl : isPreview
? renderPreview(get(data.row, v.field)) ? renderPreview(get(data.row, v.field), v.field)
: get(data.row, v.field) : get(data.row, v.field)
} }
} }

View File

@ -106,9 +106,6 @@ export const isDark = (): boolean => {
// 是否是图片链接 // 是否是图片链接
export const isImgPath = (path: string): boolean => { export const isImgPath = (path: string): boolean => {
if (path.includes('picsum.photos') || path.includes('loremflickr.com')) {
return true
}
return /(https?:\/\/|data:image\/).*?\.(png|jpg|jpeg|gif|svg|webp|ico)/gi.test(path) return /(https?:\/\/|data:image\/).*?\.(png|jpg|jpeg|gif|svg|webp|ico)/gi.test(path)
} }

View File

@ -77,6 +77,11 @@ getTableList()
<template> <template>
<ContentWrap :title="t('router.PicturePreview')"> <ContentWrap :title="t('router.PicturePreview')">
<Table :columns="columns" :data="tableDataList" :loading="loading" :preview="['image_uri']" /> <Table
:columns="columns"
:data="tableDataList"
:loading="loading"
:image-preview="['image_uri']"
/>
</ContentWrap> </ContentWrap>
</template> </template>

View File

@ -65,7 +65,7 @@ getTableList()
:columns="columns" :columns="columns"
:data="tableDataList" :data="tableDataList"
:loading="loading" :loading="loading"
:preview="['image_uri', 'video_uri']" :video-preview="['image_uri', 'video_uri']"
/> />
</ContentWrap> </ContentWrap>
</template> </template>