Declarative development tab in Vue

Tab case

First, CSS style

* {
      margin: 0;
      padding: 0;
    }

    .tab ul {
      overflow: hidden;
      padding: 0;
      margin: 0;
    }

    .tab ul li {
      box-sizing: border-box;
      padding: 0;
      float: left;
      width: 100px;
      height: 45px;
      line-height: 45px;
      list-style: none;
      text-align: center;
      border-top: 1px solid blue;
      border-right: 1px solid blue;
      cursor: default
    }

    .tab ul li:first-child {
      border-left: 1px solid blue;
    }

    .tab ul li.active {
      background-color: orange;
    }

    .tab div {
      width: 500px;
      height: 300px;
      display: none;
      text-align: center;
      font-size: 30px;
      line-height: 300px;
      border: 1px solid blue;
      border-top: 0px;
    }

    .tab div.current {
      display: block;
    }

Second, structure

<div id="app">
    <div class="tab">
      <ul>
        <li class="active">apple</li>
        <li>orange</li>
        <li>lemon</li>
      </ul>
      <div class="current">
        <img src="img/apple.png">
      </div>
      <div>
        <img src="img/orange.png">
      </div>
      <div>
        <img src="img/lemon.png">
      </div>
    </div>
  </div>

Third: JS logic

var vm = new Vue({
      el: '#app',
      data: {
      },
    methods: {
     }
)}

The following is the result of the HTML structure and JS code

1. HTML structure

<div id="app">
    <div class="tab">
      <!--  tab  -->
      <ul>
        <!-- dynamically bound class with active class name highlighted without active not highlighted-->
        <li @click="change(index)" :class='currentIndex==index?"active":""' v-for="(item, index) in list"
          :key="item.id">
          {{item.title}}</li>
      </ul>
      <!--  Corresponding displayed images -->
      <! -- dynamically bound class with current class name shown without current hidden-->
      <div :class="currentIndex==index?'current':''" v-for="(item, index) in list" :key="item.id"><img :src="item.path">
      </div>
    </div>
  </div>

2. JS logic

let vm = new Vue({
      el: '#app',
      data: {
        currentIndex: 0,// The current index of the tab defaults to 0  
        list: [{
          id: 1,
          title: 'apple',
          path: 'img/apple.png'
        },
        {
          id: 2,
          title: 'orange',
          path: 'img/orange.png'
        },
        {
          id: 3,
          title: 'lemon',
          path: 'img/lemon.png'
        }]
      },
      methods: {
        // The currentIndex is equal to the clicked index value by passing in the index 
        // thus controlling the class name    
        change(index) {
          this.currentIndex = index
        }
      }
    })

Tab view

Read More: