tab.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <view class="content">
  3. <view class="uni-tabs__header">
  4. <view class="uni-tabs__nav-wrap">
  5. <view class="uni-tabs__nav-scroll">
  6. <scroll-view class="uni-tabs__nav" :scroll-x="true">
  7. <block v-for="(item, index) in menus" :key="index">
  8. <view @click="switchTab(item.value)" :class="{'is-active':currentTab===item.value}" class="uni-tabs__item">{{item.text}}</view>
  9. </block>
  10. </scroll-view>
  11. </view>
  12. </view>
  13. </view>
  14. <view v-show="currentTab==='ucharts1'">
  15. <!-- 如果tab切换的父容器使用了v-show来控制显示,组件上需绑定reshow属性用于强制重新渲染图表。如组件父元素没有v-show,则不必传此参数。-->
  16. <qiun-title-bar title="基本柱状图"/>
  17. <view class="charts-box">
  18. <!-- 这里因为是页面初始化默认显示的,如果不给reshow也会显示,切换回来也不会变成白板,但切换到其他tab后,改变了窗口尺寸再切换回来后,没有reshow则不会根据改变后的窗口自动适应(除非在当前tab显示的情况下再变更窗口大小才会自适应),所以建议加上reshow属性 -->
  19. <qiun-data-charts type="column" :chartData="chartsDataColumn1" />
  20. </view>
  21. <qiun-title-bar title="堆叠柱状图"/>
  22. <view class="charts-box">
  23. <!-- 这个图加了reshow属性,上图没加,可以对比一下差异 -->
  24. <qiun-data-charts type="column" :opts="{extra:{column:{type:'stack'}}}" :chartData="chartsDataColumn2" :reshow="currentTab==='ucharts1'"/>
  25. </view>
  26. </view>
  27. <view v-if="currentTab==='ucharts2'">
  28. <!-- 第二个选项卡页面,用v-if控制则不需要加reshow,父元素使用v-if后,会导致组件重新加载,造成资源浪费 -->
  29. <qiun-title-bar title="基本饼状图"/>
  30. <view class="charts-box">
  31. <qiun-data-charts type="pie" :chartData="chartsDataPie1"/>
  32. </view>
  33. <qiun-title-bar title="环形图"/>
  34. <view class="charts-box">
  35. <qiun-data-charts type="ring" :opts="{extra:{ring:{ringWidth: 60,linearType:'custom'}}}" :chartData="chartsDataRing1"/>
  36. </view>
  37. </view>
  38. <view v-show="currentTab==='echarts1'">
  39. <qiun-title-bar title="基本折线图"/>
  40. <view class="charts-box">
  41. <qiun-data-charts type="line" :chartData="chartsDataLine1" :echartsH5="true" :echartsApp="true" :reshow="currentTab==='echarts1'"/>
  42. </view>
  43. <qiun-title-bar title="基本柱状图" />
  44. <view class="charts-box">
  45. <qiun-data-charts type="column" :chartData="chartsDataColumn1" :echartsH5="true" :echartsApp="true" :reshow="currentTab==='echarts1'"/>
  46. </view>
  47. </view>
  48. <!-- ECharts如果父元素用了v-if,因renderjs与逻辑层通信不同步,可能会导致初始化时监听不到prop变化,不能成功初始化,虽然组件内使用延时200ms的方法返回逻辑层强制重新读取数据,但这不是正确的解决问题的办法,并且父元素使用了 v-if 会导致组件重新加载,造成资源浪费,强烈建议将v-if改成v-show!!! -->
  49. <view v-if="currentTab==='echarts2'">
  50. <qiun-title-bar title="基本柱状图"/>
  51. <view class="charts-box">
  52. <qiun-data-charts type="column" :chartData="chartsDataColumn1" :echartsH5="true" :echartsApp="true" :reshow="currentTab==='echarts2'"/>
  53. </view>
  54. <qiun-title-bar title="基本折线图" />
  55. <view class="charts-box">
  56. <qiun-data-charts type="line" :chartData="chartsDataLine1" :echartsH5="true" :echartsApp="true" :reshow="currentTab==='echarts2'"/>
  57. </view>
  58. </view>
  59. </view>
  60. </template>
  61. <script>
  62. //下面是演示数据,您的项目不需要引用,数据需要您从服务器自行获取
  63. import demodata from '@/mockdata/demodata.json';
  64. export default {
  65. data() {
  66. return {
  67. chartsDataColumn1:{},
  68. chartsDataColumn2:{},
  69. chartsDataPie1:{},
  70. chartsDataRing1:{},
  71. chartsDataLine1:{},
  72. chartsDataLine2:{},
  73. menus:[{text:"uCharts图1",value:"ucharts1"},{text:"uCharts图2",value:"ucharts2"},{text:"ECharts图1",value:"echarts1"},{text:"ECharts图2",value:"echarts2"}],
  74. currentTab: 'ucharts1',
  75. };
  76. },
  77. onLoad() {
  78. //模拟从服务器获取数据
  79. this.getServerData()
  80. },
  81. methods: {
  82. getServerData() {
  83. setTimeout(() => {
  84. //因部分数据格式一样,这里不同图表引用同一数据源的话,需要深拷贝一下构造不同的对象
  85. //开发者需要自行处理服务器返回的数据,应与标准数据格式一致,注意series的data数值应为数字格式
  86. this.chartsDataColumn1=JSON.parse(JSON.stringify(demodata.Column))
  87. this.chartsDataColumn2=JSON.parse(JSON.stringify(demodata.Column))
  88. this.chartsDataPie1=JSON.parse(JSON.stringify(demodata.PieA))
  89. this.chartsDataRing1=JSON.parse(JSON.stringify(demodata.PieA))
  90. this.chartsDataLine1=JSON.parse(JSON.stringify(demodata.Line))
  91. this.chartsDataLine2=JSON.parse(JSON.stringify(demodata.Line))
  92. }, 1500);
  93. },
  94. switchTab(tab) {
  95. this.currentTab = tab
  96. },
  97. }
  98. };
  99. </script>
  100. <style>
  101. .content {
  102. display: flex;
  103. flex-direction: column;
  104. flex: 1;
  105. }
  106. .charts-box {
  107. width: 100%;
  108. height: 300px;
  109. }
  110. </style>