@tplc/business 0.4.107 → 0.4.109

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [0.4.109](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/compare/v0.4.108...v0.4.109) (2025-05-11)
6
+
7
+ ### [0.4.108](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/compare/v0.4.107...v0.4.108) (2025-05-10)
8
+
9
+
10
+ ### ✨ Features | 新功能
11
+
12
+ * 对比修改 ([2decf5d](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/commit/2decf5d485bd6d9c197d1d9fd2566bbcb29d9ffb))
13
+ * 暂时提交骨架屏 ([4314836](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/commit/43148361462a43b75f4f80806b6021d979b398d5))
14
+
15
+
16
+ ### 🐛 Bug Fixes | Bug 修复
17
+
18
+ * nav 判断 ([6fd5aa6](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/commit/6fd5aa6e27722e1a17ebd637cf4b1c29d0599eab))
19
+
5
20
  ### [0.4.107](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/compare/v0.4.106...v0.4.107) (2025-05-09)
6
21
 
7
22
  ### [0.4.106](http://gitlab888.30jia.com.cn/bhBank/zero-code-pro/compare/v0.4.105...v0.4.106) (2025-05-09)
@@ -0,0 +1,54 @@
1
+ <template>
2
+ <template v-if="loading">
3
+ <view v-if="listType === 'list'" class="flex flex-col gap-3">
4
+ <SkeletonItem :layout-type="layoutType" />
5
+ <SkeletonItem :layout-type="layoutType" />
6
+ </view>
7
+ <!-- horizontal -->
8
+ <view
9
+ v-else-if="listType === 'horizontal'"
10
+ class="flex flex-row gap-3 overflow-x-auto whitespace-nowrap"
11
+ >
12
+ <SkeletonItem :layout-type="layoutType" :custom-class="`!w-45% flex-shrink-0`" />
13
+ <SkeletonItem :layout-type="layoutType" :custom-class="`!w-45% flex-shrink-0`" />
14
+ <SkeletonItem :layout-type="layoutType" :custom-class="`!w-45% flex-shrink-0`" />
15
+ </view>
16
+ <!-- grid -->
17
+ <view v-else-if="listType === 'grid'" class="grid grid-cols-2 gap-3">
18
+ <SkeletonItem :layout-type="layoutType" />
19
+ <SkeletonItem :layout-type="layoutType" />
20
+ <SkeletonItem :layout-type="layoutType" />
21
+ <SkeletonItem :layout-type="layoutType" />
22
+ </view>
23
+ <!-- waterfall -->
24
+ <view v-else-if="listType === 'waterfall'" class="grid grid-cols-2 gap-3">
25
+ <SkeletonItem :layout-type="layoutType" />
26
+ <SkeletonItem :layout-type="layoutType" />
27
+ <SkeletonItem :layout-type="layoutType" />
28
+ <SkeletonItem :layout-type="layoutType" />
29
+ </view>
30
+ </template>
31
+ <slot v-else />
32
+ </template>
33
+
34
+ <script setup lang="ts">
35
+ import { LcbProductProps } from '../../types'
36
+ import { defineProps } from 'vue'
37
+ import SkeletonItem from '../SKeletonItem/index.vue'
38
+ defineOptions({
39
+ name: 'ProductSkeleton',
40
+ options: {
41
+ addGlobalClass: true,
42
+ virtualHost: true,
43
+ layoutType: 'vertical',
44
+ styleIsolation: 'shared',
45
+ },
46
+ })
47
+ withDefaults(defineProps<LcbProductProps & { loading?: boolean }>(), {})
48
+ </script>
49
+
50
+ <style lang="scss" scoped>
51
+ .lcb-product-skeleton {
52
+ width: 100%;
53
+ }
54
+ </style>
@@ -0,0 +1,38 @@
1
+ <template>
2
+ <!-- vertical -->
3
+ <view v-if="layoutType === 'vertical'" :class="customClass" class="w-full">
4
+ <wd-skeleton :row-col="verticalRowCol" animation="gradient" />
5
+ </view>
6
+ <!-- horizontal -->
7
+ <view v-else class="flex flex-row w-fuull" :class="customClass">
8
+ <wd-skeleton :row-col="[{ size: '80px', type: 'rect' }]" animation="gradient" />
9
+ <wd-skeleton
10
+ animation="gradient"
11
+ :custom-style="{ width: '100%', marginLeft: '24rpx' }"
12
+ :row-col="[1, { width: '80%' }, [{ width: '40%' }, { width: '20%' }]]"
13
+ />
14
+ </view>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { LcbProductProps } from '../../types'
19
+ import { defineProps } from 'vue'
20
+
21
+ defineOptions({
22
+ name: 'SkeletonItem',
23
+ options: {
24
+ addGlobalClass: true,
25
+ virtualHost: true,
26
+ layoutType: 'vertical',
27
+ styleIsolation: 'shared',
28
+ },
29
+ })
30
+ const props = defineProps<LcbProductProps>()
31
+ const verticalRowCol = [
32
+ { height: '171px' },
33
+ 1,
34
+ { width: '80%' },
35
+ { width: '60%' },
36
+ [{ width: '30%' }, { width: '10%', marginLeft: '41px' }],
37
+ ]
38
+ </script>
@@ -1,13 +1,14 @@
1
1
  <script setup lang="ts">
