import { use, isDef } from '../utils'; import { inherit } from '../utils/functional'; import Tag from '../tag'; // Types import { CreateElement, RenderContext } from 'vue/types'; import { DefaultSlots, ScopedSlot } from '../utils/use/sfc'; 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; footer?: ScopedSlot; 'origin-price'?: ScopedSlot; }; export type CardEvents = { onClick?(event: Event): void; }; const [sfc, bem] = use('card'); function Card( h: CreateElement, props: CardProps, slots: CardSlots, ctx: RenderContext ) { const { thumb } = props; const showThumb = slots.thumb || thumb; const showTag = slots.tag || props.tag; 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; const Thumb = showThumb && ( {slots.thumb ? ( slots.thumb() ) : props.lazyLoad ? ( ) : ( )} {showTag && (
{slots.tag ? ( slots.tag() ) : ( {props.tag} )}
)}
); const Title = slots.title ? slots.title() : props.title &&
{props.title}
; const Desc = slots.desc ? slots.desc() : props.desc &&
{props.desc}
; const Price = showPrice && (
{slots.price ? slots.price() : `${props.currency} ${props.price}`}
); const OriginPrice = showOriginPrice && (
{slots['origin-price'] ? slots['origin-price']() : `${props.currency} ${props.originPrice}`}
); const Num = showNum && (
{slots.num ? slots.num() : `x ${props.num}`}
); const Footer = slots.footer &&
{slots.footer()}
; return (
{Thumb}
{Title} {Desc} {slots.tags && slots.tags()} {showBottom && (
{Price} {OriginPrice} {Num}
)}
{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 sfc(Card);