zoukankan      html  css  js  c++  java
  • uniapp 创建简单的tabs

    tabs组件

    <template>
      <view class="tabs">
        <view class="bar" :style="barStyle"><view class="inner"></view></view>
        <view v-for="(it, index) of tabs" :key="it" class="item" :class="{ active: active === index }" @click="onClick(index, $event)">
          <text>{{ it }}</text>
        </view>
      </view>
    </template>
    
    <script>
    export default {
      name: 'my-tabs',
      props: {
        tabs: {
          type: Array,
          default: () => []
        },
    
        // 选中默认index
        active: {
          type: Number,
          default: 0
        }
      },
      data() {
        return {
          barStyle: {
            transform: 'translateX(0%)'
          }
        };
      },
      methods: {
        onClick(index, $event) {
          this.$emit('onClick', index);
          if (index !== this.active) {
            this.$emit('onChange', index);
          }
        }
      },
      watch: {
        tabs: {
          handler: function(val) {
            this.barStyle.width = `${100 / val.length}%`;
          },
          immediate: true
        },
        active: {
          handler: function(val) {
            // animated
            this.barStyle.transform = `translateX(${val * 100}%)`;
          },
          immediate: true
        }
      }
    };
    </script>
    
    <style lang="stylus" scoped>
    .tabs
      position relative
      display flex
      align-items center
      background-color #fff
      .item
        display flex
        flex 1
        align-items center
        justify-content center
        padding 30rpx
        font-size 30rpx
        transition ease 0.3s
        &.active
          color red
          transition color ease 0.3s
    .bar
      position absolute
      left 0
      bottom 0
      height 6rpx
      transition transform ease 0.3s
      display flex
      align-items center
      justify-content center
      .inner
        width 100%
        height 100%
        box-sizing border-box
        margin 0 20rpx
        border-radius 18rpx
        background-color red
    </style>
    

    使用

        <myTabs :tabs="tabs" :active="active" @onChange="active = $event"></myTabs>
        <view v-if="active == 0" class="list1">list1</view>
        <view v-if="active == 1" class="list2">list2</view>
    
    import myTabs from '@/shared/widgets/my-tabs.vue';
    export default {
      components: { myTabs },
      data() {
        return {
          tabs: ['t0', 't1'],
          active: 0
        };
      },
      methods: {}
    };
    

  • 相关阅读:
    Thinking in Java Reading Note(9.接口)
    Thinking in java Reading Note(8.多态)
    Thinking in Java Reading Note(7.复用类)
    SQL必知必会
    Thinking in Java Reading Note(5.初始化与清理)
    Thinking in Java Reading Note(2.一切都是对象)
    鸟哥的Linux私房菜笔记(1.基础)
    Thinking in Java Reading Note(1.对象导论)
    CoreJava2 Reading Note(2:I/O)
    CoreJava2 Reading Note(1:Stream)
  • 原文地址:https://www.cnblogs.com/ajanuw/p/13321322.html
Copyright © 2011-2022 走看看