2
2
  import { isH5 } from '@tplc/wot/components/common/util'
3
3
  import UWaterfall from 'uview-plus/components/u-waterfall/u-waterfall.vue'
4
- import { ref, useAttrs, watch, watchEffect } from 'vue'
4
+ import { computed, ref, useAttrs, watch, watchEffect } from 'vue'
5
5
  import useSyncForm from '../../hooks/useSyncForm'
6
6
  import { transformValueUnit } from '../../utils/transform'
7
7
  import { calculateImageHeight } from '../../utils/utils'
8
8
  import UnconditionedLayout from '../lcb-list/components/UnconditionedLayout/index.vue'
9
9
  import { LcbProductProps } from './types'
10
10
  import isEqual from 'lodash-es/isEqual'
11
+ import ProductSkeleton from './components/ProductSkeleton/index.vue'
11
12
 
12
13
  const uWaterfallRef = ref()
13
14
  defineOptions({
@@ -32,6 +33,7 @@ const props = withDefaults(defineProps<LcbProductProps>(), {
32
33
  gap: 16,
33
34
  })
34
35
  const { form } = useSyncForm(props.dynamicScope)
36
+ const loading = ref(false)
35
37
  const renderList = ref<Record<string, any>[]>([])
36
38
  const screenWidth = isH5 ? window.innerWidth : uni.getWindowInfo().screenWidth
37
39
  watchEffect(() => {
@@ -43,39 +45,48 @@ defineSlots<{
43
45
  }>()
44
46
  const getData = async () => {
45
47
  /** 如果是list里面嵌套就不处理 */
46
- if (props.filterList) return
47
- if (props.listType === 'waterfall') {
48
- renderList.value = []
49
- uWaterfallRef.value?.clear?.()
48
+ if (props.filterList) {
49
+ loading.value = false
50
+ return
50
51
  }
51
- let requestParams = {}
52
+ loading.value = true
52
53
  try {
53
- requestParams = JSON.parse(props.requestParams ?? '{}')
54
+ if (props.listType === 'waterfall') {
55
+ renderList.value = []
56
+ uWaterfallRef.value?.clear?.()
57
+ }
58
+ let requestParams = {}
59
+ try {
60
+ requestParams = JSON.parse(props.requestParams ?? '{}')
61
+ } catch (error) {
62
+ console.error(error)
63
+ }
64
+ /** 如果是列表模式 */
65
+ if (props.items?.length && props.sourceMode === 1) {
66
+ const { data } = await uni.$lcb.http.post('/productInfo/filteredPage', {
67
+ productIdList: props.items.map((item) => item.productId),
68
+ productType: props.items[0].productType,
69
+ listType: props.listType,
70
+ sortType: props.sortType,
71
+ ...requestParams,
72
+ })
73
+ renderList.value = data as Record<string, any>[]
74
+ /** 如果是请求模式 */
75
+ } else if (props.requestUrl && props.sourceMode === 2) {
76
+ const { data } = await uni.$lcb.http.post(props.requestUrl, {
77
+ listType: props.listType,
78
+ ...requestParams,
79
+ ...form.value,
80
+ })
81
+ renderList.value = data as Record<string, any>[]
82
+ } else {
83
+ renderList.value = []
84
+ uWaterfallRef.value?.clear?.()
85
+ }
54
86
  } catch (error) {
55
87
  console.error(error)
56
88
  }
57
- /** 如果是列表模式 */
58
- if (props.items?.length && props.sourceMode === 1) {
59
- const { data } = await uni.$lcb.http.post('/productInfo/filteredPage', {
60
- productIdList: props.items.map((item) => item.productId),
61
- productType: props.items[0].productType,
62
- listType: props.listType,
63
- sortType: props.sortType,
64
- ...requestParams,
65
- })
66
- renderList.value = data as Record<string, any>[]
67
- /** 如果是请求模式 */
68
- } else if (props.requestUrl && props.sourceMode === 2) {
69
- const { data } = await uni.$lcb.http.post(props.requestUrl, {
70
- listType: props.listType,
71
- ...requestParams,
72
- ...form.value,
73
- })
74
- renderList.value = data as Record<string, any>[]
75
- } else {
76
- renderList.value = []
77
- uWaterfallRef.value?.clear?.()
78
- }
89
+ loading.value = false
79
90
  }
80
91
  watch(
81
92
  () => form!.value,
@@ -138,122 +149,59 @@ defineExpose({
138
149
  }
139
150
  },
140
151
  })
152
+ const blockProps = computed(() => {
153
+ const {
154
+ paddingHorizontal,
155
+ paddingVertical,
156
+ paddingLeft,
157
+ paddingRight,
158
+ paddingTop,
159
+ paddingBottom,
160
+ marginHorizontal,
161
+ ...reset
162
+ } = props
163
+ return [
164
+ {
165
+ paddingHorizontal,
166
+ paddingVertical,
167
+ paddingLeft,
168
+ paddingRight,
169
+ paddingTop,
170
+ paddingBottom,
171
+ marginHorizontal,
172
+ },
173
+ reset,
174
+ ]
175
+ })
141
176
  </script>
142
177
 
143
178
  <template>
144
- <lcb-block
145
- v-bind="{
146
- ...$props,
147
- shadowColor: blockShadowColor,
148
- shadowSize: blockShadowSize,
149
- blurSize: blockBlurSize,
150
- }"
151
- :custom-class="`${listType == 'horizontal' ? '!gap-0 h-fit overflow-x-auto whitespace-nowrap flex items-stretch w-full' : ''}`"
152
- >
153
- <!-- 单列 -->
154
- <view
155
- class="flex flex-col"
156
- v-if="listType === 'list'"
157
- :style="{
158
- width: itemWidth ? `${itemWidth}rpx` : '100%',
159
- gap: gap ? `${gap}rpx` : undefined,
160
- }"
161
- >
162
- <block v-for="(item, index) in renderList" :key="`${item?.productId}:${index}`">
163
- <UnconditionedLayout
164
- v-if="item.productType === 'noProductOption'"
165
- v-bind="{ ...item, ...$props, ...attrs }"
166
- />
167
- <lcb-action-view v-bind="item.link" render-mode="view" v-else>
168
- <slot name="item" :item="item">
169
- <lcb-absolute-config-layout
170
- v-if="renderItemAbsoluteConfigLayout"
171
- :blocks="renderItemAbsoluteConfigLayout?.blocks"
172
- :canvas="renderItemAbsoluteConfigLayout?.canvas"
173
- :dataset="{
174
- ...(renderItemAbsoluteConfigLayout?.dataset ?? {}),
175
- ...item,
176
- }"
177
- />
178
- <lcb-product-item
179
- v-else
180
- v-bind="{ ...item, ...$props, ...attrs }"
181
- :layoutType="layoutType"
182
- :coverImgStyle="{
183
- width: layoutType === 'vertical' ? '100%' : transformValueUnit(imageWidth),
184
- height: layoutType === 'vertical' ? transformValueUnit(imageHeight) : undefined,
185
- minHeight: layoutType !== 'vertical' ? transformValueUnit(imageHeight) : undefined,
186
- borderRadius: imageRadius ? transformValueUnit(imageRadius) : undefined,
187
- ...($props?.coverImgStyle ?? {}),
188
- }"
189
- ></lcb-product-item>
190
- </slot>
191
- </lcb-action-view>
192
- </block>
193
- </view>
194
- <!-- 双列 -->
195
- <view
196
- class="grid grid-cols-2 box-border"
197
- v-else-if="listType === 'grid'"
198
- :style="{
199
- width: itemWidth ? `${itemWidth}rpx` : '100%',
200
- gap: gap ? `${gap}rpx` : undefined,
201
- }"
202
- >
203
- <lcb-action-view
204
- v-for="(item, index) in renderList"
205
- :key="`${item?.productId}:${index}`"
206
- v-bind="item.link"
207
- render-mode="view"
208
- custom-class="h-full rounded-md overflow-hidden"
179
+ <lcb-block v-bind="loading ? blockProps[0] : {}">
180
+ <ProductSkeleton :loading="loading" v-bind="$props">
181
+ <lcb-block
182
+ v-bind="{
183
+ ...$props,
184
+ shadowColor: blockShadowColor,
185
+ shadowSize: blockShadowSize,
186
+ blurSize: blockBlurSize,
187
+ }"
188
+ :custom-class="`${listType == 'horizontal' ? '!gap-0 h-fit overflow-x-auto whitespace-nowrap flex items-stretch w-full' : ''}`"
209
189
  >
