非常感谢这篇博客:ECharts柱状图分页显示(数据循环)_s小布丁的博客-CSDN博客

大家好,我是南宫,很久没有更新博客了。

本文参考了这篇博客里面的思路和分割数据的代码,不过我用的是vue页面,后面没有照搬他的代码,而是我自己根据我的项目需求拆分了我的函数,下面整理一下思路。

首先说一下我的需求:用柱状图展示出一系列分类的数据,结果发现分类共9种,每类的名字都很长,一行显示的时候x轴文字直接重叠到飞起,就算是弄成x轴3个字一换行,效果也很难看,变成换了很多行。问了产品以后,让我改成分页的形式。

最终的效果图如下,小伙伴先看看。

右上角的点点就是页码,共9个数据,但是最多显示4个,看起来就还行了。

下面来说一下我的思路,有类似的需求的小伙伴可以往下看:

1.   调用接口获取数据,然后在数据里找到x轴、y轴要显示的字段,用map方法映射出了两个新数组,保存起来,作为x轴,y轴的数据。

我这里认为type是x轴的数据,value是y轴的数据。

  getImportantPersonList().then(res => {
        // 从接口返回的数据中取出x轴和y轴数据
        const valueList = res.map(item => item.num)
        const typeList = res.map(item => item.type)
  })

2.  把拿到的x轴和y轴数据调用分割数组的方法,分别分割成一个二维数组(每个元素是每一页要展示的数据)分割数组的方法,是从前面那个博客里拿来用的。

然后默认肯定是把第一页的数据渲染出来。

        // 分割数组的方法
        function arrayChunk(array, size){
          let data = []
          for (let i = 0; i < array.length; i += size) {
            data.push(array.slice(i, i + size))
          }
          return data
        }
        // 把x轴和y轴数据分割完并记录下来
        this.valueList = arrayChunk(valueList, 4)
        this.typeList = arrayChunk(typeList, 4)
        // 获取完数据后,默认显示第一页
        this.currentPersonPage = 0
        this.setPeoplePage()

 3. 生成页码的小圆点。

遍历切割好的二维数组,二维数组有几个元素,就表示分为几页,根据这个来渲染小点。

除了准备小圆点的数组,还要准备小圆点高亮的数据,来匹配当前选中的页。

        // 统计有多少页
        this.followPersonPages = []
        for (var j = 0; j < this.valueList.length; j++) {
          this.followPersonPages.push(j+1);
        }
         <div class="dot-tabs-bar">
            <ul>
              <li
                :class="{ selected: index === currentPersonPage }"
                v-for="(item, index) in followPersonPages"
                :key="index"
                @click="choosePersonPage(index)"
              ></li>
            </ul>
          </div>

4. 点击小圆点,切换展示的分页。

给小圆点绑定点击事件,把对应的index传入,除了把当前高亮的下标改了以后,也要修改echarts的option,把里面渲染的数据也改成第index页的x轴数据和y轴数据

// 切换要查看折线图的第几页
    choosePersonPage(index) {
      this.currentPersonPage = index
      this.setPeoplePage()
    },

 5. 因为加载好数据后需要渲染数据,点击分页也需要渲染新的数据,所以我觉得“渲染数据”的功能可以被抽象出去到另一个函数,所以就抽了一个setPeoplePage的方法出来。

这个方法只负责根据this.currentPersonPage渲染当前页的数据,所以不需要参数了

(下面我省略了其他无关的代码,注意this.currentPersonPage)

// 绘制当页的折线图
    setPeoplePage() {
      let myChart = echarts.init(document.getElementById('echartsFour'))
      myChart.setOption({
          tooltip: {
            ...
          },
          grid: {
            ...
          },
          xAxis: [
            {
              ...
              axisLabel: {
                ...
              },
              data: this.typeList[this.currentPersonPage],
            },
          ],
          yAxis: [
            {
              ...
            },
          ],
          series: [
            {
              name: '人员情况',
              type: 'bar',
              ...
              data: this.valueList[this.currentPersonPage],
              zlevel: 0,
              label: {
                ...
              },
            },
            {
              // 分隔
              type: 'pictorialBar',
              ...
            },
          ],
        })
    },

 也就是说,要渲染分页后的柱状图,只需要设置this.currentPersonPage的值为第几页,然后调用this.setPeoplePage方法去渲染就好了。这样既可以让渲染方法变得纯粹,又可以让获取数据后的处理函数这里不太冗长。

亲测可用。有疑问的小伙伴可以在评论区提问,如果能帮到你,那就太好了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