chart.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <template>
  2. <view class="charts-box">
  3. <qiun-data-charts type="funnel" :opts="opts" :chartData="chartData" :canvas2d="true" />
  4. </view>
  5. </template>
  6. <script>
  7. import qiunDataCharts from './qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue';
  8. export default {
  9. components: {
  10. qiunDataCharts
  11. },
  12. props: {
  13. getratelist: {
  14. type: Object,
  15. default: () => ({
  16. data: [{ name: '掌声', value: 10 }]
  17. }),
  18. validator: (value) => {
  19. return value && Array.isArray(value.data);
  20. }
  21. }
  22. },
  23. data() {
  24. return {
  25. chartData: {
  26. series: [{ name: '流量', data: [] }]
  27. },
  28. opts: {
  29. color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4", "#ea7ccc"],
  30. padding: [15, 15, 0, 15],
  31. enableScroll: false,
  32. canvas2d: true,
  33. extra: {
  34. funnel: {
  35. activeOpacity: 0.3,
  36. activeWidth: 10,
  37. border: true,
  38. borderWidth: 2,
  39. borderColor: "#FFFFFF",
  40. fillOpacity: 1,
  41. labelAlign: "right"
  42. }
  43. }
  44. }
  45. };
  46. },
  47. watch: {
  48. getratelist: {
  49. immediate: true,
  50. handler(newVal) {
  51. this.getServerData();
  52. }
  53. }
  54. },
  55. methods: {
  56. getServerData() {
  57. const rawData = this.getratelist?.data || [];
  58. const validData = rawData.filter(item =>
  59. item && typeof item.name !== 'undefined' && typeof item.value !== 'undefined'
  60. );
  61. if (validData.length === 0) {
  62. console.warn("使用默认数据");
  63. validData.push({ name: '暂无数据', value: 1 });
  64. }
  65. this.chartData = {
  66. series: [{
  67. name: '流量',
  68. data: validData.map(item => ({
  69. name: item.name,
  70. value: item.value,
  71. centerText: String(item.value)
  72. }))
  73. }]
  74. };
  75. }
  76. }
  77. };
  78. </script>
  79. <style scoped>
  80. .charts-box {
  81. width: 100%;
  82. height: 300px;
  83. }
  84. </style>