tabs实现

<template>
  <div>
    <div v-for="(item, index) in tabs"
      :key="index"
      class="coursespecialtyView-tabs-txt"
      :class="{active: isActive(index)}"
      @click="changeTab(item, index)">
      {{ item.label }}
    </div>
	</div>
</template>
<script>
export default {
  data() {
    return {
    	tabs: [{label: '课程介绍', value: 0}, {label: '课程目录', value: 1}, {label: '版权证明', value: 2}],
			active: 0,
    }
	},
  methods: {
    changeTab(item, index) {
      this.active = index;
      // TODO: 切换tab的相关操作
    },
  },
  computed: {
    isActive() {
      return (index) => {
        return this.active === index;
      };
    },
  },
}
<style>
	.tabs {
    padding: 15px;
    background: #e3ecf5;
    display: flex;
    align-items: center;

    &-txt {
      flex: none;
      margin-right: 65px;

      font-size: 16px;
      color: #101010;

      &.active {
        position: relative;
        color: #0060ff;

        &::before {
          content: '';
          position: absolute;
          left: 50%;
          bottom: -10px;
          transform: translateX(-50%);
          width: 76px;
          height: 6px;
          border-radius: 5px;
          background: #0060ff;
        }
      }
    }
  }
</style>

首先我们看到的是计算属性的定义:

computed: {
  isActive() {
    return (index) => {
      return this.active === index;
    };
  },
},

这里的 isActive 会返回一个函数,这个函数的参数是索引值 index,返回值是当前索引值是否被选中,即布尔值。其中,箭头函数 (index) => {...} 是语法糖,相当于普通函数 function (index) {...}。这里的 return 语句是返回一个表达式,即 this.active === index,表示当前的索引值是否等于选中的索引值,如果相等则为 true,否则为 false

接下来我们看下计算属性的使用:

:class="{active: isActive(index)}"

这里的 :class 是 CSS 类绑定的语法糖,表示如果计算属性 isActive(index) 返回值为 true,则添加 CSS 类 active,否则不添加。而 isActive(index) 是通过当前迭代的 index 作为参数调用计算属性 isActive,传递给该计算属性的函数作为索引值,然后该函数返回当前索引值是否被选中的布尔值。

在这个过程中,使用箭头函数的目的是将 isActive 定义为函数返回函数的形式,这样我们可以在模板中使用 isActive(index) 的方式直接调用,而不需要在 methods 中定义相应的方法。这样做的好处是使代码更简洁,也更易于理解,同时也避免了在模板中定义方法的一些限制。