210
- <slot name="item" :item="item">
211
- <lcb-absolute-config-layout
212
- v-if="renderItemAbsoluteConfigLayout"
213
- :blocks="renderItemAbsoluteConfigLayout?.blocks"
214
- :canvas="renderItemAbsoluteConfigLayout?.canvas"
215
- :dataset="{
216
- ...(renderItemAbsoluteConfigLayout?.dataset ?? {}),
217
- ...item,
218
- }"
219
- />
220
- <lcb-product-item
221
- v-else
222
- v-bind="{ ...item, ...$props, ...attrs }"
223
- layoutType="vertical"
224
- className="h-full"
225
- :coverImgStyle="{
226
- width: '100%',
227
- height: transformValueUnit(imageHeight),
228
- borderRadius: imageRadius ? transformValueUnit(imageRadius) : undefined,
229
- ...(attrs?.coverImgStyle ?? {}),
230
- }"
231
- ></lcb-product-item>
232
- </slot>
233
- </lcb-action-view>
234
- </view>
235
-
236
- <view
237
- class="lcb-product-waterfall !py-1"
238
- v-else-if="listType === 'waterfall'"
239
- :style="{
240
- width: itemWidth ? `${itemWidth}rpx` : '100%',
241
- }"
242
- >
243
- <u-waterfall :addTime="0" :modelValue="renderList" ref="uWaterfallRef" custom-class="!gap-20">
244
- <template #left="{ leftList: list }">
245
- <view
246
- class="flex flex-col gap-3"
247
- :style="{
248
- marginRight: `${gap / 2}rpx`,
249
- }"
250
- >
251
- <lcb-action-view
252
- v-for="(item, index) in list"
253
- :key="`${item?.productId}:${index}`"
254
- v-bind="item.link"
255
- render-mode="view"
256
- >
190
+ <!-- 单列 -->
191
+ <view
192
+ class="flex flex-col"
193
+ v-if="listType === 'list'"
194
+ :style="{
195
+ width: itemWidth ? `${itemWidth}rpx` : '100%',
196
+ gap: gap ? `${gap}rpx` : undefined,
197
+ }"
198
+ >
199
+ <block v-for="(item, index) in renderList" :key="`${item?.productId}:${index}`">
200
+ <UnconditionedLayout
201
+ v-if="item.productType === 'noProductOption'"
202
+ v-bind="{ ...item, ...$props, ...attrs }"
203
+ />
204
+ <lcb-action-view v-bind="item.link" render-mode="view" v-else>
257
205
  <slot name="item" :item="item">
