cube-ui实现tab跟页面联动

1,408 阅读2分钟

cube-ui实现tab跟页面联动

看了vue3.0重构饿了么,里面讲到cube-ui的使用。记下来tab跟页面如何联动

1

2

template

template

<cube-tab-bar :useTransition=false
                    :showSlider="true"
                    v-model="selectedLabel"
                    :data="tabs"
                    ref="tabBar"
                    class="border-bottom-1px">
      </cube-tab-bar>
      <div class="slide-wrapper">
        <cube-slide :loop=false
                    :auto-play=false
                    :show-dots=false
                    :initial-index="index"
                    ref="slide"
                    :options="slideOptions"
                    @scroll="onScroll"
                    @change="onChange">
          <cube-slide-item>
            <ul>
              <li>asdasdasd</li>
              <li>asdasdasd</li>
              <li>asdasdasd</li>
              <li>123123124124123123</li>
              <li>123123124124123123</li>
              <li>123123124124123123</li>
              <li>123123124124123123</li>
            </ul>
          </cube-slide-item>
          <cube-slide-item>
            asdghashdgjasjhd
          </cube-slide-item>
          <cube-slide-item>
            <HelloWorld></HelloWorld>
          </cube-slide-item>
        </cube-slide>
      </div>

js

js

data () {
    return {
      index: 0,
      tabs: [{
        label: '商品'
      }, {
        label: '评价'
      }, {
        label: '商家'
      }],
      slideOptions: {
        listenScroll: true, // 是否监控scroll事件
        probeType: 3, // 0 不派发scroll事件,1:非实时;2:滑动过程中;3:不仅在屏幕滑动的过程中,而且momentum 滚动动画运行过程中实时派发
        directionLockThreshold: 0
      }
    }
  },
  components: {
    HelloWorld  //这里是新建vue-cli出来的组件。直接拿来用
  },
  methods: {
    onScroll (pos) {
      // cube-slide的scroll事件,滚动中实时派发,获取到滚动位置的坐标值,也可以传值x,y来获取
      // 滚动slide的时候,tab实时改变
      // 原理是:先获取tabBar和slide的宽度,然后获取到滚动位置的坐标值,坐标值/slideWidth得到滚动的比例,然后*tabBarWidth,实时得到
      // tab下划线的滚动位置
      const tabBarWidth = this.$refs.tabBar.$el.clientWidth
      const slideWidth = this.$refs.slide.slide.scrollerWidth
      const transform = -pos.x / slideWidth * tabBarWidth
      this.$refs.tabBar.setSliderTransform(transform)  // 调用cube-tab的setSliderTransform方法,参数就是上面得到的值
    },
    onChange (current) {
      // silde 页面切换时触发change事件,返回当前的索引值,然后赋值给this.index
      // this.index改变的话,会触发selectedLabel重新计算,然后cube-tab就会进行新的计算,就可以完成切换了
      this.index = current 
    }
  },
  computed: {
    selectedLabel: {
      get () {
        return this.tabs[this.index].label
      },
      // 点击tab的时候设置selectedLabel,
      // 计算当前index是什么,
      set (newVal) {
        this.index = this.tabs.findIndex((value) => {
          return value.label === newVal
        })
      }
    }
  },