index.taro.vue 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <template>
  2. <view :class="classes" :style="baseStyle" @click="handleClick">
  3. <slot>
  4. <view class="nut-cell__icon" v-if="icon || $slots.icon">
  5. <slot v-if="$slots.icon" name="icon"></slot>
  6. <nut-icon v-else-if="icon" class="icon" :name="icon"></nut-icon>
  7. </view>
  8. <view class="nut-cell__title" v-if="title || subTitle">
  9. <template v-if="subTitle">
  10. <view class="title">{{ title }}</view>
  11. <view class="nut-cell__title-desc">{{ subTitle }}</view>
  12. </template>
  13. <template v-else>
  14. {{ title }}
  15. </template>
  16. </view>
  17. <view v-if="desc" class="nut-cell__value" :style="{ 'text-align': descTextAlign }">{{ desc }}</view>
  18. <slot v-if="$slots.link" name="link"></slot>
  19. <nut-icon v-else-if="isLink || to" class="nut-cell__link" name="right"></nut-icon>
  20. </slot>
  21. </view>
  22. </template>
  23. <script lang="ts">
  24. import { computed } from 'vue';
  25. import { createComponent } from '@/packages/utils/create';
  26. import { pxCheck } from '@/packages/utils/pxCheck';
  27. const { componentName, create } = createComponent('cell');
  28. export default create({
  29. props: {
  30. title: { type: String, default: '' },
  31. subTitle: { type: String, default: '' },
  32. desc: { type: String, default: '' },
  33. descTextAlign: { type: String, default: 'right' },
  34. isLink: { type: Boolean, default: false },
  35. to: { type: String, default: '' },
  36. replace: { type: Boolean, default: false },
  37. roundRadius: { type: [String, Number], default: '' },
  38. url: { type: String, default: '' },
  39. icon: { type: String, default: '' }
  40. },
  41. emits: ['click'],
  42. setup(props, { emit }) {
  43. const classes = computed(() => {
  44. const prefixCls = componentName;
  45. return {
  46. [prefixCls]: true,
  47. [`${prefixCls}--clickable`]: props.isLink || props.to
  48. };
  49. });
  50. const baseStyle = computed(() => {
  51. return {
  52. borderRadius: pxCheck(props.roundRadius)
  53. };
  54. });
  55. const handleClick = (event: Event) => {
  56. emit('click', event);
  57. };
  58. return {
  59. handleClick,
  60. classes,
  61. baseStyle
  62. };
  63. }
  64. });
  65. </script>