258
206
  <lcb-absolute-config-layout
259
207
  v-if="renderItemAbsoluteConfigLayout"
@@ -264,44 +212,192 @@ defineExpose({
264
212
  ...item,
265
213
  }"
266
214
  />
267
-
268
215
  <lcb-product-item
269
- v-bind="{ ...item, ...$props, ...attrs }"
270
- layoutType="vertical"
271
216
  v-else
272
- >
273
- <template #coverImg="{ value }">
274
- <wd-img
275
- :src="value"
276
- width="100%"
277
- mode="aspectFill"
278
- :lazyPlaceWidth="columnWidth"
279
- :height="
280
- calculateImageHeight(
281
- screenWidth,
282
- item.coverImgProps?.[0]?.height,
283
- item.coverImgProps?.[0]?.width,
284
- )
285
- "
286
- />
287
- </template>
288
- </lcb-product-item>
217
+ v-bind="{ ...item, ...$props, ...attrs }"
218
+ :layoutType="layoutType"
219
+ :coverImgStyle="{
220
+ width: layoutType === 'vertical' ? '100%' : transformValueUnit(imageWidth),
221
+ height: layoutType === 'vertical' ? transformValueUnit(imageHeight) : undefined,
222
+ minHeight:
223
+ layoutType !== 'vertical' ? transformValueUnit(imageHeight) : undefined,
224
+ borderRadius: imageRadius ? transformValueUnit(imageRadius) : undefined,
225
+ ...($props?.coverImgStyle ?? {}),
226
+ }"
227
+ ></lcb-product-item>
289
228
  </slot>
