generated from thzxcx/vue3
feat: extra插槽
This commit is contained in:
@ -2,14 +2,24 @@
|
|||||||
* @Author: peerless_hero peerless_hero@outlook.com
|
* @Author: peerless_hero peerless_hero@outlook.com
|
||||||
* @Date: 2023-07-08 01:36:19
|
* @Date: 2023-07-08 01:36:19
|
||||||
* @LastEditors: zhaojinfeng 121016171@qq.com
|
* @LastEditors: zhaojinfeng 121016171@qq.com
|
||||||
* @LastEditTime: 2023-07-13 12:06:10
|
* @LastEditTime: 2023-07-13 16:19:22
|
||||||
* @FilePath: \uni\packages\card\index.vue
|
* @FilePath: \uni\packages\card\index.vue
|
||||||
* @Description:
|
* @Description:
|
||||||
*
|
*
|
||||||
-->
|
-->
|
||||||
<template>
|
<template>
|
||||||
<view class="th-card" bg-white rounded-16rpx m-24rpx max-w-702rpx overflow-hidden>
|
<view
|
||||||
<slot />
|
class="th-card" :class="{ 'th-card-box-shadow': !noShadow }" bg-white rounded-16rpx m-24rpx max-w-702rpx
|
||||||
|
overflow-hidden
|
||||||
|
>
|
||||||
|
<view flex w-full>
|
||||||
|
<view flex-grow class="th-card-body">
|
||||||
|
<slot />
|
||||||
|
</view>
|
||||||
|
<view v-if="hasExtra" class="th-card-extra" w-128rpx m-16rpx>
|
||||||
|
<slot name="extra" />
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
<view v-if="noCardActions" h-16rpx />
|
<view v-if="noCardActions" h-16rpx />
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@ -17,14 +27,24 @@
|
|||||||
<script lang="ts" setup name="Card">
|
<script lang="ts" setup name="Card">
|
||||||
import { useSlots } from 'vue'
|
import { useSlots } from 'vue'
|
||||||
|
|
||||||
|
withDefaults(defineProps<{
|
||||||
|
/** 取消阴影 */
|
||||||
|
noShadow?: boolean
|
||||||
|
}>(),
|
||||||
|
{ noShadow: false },
|
||||||
|
)
|
||||||
|
|
||||||
/** 不存在操作栏组件时,自动增加底部的内边距 */
|
/** 不存在操作栏组件时,自动增加底部的内边距 */
|
||||||
const noCardActions = useSlots().default().every(({ type }) =>
|
const noCardActions = useSlots().default().every(({ type }) =>
|
||||||
typeof type !== 'object' || !('name' in type) || type.name !== 'CardActions',
|
typeof type !== 'object' || !('name' in type) || type.name !== 'CardActions',
|
||||||
)
|
)
|
||||||
|
const hasExtra = useSlots().extra
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.th-card {
|
.th-card {
|
||||||
box-shadow: 0px 1px 6px 0px #d8d8d880;
|
&.th-card-box-shadow {
|
||||||
|
box-shadow: 0px 1px 6px 0px #d8d8d880;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,17 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* @Author: zhaojinfeng 121016171@qq.com
|
||||||
|
* @Date: 2023-07-10 14:39:45
|
||||||
|
* @LastEditors: zhaojinfeng 121016171@qq.com
|
||||||
|
* @LastEditTime: 2023-07-13 16:23:26
|
||||||
|
* @FilePath: \uni\stories\Card.stories.ts
|
||||||
|
* @Description:
|
||||||
|
*
|
||||||
|
*/
|
||||||
import type { Meta, StoryObj } from '@storybook/vue3'
|
import type { Meta, StoryObj } from '@storybook/vue3'
|
||||||
import ThCard from '../packages/card/index.vue'
|
import ThCard from '../packages/card/index.vue'
|
||||||
import ThCardTitle from '../packages/card-title/index.vue'
|
import ThCardTitle from '../packages/card-title/index.vue'
|
||||||
|
import ThCardText from '../packages/card-text/index.vue'
|
||||||
|
import ThTag from '../packages/tag/index.vue'
|
||||||
|
|
||||||
const meta = {
|
const meta = {
|
||||||
title: '卡片/Card',
|
title: '卡片/Card',
|
||||||
component: ThCard,
|
component: ThCard,
|
||||||
tags: ['autodocs'],
|
tags: ['autodocs'],
|
||||||
render: (args: any) => ({
|
render: args => ({
|
||||||
components: { ThCard },
|
components: { ThCard },
|
||||||
setup() {
|
setup() {
|
||||||
return { args }
|
return { args }
|
||||||
},
|
},
|
||||||
template: '<div w-full><th-card /></div>',
|
template: '<th-card :no-shadow="args.noShadow" />',
|
||||||
}),
|
}),
|
||||||
} satisfies Meta<typeof ThCard>
|
} satisfies Meta<typeof ThCard>
|
||||||
export default meta
|
export default meta
|
||||||
@ -19,13 +30,16 @@ export default meta
|
|||||||
type Story = StoryObj<typeof meta>
|
type Story = StoryObj<typeof meta>
|
||||||
|
|
||||||
export const Title: Story = {
|
export const Title: Story = {
|
||||||
|
args: {
|
||||||
|
noShadow: false,
|
||||||
|
},
|
||||||
render: (args: any) => ({
|
render: (args: any) => ({
|
||||||
components: { ThCard, ThCardTitle },
|
components: { ThCard, ThCardTitle },
|
||||||
setup() {
|
setup() {
|
||||||
return { args }
|
return { args }
|
||||||
},
|
},
|
||||||
template: `
|
template: `
|
||||||
<th-card>
|
<th-card :no-shadow="args.noShadow">
|
||||||
<th-card-title>
|
<th-card-title>
|
||||||
Title
|
Title
|
||||||
</th-card-title>
|
</th-card-title>
|
||||||
@ -33,3 +47,31 @@ export const Title: Story = {
|
|||||||
`,
|
`,
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const TitleExtra: Story = {
|
||||||
|
render: args => ({
|
||||||
|
components: { ThCard, ThCardText, ThTag },
|
||||||
|
setup() {
|
||||||
|
return { args }
|
||||||
|
},
|
||||||
|
template: `
|
||||||
|
<th-card>
|
||||||
|
<th-card-text label="Label">
|
||||||
|
Text
|
||||||
|
</th-card-text>
|
||||||
|
<th-card-text label="Label">
|
||||||
|
Text
|
||||||
|
</th-card-text>
|
||||||
|
<th-card-text label="Label">
|
||||||
|
Text
|
||||||
|
</th-card-text>
|
||||||
|
<th-card-text label="Label">
|
||||||
|
Text
|
||||||
|
</th-card-text>
|
||||||
|
<template #extra>
|
||||||
|
<th-tag text="标签" />
|
||||||
|
</template>
|
||||||
|
</th-card>
|
||||||
|
`,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user