Trend.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <template>
  2. <div class="chart-trend">
  3. {{ term }}
  4. <span>{{ rate }}%</span>
  5. <span :class="['trend-icon', trend]"><Icon :icon="'ant-design:caret-' + trend + '-outlined'" /></span>
  6. </div>
  7. </template>
  8. <script lang="ts">
  9. import { defineComponent, computed } from 'vue';
  10. export default defineComponent({
  11. name: 'Trend',
  12. props: {
  13. // 同title
  14. term: {
  15. type: String,
  16. default: '',
  17. required: true,
  18. },
  19. // 百分比
  20. percentage: {
  21. type: Number,
  22. default: null,
  23. },
  24. type: {
  25. type: Boolean,
  26. default: null,
  27. },
  28. target: {
  29. type: Number,
  30. default: 0,
  31. },
  32. value: {
  33. type: Number,
  34. default: 0,
  35. },
  36. fixed: {
  37. type: Number,
  38. default: 2,
  39. },
  40. },
  41. setup(props) {
  42. const trend = computed(() => {
  43. let type = props.type === null ? props.value >= props.target : props.type;
  44. return type ? 'up' : 'down';
  45. });
  46. const rate = computed(() =>
  47. (props.percentage === null ? (Math.abs(props.value - props.target) * 100) / props.target : props.percentage).toFixed(props.fixed)
  48. );
  49. return {
  50. trend,
  51. rate,
  52. };
  53. },
  54. });
  55. </script>
  56. <style lang="less" scoped>
  57. .chart-trend {
  58. display: inline-block;
  59. font-size: 14px;
  60. line-height: 22px;
  61. .trend-icon {
  62. font-size: 12px;
  63. &.up,
  64. &.down {
  65. margin-left: 4px;
  66. position: relative;
  67. top: 1px;
  68. i {
  69. font-size: 12px;
  70. transform: scale(0.83);
  71. }
  72. }
  73. &.up {
  74. color: #f5222d;
  75. }
  76. &.down {
  77. color: #52c41a;
  78. top: -1px;
  79. }
  80. }
  81. }
  82. </style>