290
229
  </lcb-action-view>
291
- </view>
292
- </template>
293
- <template #right="{ rightList: list }">
294
- <view
295
- class="flex flex-col gap-3"
296
- :style="{
297
- marginLeft: `${gap / 2}rpx`,
298
- }"
230
+ </block>
231
+ </view>
232
+ <!-- 双列 -->
233
+ <view
234
+ class="grid grid-cols-2 box-border"
235
+ v-else-if="listType === 'grid'"
236
+ :style="{
237
+ width: itemWidth ? `${itemWidth}rpx` : '100%',
238
+ gap: gap ? `${gap}rpx` : undefined,
239
+ }"
240
+ >
241
+ <lcb-action-view
242
+ v-for="(item, index) in renderList"
243
+ :key="`${item?.productId}:${index}`"
244
+ v-bind="item.link"
245
+ render-mode="view"
246
+ custom-class="h-full rounded-md overflow-hidden"
247
+ >
248
+ <slot name="item" :item="item">
249
+ <lcb-absolute-config-layout
250
+ v-if="renderItemAbsoluteConfigLayout"
251
+ :blocks="renderItemAbsoluteConfigLayout?.blocks"
252
+ :canvas="renderItemAbsoluteConfigLayout?.canvas"
253
+ :dataset="{
254
+ ...(renderItemAbsoluteConfigLayout?.dataset ?? {}),
255
+ ...item,
256
+ }"
257
+ />
258
+ <lcb-product-item
259
+ v-else
260
+ v-bind="{ ...item, ...$props, ...attrs }"
261
+ layoutType="vertical"
262
+ className="h-full"
263
+ :coverImgStyle="{
264
+ width: '100%',
265
+ height: transformValueUnit(imageHeight),
266
+ borderRadius: imageRadius ? transformValueUnit(imageRadius) : undefined,
267
+ ...(attrs?.coverImgStyle ?? {}),
268
+ }"
269
+ ></lcb-product-item>
270
+ </slot>
271
+ </lcb-action-view>
272
+ </view>
273
+
274
+ <view
275
+ class="lcb-product-waterfall !py-1"
276
+ v-else-if="listType === 'waterfall'"
277
+ :style="{
278
+ width: itemWidth ? `${itemWidth}rpx` : '100%',
279
+ }"
280
+ >
281
+ <u-waterfall
282
+ :addTime="0"
283
+ :modelValue="renderList"
284
+ ref="uWaterfallRef"
285
+ custom-class="!gap-20"
286
+ >
287
+ <template #left="{ leftList: list }">
288
+ <view
289
+ class="flex flex-col gap-3"
290
+ :style="{
291
+ marginRight: `${gap / 2}rpx`,
292
+ }"
293
+ >
294
+ <lcb-action-view
295
+ v-for="(item, index) in list"
296
+ :key="`${item?.productId}:${index}`"
297
+ v-bind="item.link"
298
+ render-mode="view"
299
+ >
300
+ <slot name="item" :item="item">
301
+ <lcb-absolute-config-layout
302
+ v-if="renderItemAbsoluteConfigLayout"
303
+ :blocks="renderItemAbsoluteConfigLayout?.blocks"
304
+ :canvas="renderItemAbsoluteConfigLayout?.canvas"
305
+ :dataset="{
306
+ ...(renderItemAbsoluteConfigLayout?.dataset ?? {}),
307
+ ...item,
308
+ }"
309
+ />
310
+
311
+ <lcb-product-item
312
+ v-bind="{ ...item, ...$props, ...attrs }"
313
+ layoutType="vertical"
314
+ v-else
315
+ >
316
+ <template #coverImg="{ value }">
317
+ <wd-img
318
+ :src="value"
319
+ width="100%"
320
+ mode="aspectFill"
321
+ :lazyPlaceWidth="columnWidth"
322
+ :height="
323
+ calculateImageHeight(
324
+ screenWidth,
325
+ item.coverImgProps?.[0]?.height,
326
+ item.coverImgProps?.[0]?.width,
327
+ )
328
+ "
329
+ />
330
+ </template>
331
+ </lcb-product-item>
332
+ </slot>
333
+ </lcb-action-view>
334
+ </view>
335
+ </template>
336
+ <template #right="{ rightList: list }">
337
+ <view
338
+ class="flex flex-col gap-3"
339
+ :style="{
340
+ marginLeft: `${gap / 2}rpx`,
341
+ }"
342
+ >
343
+ <lcb-action-view
344
+ v-for="(item, index) in list"
345
+ :key="`${item?.productId}:${index}`"
346
+ v-bind="item.link"
347
+ render-mode="view"
348
+ >
349
+ <slot name="item" :item="item">
350
+ <lcb-absolute-config-layout
351
+ v-if="renderItemAbsoluteConfigLayout"
352
+ :blocks="renderItemAbsoluteConfigLayout?.blocks"
353
+ :canvas="renderItemAbsoluteConfigLayout?.canvas"
354
+ :dataset="{
355
+ ...(renderItemAbsoluteConfigLayout?.dataset ?? {}),
356
+ ...item,
357
+ }"
358
+ />
359
+ <lcb-product-item
360
+ v-else
361
+ v-bind="{ ...item, ...$props, ...attrs }"
362
+ layoutType="vertical"
363
+ >
364
+ <template #coverImg="{ value }">
365
+ <wd-img
366
+ :src="value"
367
+ width="100%"
368
+ :lazyPlaceWidth="columnWidth"
369
+ mode="aspectFill"
370
+ :height="
371
+ calculateImageHeight(
372
+ screenWidth,
373
+ item.coverImgProps?.[0]?.height,
374
+ item.coverImgProps?.[0]?.width,
375
+ )
376
+ "
377
+ />
378
+ </template>
379
+ </lcb-product-item>
380
+ </slot>
381
+ </lcb-action-view>
382
+ </view>
383
+ </template>
384
+ </u-waterfall>
385
+ </view>
386
+ <!-- 单列滚动 -->
387
+ <template v-else-if="listType == 'horizontal'">
388
+ <lcb-action-view
389
+ v-for="(item, index) in renderList"
390
+ :key="`${item?.productId}:${index}`"
391
+ custom-class="flex-shrink-0 w-fit !h-auto"
392
+ v-bind="item.link"
393
+ render-mode="view"
299
394
  >
