Trend.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <template>
  2. <div class="chart-trend">
  3. {{term}}
  4. <span>{{rate}}%</span>
  5. <span :class="['chart-trend-icon', trend]" style=""><a-icon :type="'caret-' + trend" /></span>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. name: 'Trend',
  11. props: {
  12. term: {
  13. type: String,
  14. required: true
  15. },
  16. target: {
  17. type: Number,
  18. required: false,
  19. default: 0
  20. },
  21. value: {
  22. type: Number,
  23. required: false,
  24. default: 0
  25. },
  26. isIncrease: {
  27. type: Boolean,
  28. required: false,
  29. default: null
  30. },
  31. percent: {
  32. type: Number,
  33. required: false,
  34. default: null
  35. },
  36. scale: {
  37. type: Number,
  38. required: false,
  39. default: 2
  40. }
  41. },
  42. data () {
  43. return {
  44. trend: this.isIncrease ? 'up' : 'down',
  45. rate: this.percent
  46. }
  47. },
  48. created () {
  49. this.trend = this.caulateTrend()
  50. this.rate = this.caulateRate()
  51. },
  52. methods: {
  53. caulateRate () {
  54. return (this.percent === null ? Math.abs(this.value - this.target) * 100 / this.target : this.percent).toFixed(this.scale)
  55. },
  56. caulateTrend () {
  57. let isIncrease = this.isIncrease === null ? this.value >= this.target : this.isIncrease
  58. return isIncrease ? 'up' : 'down'
  59. }
  60. }
  61. }
  62. </script>
  63. <style lang="less" scoped>
  64. .chart-trend{
  65. display: inline-block;
  66. font-size: 14px;
  67. .chart-trend-icon{
  68. font-size: 12px;
  69. &.up{
  70. color: @red-6;
  71. }
  72. &.down{
  73. color: @green-6;
  74. }
  75. }
  76. }
  77. </style>