大麦网列表页

184 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

一。大麦网列表页

要求:点击数据时对应数据会有高亮,且演唱会的内容会根据城市/分类进行切换(可以用到计算属性来做)

1.页面布局(:key="item.id"也可以写成:key="index",如果只是用来展示数据的话可以用index)

 <div class="root">
  <ul>
    <li>城市:</li>
    <li
      v-for="(item,index) in citys"
      :key="item.id"
      @click="changecity(index,item.id)"
      :class="{active:avtiveIndex==index}"
    >
      {{item.city}}
    </li>
  </ul>
  <ul>
    <li>分类:</li>
    <li
      v-for="(item,index) in types"
      :key="item.id"
      @click="changetype(index)"
      :class="{active:avtiveIndex1==index}"
    >
      {{item.type}}
    </li>
  </ul>
  <ol>
    <li v-for="(item,index) in full" :key="item.id">
      <div>
        <img :src="item.img" alt="" />
      </div>
      <div class="left">
        <p>{{item.title}}</p>
        <p>{{item.type}}</p>
        <p>{{item.city}}</p>
        <p>{{item.time}}</p>
      </div>
    </li>
  </ol>
</div>

2。页面样式

    * {
    margin: 0;
    padding: 0;
    list-style: none;
    box-sizing: border-box;
  }
  ul {
    display: flex;
  }
  li {
    padding: 2px 10px;
    margin: 10px;
  }
  img {
    width: 150px;
    height: 200px;
  }
  ol > li {
    display: flex;
    border: 1px solid #ccc;
  }
  .left p {
    margin: 15px;
  }
  .active {
    background-color: lightsalmon;
  }
  

3.vue(用到了axios获取数据内容,以及异步等待,需要引入axios)

filer返回满足条件的内容形成一个新的数组,对原数组不会产生影响,所以只需要找到音乐会里的内容等于点击的内容并返回即可

   new Vue({
    el: ".root",
    data: {
      // 城市高亮索引
      avtiveIndex: 0,
      //   分类高亮索引
      avtiveIndex1: 0,
      //定义城市数组
      citys: [],
      //   定义分类数组
      types: [],
      //   定义演唱会内容数组
      lists: [],
    },
    methods: {

获取城市数据

      async city() {
        let { data } = await axios.get("./city.json");
        this.citys = data;
      },

获取分类数据

      async type() {
        let { data } = await axios.get("./type.json");
        this.types = data;
      },

获取演唱会内容数据

      async list() {
        let { data } = await axios.get("./show.json");
        this.lists = data;
      },
      changecity(index) {
        //   城市高亮索引等于对应的索引
        this.avtiveIndex = index;
      },
      changetype(index) {
        //   分类高亮索引等于对应的索引
        this.avtiveIndex1 = index;
      },
    },
    // 计算属性
    computed: {
      full() {
        //   定义一个空数组
        let data = [];

如果城市高亮索引大于0,返回演唱会内容中地点和点击的城市相等的数据

        if (this.avtiveIndex > 0) {
          data = this.lists.filter(
            (r) => r.city == this.citys[this.avtiveIndex].city
          );
        } else {
          // 否则data=lists数组的数据,也就是高亮索引为0的时候展示全部信息
          data = this.lists;
        }

如果演唱会索引大于0,会返回data中类型等于点击的类型的数据

        if (this.avtiveIndex1 > 0) {
          data = data.filter(
            (r) => r.type == this.types[this.avtiveIndex1].type
          );
        }
        // 最后返回data数组
        return data;
      },
    },
    // 页面创建完成
    created() {
      // 调用获取城市数据
      this.city();
      // 调用获取分类数据
      this.type();
      // 调用获取演唱会内容数据
      this.list();
    },
  })
    

全部数据 image.png

点击是根据点击的内容返回对应的数据 image.png