300
- <lcb-action-view
301
- v-for="(item, index) in list"
302
- :key="`${item?.productId}:${index}`"
303
- v-bind="item.link"
304
- render-mode="view"
395
+ <view
396
+ :style="{
397
+ width: `${itemWidth}rpx`,
398
+ marginLeft: index === 0 ? 0 : `${gap}rpx`,
399
+ }"
400
+ class="h-full"
305
401
  >
306
402
  <slot name="item" :item="item">
307
403
  <lcb-absolute-config-layout
@@ -315,73 +411,23 @@ defineExpose({
315
411
  />
316
412
  <lcb-product-item
317
413
  v-else
414
+ className="h-full"
318
415
  v-bind="{ ...item, ...$props, ...attrs }"
319
- layoutType="vertical"
320
- >
321
- <template #coverImg="{ value }">
322
- <wd-img
323
- :src="value"
324
- width="100%"
325
- :lazyPlaceWidth="columnWidth"
326
- mode="aspectFill"
327
- :height="
328
- calculateImageHeight(
329
- screenWidth,
330
- item.coverImgProps?.[0]?.height,
331
- item.coverImgProps?.[0]?.width,
332
- )
333
- "
334
- />
335
- </template>
336
- </lcb-product-item>
416
+ :coverImgStyle="{
417
+ width: layoutType === 'vertical' ? '100%' : transformValueUnit(imageWidth),
418
+ height: layoutType === 'vertical' ? transformValueUnit(imageHeight) : undefined,
419
+ minHeight:
420
+ layoutType !== 'vertical' ? transformValueUnit(imageHeight) : undefined,
421
+ borderRadius: imageRadius ? transformValueUnit(imageRadius) : undefined,
422
+ ...(attrs?.coverImgStyle ?? {}),
423
+ }"
424
+ ></lcb-product-item>
337
425
  </slot>
338
- </lcb-action-view>
339
- </view>
426
+ </view>
427
+ </lcb-action-view>
340
428
  </template>
341
- </u-waterfall>
342
- </view>
343
- <!-- 单列滚动 -->
344
- <template v-else-if="listType == 'horizontal'">
345
- <lcb-action-view
346
- v-for="(item, index) in renderList"
347
- :key="`${item?.productId}:${index}`"
348
- custom-class="flex-shrink-0 w-fit !h-auto"
349
- v-bind="item.link"
350
- render-mode="view"
351
- >
352
- <view
353
- :style="{
354
- width: `${itemWidth}rpx`,
355
- marginLeft: index === 0 ? 0 : `${gap}rpx`,
356
- }"
357
- class="h-full"
358
- >
359
- <slot name="item" :item="item">
360
- <lcb-absolute-config-layout
361
- v-if="renderItemAbsoluteConfigLayout"
362
- :blocks="renderItemAbsoluteConfigLayout?.blocks"
363
- :canvas="renderItemAbsoluteConfigLayout?.canvas"
364
- :dataset="{
365
- ...(renderItemAbsoluteConfigLayout?.dataset ?? {}),
366
- ...item,
367
- }"
368
- />
369
- <lcb-product-item
370
- v-else
371
- className="h-full"
372
- v-bind="{ ...item, ...$props, ...attrs }"
373
- :coverImgStyle="{
374
- width: layoutType === 'vertical' ? '100%' : transformValueUnit(imageWidth),
375
- height: layoutType === 'vertical' ? transformValueUnit(imageHeight) : undefined,
376
- minHeight: layoutType !== 'vertical' ? transformValueUnit(imageHeight) : undefined,
377
- borderRadius: imageRadius ? transformValueUnit(imageRadius) : undefined,
378
- ...(attrs?.coverImgStyle ?? {}),
379
- }"
380
- ></lcb-product-item>
381
- </slot>
382
- </view>
383
- </lcb-action-view>
384
- </template>
429
+ </lcb-block>
430
+ </ProductSkeleton>
385
431
  </lcb-block>
