index.taro.vue 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <template>
  2. <view :class="classes">
  3. <span v-if="!arrowLeft" class="nut-trend-arrow-icon-before nut-trend-arrow-rate" :style="calcStyle">{{
  4. calcRate
  5. }}</span>
  6. <slot name="up-icon" v-if="Number(rate) !== 0 && rateTrend">
  7. <TriangleUp :color="riseColor" />
  8. </slot>
  9. <slot name="down-icon" v-if="Number(rate) !== 0 && !rateTrend">
  10. <TriangleDown :color="dropColor" />
  11. </slot>
  12. <span v-if="arrowLeft" class="nut-trend-arrow-icon-after nut-trend-arrow-rate" :style="calcStyle">{{
  13. calcRate
  14. }}</span>
  15. </view>
  16. </template>
  17. <script lang="ts">
  18. import { reactive, toRefs, computed } from 'vue';
  19. import { myFixed } from '@/packages/utils/util';
  20. import { createComponent } from '@/packages/utils/create';
  21. import { TriangleUp, TriangleDown } from '@nutui/icons-vue-taro';
  22. const { componentName, create } = createComponent('trend-arrow');
  23. export default create({
  24. components: { TriangleUp, TriangleDown },
  25. props: {
  26. rate: {
  27. type: Number,
  28. default: 0
  29. },
  30. digits: {
  31. type: Number,
  32. default: 2
  33. },
  34. showSign: {
  35. type: Boolean,
  36. default: false
  37. },
  38. showZero: {
  39. type: Boolean,
  40. default: false
  41. },
  42. arrowLeft: {
  43. type: Boolean,
  44. default: false
  45. },
  46. syncTextColor: {
  47. type: Boolean,
  48. default: true
  49. },
  50. textColor: {
  51. type: String,
  52. default: '#333'
  53. },
  54. riseColor: {
  55. type: String,
  56. default: '#fa2c19'
  57. },
  58. dropColor: {
  59. type: String,
  60. default: '#64b578'
  61. }
  62. },
  63. setup(props) {
  64. const state = reactive({
  65. rateTrend: props.rate > 0 ? true : false
  66. });
  67. const classes = computed(() => {
  68. const prefixCls = componentName;
  69. return {
  70. [prefixCls]: true
  71. };
  72. });
  73. const calcRate = computed(() => {
  74. const { rate, digits, showSign, showZero } = props;
  75. state.rateTrend = rate > 0 ? true : false;
  76. const absRate = Math.abs(rate);
  77. if (!showZero && rate === 0) {
  78. return '--';
  79. }
  80. let resultRate = `${showSign && rate !== 0 ? (state.rateTrend ? '+' : '-') : ''}${myFixed(
  81. Number(absRate),
  82. digits
  83. )}%`;
  84. return resultRate;
  85. });
  86. const calcStyle = computed(() => {
  87. const { dropColor, riseColor, syncTextColor, textColor, rate } = props;
  88. let style = {
  89. color: rate === 0 ? textColor : syncTextColor ? (state.rateTrend ? riseColor : dropColor) : textColor
  90. };
  91. return style;
  92. });
  93. return { ...toRefs(state), classes, calcRate, calcStyle };
  94. }
  95. });
  96. </script>