vant实现移动端渐变数据展示树

828 阅读1分钟

一 需求

要求是一个热点词的统计展示,中间是标题,两边是展现的词,点击词展开并展示相关内容,如图:

21cfa4b954ee5f7a1b9af4d8f86f71d.png

有点丑,这是ui还没确定样式的一个测试版,哈哈哈哈,莫笑话!

二 代码

html代码如下:

<template>
  <div class="select">
    <van-row class="select-content" type="flex" justify="center" gutter="5">
      <van-col span="10" class="select-left">
        <van-collapse
          v-model="activeNames"
          :class="`select-left-item select-left-item-${index}`"
          v-for="(item, index) in leftList"
          :key="index">
          <van-collapse-item :name="index" >
            <van-loading color="#0094ff" v-if="item.isLoading"/>
            <template  name="title" slot="title">
              <div @click="getList(item.id,index,'left')">{{item.name}}</div>
            </template>
            <van-cell-group v-for="(i, d) in item.list" :key="d" >
              <van-cell>
                <template #title>
                  <div class="van-ellipsis">{{ i.proposalTitle }}</div>
                </template>
              </van-cell>
            </van-cell-group>
            <div v-if="!item.isLoading">更多</div>
          </van-collapse-item> 
        </van-collapse>
        <div></div>
      </van-col>
      
      <div class="select-mid">委员关注热点词</div>

      <van-col span="10" class="select-right">
        <van-collapse
          v-model="activeNames0"
          :class="`select-right-item select-right-item-${index}`"
          v-for="(item, index) in rightList"
          :key="index">
          <van-collapse-item :name="index">
            <van-loading color="#0094ff" v-if="item.isLoading"/>
            <template  name="title" slot="title">
              <div @click="getList(item.id,index,'right')">{{item.name}}</div>
            </template>
            <van-cell-group v-for="(i, d) in item.list" :key="d">
              <van-cell>
                <template #title>
                  <div class="van-ellipsis">{{ i.proposalTitle }}</div>
                </template>
              </van-cell>
            </van-cell-group>
            <div v-if="!item.isLoading">更多</div>
          </van-collapse-item>
        </van-collapse>
      </van-col>
    </van-row>
  </div>
</template>

css样式代码如下:

因为两边展示的个数是一样的,所以每一个item绑定的class的颜色是写死的,如果有好的办法能够让颜色和个数都可以动态绑定的话,一定要告诉我,orz 求求惹!!!!!

<style scoped>
.select {
  width: 100%;
  height: 100%;
  /* padding: 10px 0; */
}
.select-content {
  width: 100%;
  height: 100%;
}
.select-left {
  padding: 10px 0;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
.select-left-item {
  height: auto;
  /* padding: 5px; */
  background-color: #b2bfca;
  text-align: center;
}
.select-mid {
  height: 100%;
  width: 40px;
  background-image: linear-gradient(#0179e9, #dfdfdf);
  color: #ffffff;
  font-size: 26px;
  font-weight: 600;
  word-wrap: break-word;
  /* letter-spacing: 20px; */
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.select-right {
  display: flex;
  padding: 10px 0;
  flex-direction: column;
  justify-content: space-around;
}
.select-right-item {
  height: auto;
  /* padding: 5px; */
  background-color: #b2bfca;
  text-align: center;
}
</style>
<style lang="less">
.select-left-item-0 {
  .van-cell {
    background-color: #1890ff !important;
    padding: 2px 10px;
    color: #ffffff;
  }
}
.select-left-item-1 {
  .van-cell {
    background-color: #40a9ff !important;
    padding: 2px 10px;
    color: #ffffff;
  }
}
.select-left-item-2 {
  .van-cell {
    background-color: #69c0ff !important;
    padding: 2px 10px;
  }
}
.select-left-item-3 {
  .van-cell {
    background-color: #91d5ff !important;
    padding: 2px 10px;
  }
}
.select-left-item-4 {
  .van-cell {
    background-color: #bae7ff !important;
    padding: 2px 10px;
  }
}

.select-right-item-0 {
  .van-cell {
    background-color: #1890ff !important;
    padding: 2px 10px;
    color: #ffffff;
  }
}
.select-right-item-1 {
  .van-cell {
    background-color: #40a9ff !important;
    padding: 2px 10px;
    color: #ffffff;
  }
}
.select-right-item-2 {
  .van-cell {
    background-color: #69c0ff !important;
    padding: 2px 10px;
  }
}
.select-right-item-3 {
  .van-cell {
    background-color: #91d5ff !important;
    padding: 2px 10px;
  }
}
.select-right-item-4 {
  .van-cell {
    background-color: #bae7ff !important;
    padding: 2px 10px;
  }
}

.van-collapse-item__content {
  padding: 2px 0;
}
</style>

然后点击每一个item,因为每次点击后台都要跑算法,所以加载时间不能忽略,添加了vant的loading组件,

然后写的过程中我还遇到了一个问题就是在我没加loading的之前点击请求,接口请求完了但是视图没更新,只有下次再点击的时候菜展示我要展示的列表。

后来我在watch里添加了监听,显然,效果不太明显,我就去写loading,奇怪的是我写完loading以后,居然可以用了,不知道是谁的功劳。

接口请求后如图:

97494f9e0654a1d1116aee88560d518.png

6293ef57e6e2ffb1e709dfee3800721.png

js代码:

export default {
  name: "SelectedTopicAssistant",
  data() {
    return {
      activeNames: [],
      activeNames0: [],
      leftList:[],
      rightList:[],
    };
  },
  components: {},
  watch: {
    leftList: function(n, o) {
      this.leftList = n
    }
  },
  created: function () {},
  mounted: function () {
      this.getHotWord()
  },
  methods: {
    getHotWord(){
        this.$http.post('/api').then(res=>{
            let data = res.data
            data.forEach((ele,index) => {
                //处理请求回来的数据,添加用来控制loading的字段
                ele.isLoading = true
                //分成左右两个列表,如果有更好的方法请一定要告诉我!!!!!
                if( index%2 == 0){
                    this.leftList.push(data[index])
                } else {
                    this.rightList.push(data[index])
                }
            });
        })
    },
    getList(id, index, list) {
      let formData = {
        proposals: JSON.stringify(id),
      };
      //这里的$qs是项目里封装好的处理数据格式的一个方法,看需求而定咯
      this.$http.post( "/api", this.$qs.stringify(formData) ) .then((response) => {
          let cellList = response.data.data.slice(0, 3);
          if(list == 'left'){
            //处理请求回来的数据,添加每一个item里要展示的数据列表
            this.leftList[index].list = cellList
            this.leftList[index].isLoading = false
          } else {
            this.rightList[index].list = cellList
            this.rightList[index].isLoading = false
          }
        });
    },
  },

最最最后边就是不落俗套的点击每一条数据查看详细内容,给列表添加一个点击方法就好了。

记录over ^-^。