386
432
  </template>
387
433
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tplc/business",
3
- "version": "0.4.107",
3
+ "version": "0.4.109",
4
4
  "keywords": [
5
5
  "业务组件"
6
6
  ],
@@ -0,0 +1,70 @@
1
+ import { LcbProductProps } from '../../types'
2
+ declare function __VLS_template(): {
3
+ default?(_: {}): any
4
+ }
5
+ declare const __VLS_component: import('vue').DefineComponent<
6
+ __VLS_WithDefaults<
7
+ __VLS_TypePropsToOption<
8
+ LcbProductProps & {
9
+ loading?: boolean
10
+ }
11
+ >,
12
+ {}
13
+ >,
14
+ {},
15
+ unknown,
16
+ {},
17
+ {},
18
+ import('vue').ComponentOptionsMixin,
19
+ import('vue').ComponentOptionsMixin,
20
+ {},
21
+ string,
22
+ import('vue').PublicProps,
23
+ Readonly<
24
+ import('vue').ExtractPropTypes<
25
+ __VLS_WithDefaults<
26
+ __VLS_TypePropsToOption<
27
+ LcbProductProps & {
28
+ loading?: boolean
29
+ }
30
+ >,
31
+ {}
32
+ >
33
+ >
34
+ >,
35
+ {},
36
+ {}
37
+ >
38
+ declare const _default: __VLS_WithTemplateSlots<
39
+ typeof __VLS_component,
40
+ ReturnType<typeof __VLS_template>
41
+ >
42
+ export default _default
43
+ type __VLS_WithDefaults<P, D> = {
44
+ [K in keyof Pick<P, keyof P>]: K extends keyof D
45
+ ? __VLS_Prettify<
46
+ P[K] & {
47
+ default: D[K]
48
+ }
49
+ >
50
+ : P[K]
51
+ }
52
+ type __VLS_Prettify<T> = {
53
+ [K in keyof T]: T[K]
54
+ } & {}
55
+ type __VLS_WithTemplateSlots<T, S> = T & {
56
+ new (): {
57
+ $slots: S
58
+ }
59
+ }
60
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T
61
+ type __VLS_TypePropsToOption<T> = {
62
+ [K in keyof T]-?: {} extends Pick<T, K>
63
+ ? {
64
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>
65
+ }
66
+ : {
67
+ type: import('vue').PropType<T[K]>
68
+ required: true
69
+ }
70
+ }
@@ -0,0 +1,28 @@
1
+ import { LcbProductProps } from '../../types'
2
+ declare const _default: import('vue').DefineComponent<
3
+ __VLS_TypePropsToOption<LcbProductProps>,
4
+ {},
5
+ unknown,
6
+ {},
7
+ {},
8
+ import('vue').ComponentOptionsMixin,
9
+ import('vue').ComponentOptionsMixin,
10
+ {},
11
+ string,
12
+ import('vue').PublicProps,
13
+ Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToOption<LcbProductProps>>>,
14
+ {},
15
+ {}
16
+ >
17
+ export default _default
18
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T
19
+ type __VLS_TypePropsToOption<T> = {
20
+ [K in keyof T]-?: {} extends Pick<T, K>
21
+ ? {
22
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>
23
+ }
24
+ : {
25
+ type: import('vue').PropType<T[K]>
26
+ required: true
27
+ }
28
+ }