// Utils import { createNamespace, isDef } from '../utils'; import { emit, inherit } from '../utils/functional'; // Components import Tag from '../tag'; import Image from '../image'; // Types import { CreateElement, RenderContext } from 'vue/types'; import { DefaultSlots, ScopedSlot } from '../utils/types'; export type CardProps = { tag?: string; num?: number | string; desc?: string; thumb?: string; title?: string; price?: number | string; currency: string; centered?: boolean; lazyLoad?: boolean; thumbLink?: string; originPrice?: number | string; }; export type CardSlots = DefaultSlots & { num?: ScopedSlot; tag?: ScopedSlot; tags?: ScopedSlot; desc?: ScopedSlot; title?: ScopedSlot; thumb?: ScopedSlot; price?: ScopedSlot; bottom?: ScopedSlot; footer?: ScopedSlot; 'origin-price'?: ScopedSlot; 'price-top'?: ScopedSlot; }; export type CardEvents = { onClick?(event: Event): void; }; const [createComponent, bem] = createNamespace('card'); function Card( h: CreateElement, props: CardProps, slots: CardSlots, ctx: RenderContext ) { const { thumb } = props; const showNum = slots.num || isDef(props.num); const showPrice = slots.price || isDef(props.price); const showOriginPrice = slots['origin-price'] || isDef(props.originPrice); const showBottom = showNum || showPrice || showOriginPrice || slots.bottom; function onThumbClick(event: MouseEvent) { emit(ctx, 'click-thumb', event); } function ThumbTag() { if (slots.tag || props.tag) { return (
{slots.tag ? ( slots.tag() ) : ( {props.tag} )}
); } } function Thumb() { if (slots.thumb || thumb) { return ( {slots.thumb ? ( slots.thumb() ) : ( )} {ThumbTag()} ); } } function Title() { if (slots.title) { return slots.title(); } if (props.title) { return (
{props.title}
); } } function Desc() { if (slots.desc) { return slots.desc(); } if (props.desc) { return
{props.desc}
; } } function PriceContent() { const priceArr = props.price!.toString().split('.'); return (
{props.currency} {priceArr[0]}. {priceArr[1]}
); } function Price() { if (showPrice) { return (
{slots.price ? slots.price() : PriceContent()}
); } } function OriginPrice() { if (showOriginPrice) { const slot = slots['origin-price']; return (
{slot ? slot() : `${props.currency} ${props.originPrice}`}
); } } function Num() { if (showNum) { return (
{slots.num ? slots.num() : `x${props.num}`}
); } } function Footer() { if (slots.footer) { return
{slots.footer()}
; } } return (
{Thumb()}
{Title()} {Desc()} {slots.tags?.()}
{showBottom && (
{slots['price-top']?.()} {Price()} {OriginPrice()} {Num()} {slots.bottom?.()}
)}
{Footer()}
); } Card.props = { tag: String, desc: String, thumb: String, title: String, centered: Boolean, lazyLoad: Boolean, thumbLink: String, num: [Number, String], price: [Number, String], originPrice: [Number, String], currency: { type: String, default: '¥', }, }; export default createComponent(Card);