SkuHeader.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { use } from '../../utils';
  2. import { inherit } from '../../utils/functional';
  3. import Icon from '../../icon';
  4. // Types
  5. import Vue, { CreateElement, RenderContext } from 'vue/types';
  6. import { DefaultSlots } from '../../utils/use/sfc';
  7. import { SkuData, SkuGoodsData, SelectedSkuData } from '../type';
  8. export type SkuHeaderProps = {
  9. sku: SkuData;
  10. goods: SkuGoodsData;
  11. skuEventBus: Vue;
  12. selectedSku: SelectedSkuData;
  13. };
  14. const [sfc, bem] = use('sku-header');
  15. function getSkuImg(sku: SkuData, selectedSku: SelectedSkuData) {
  16. const id = selectedSku.s1;
  17. if (id) {
  18. // skuImg 挂载在 skuTree 中 s1 上
  19. const treeItem = sku.tree.filter(item => item.k_s === 's1')[0] || {};
  20. if (treeItem.v) {
  21. const matchedSku = treeItem.v.filter(skuValue => skuValue.id === id)[0];
  22. if (matchedSku) {
  23. return matchedSku.imgUrl || matchedSku.img_url;
  24. }
  25. }
  26. }
  27. }
  28. function SkuHeader(
  29. h: CreateElement,
  30. props: SkuHeaderProps,
  31. slots: DefaultSlots,
  32. ctx: RenderContext<SkuHeaderProps>
  33. ) {
  34. const { sku, goods, skuEventBus, selectedSku } = props;
  35. const goodsImg = getSkuImg(sku, selectedSku) || goods.picture;
  36. const previewImage = () => {
  37. skuEventBus.$emit('sku:previewImage', goodsImg);
  38. };
  39. return (
  40. <div class={[bem(), 'van-hairline--bottom']} {...inherit(ctx)}>
  41. <div class={bem('img-wrap')} onClick={previewImage}>
  42. <img src={goodsImg} />
  43. </div>
  44. <div class={bem('goods-info')}>
  45. <div class="van-sku__goods-name van-ellipsis">{goods.title}</div>
  46. {slots.default && slots.default()}
  47. <Icon
  48. name="close"
  49. class="van-sku__close-icon"
  50. onClick={() => {
  51. skuEventBus.$emit('sku:close');
  52. }}
  53. />
  54. </div>
  55. </div>
  56. );
  57. }
  58. SkuHeader.props = {
  59. sku: Object,
  60. goods: Object,
  61. skuEventBus: Object,
  62. selectedSku: Object
  63. };
  64. export default sfc<SkuHeaderProps>(SkuHeader);