Vue中实现左右联动

使用插件为better-scroll

在安装better-scroll插件时因为我的文件夹有中文(本地大目录,项目我不会用中文),一直报错,后面修改了文件夹名称就可以了,我也并不能很肯定是这个问题导致的报错,有知道的可以告知一声谢谢

借鉴https://segmentfault.com/a/1190000015970841
但此文章中左边菜单并没有实现监听联动,所以自己手动增加了左边菜单的监听(其实也就几句代码)

import Scroll from '../components/scroll    这个文件的引用可以去上面文章中找到对应的文件复制源码到本地即可,实在找不到可以留言

源码附上  

<template>

  <div class="cascad-menu" ref="cascadMenu">

    <scroll

      class="left-menu"

      ref="leftMenu">

      <div class="left-menu-container">

        <ul>

          <li

            class="left-item"

            ref="leftItem"

            :class="{'current': currentIndex=== index}"

            @click="selectLeft(index, $event)"

            v-for="(menu, index) in menus"

            :key="index">

            <p class="text">{{menu.name}}</p>

          </li>

        </ul>

      </div>

    </scroll>

    <scroll

      class="right-menu"

      ref="rightMenu"

      @scroll="scrollHeight"

      :listenScroll="true"

      :probeType="3">

      <div class="right-menu-container">

        <ul>

          <li class="right-item" ref="rightItem" v-for="(menu, i) in menus" :key="i">

            <div class="title">{{menu.name}}</div>

            <ul>

              <li v-for="(item, j) in menu.data" :key="j">

                <div class="data-wrapper">

                  <div class="data">{{item.name}}</div>

                </div>

              </li>

            </ul>

          </li>

        </ul>

      </div>

    </scroll>

  </div>

</template>

<script>

import BScroll from 'better-scroll'

import Scroll from '../components/scroll'

export default {

  data() {

    return {

      rightTops: [],

      leftTops: [],

      scrollY: 0,

      leftScrollY: 0,

      menus:[

                {

                    name: '菜单1',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单2',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单3',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单1',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单2',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单3',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单1',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单2',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单3',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单1',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单2',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单3',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单1',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单2',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

                {

                    name: '菜单3',

                    data: [

                    {

                        name: '1.1'

                    },

                    {

                        name: '1.2'

                    },

                    {

                        name: '1.3'

                    },

                    {

                        name: '1.4'

                    },

                    {

                        name: '1.5'

                    },

                    {

                        name: '1.6'

                    }

                    ]

                },

            ]

    }

  },

  props: {

  },

  computed: {

    currentIndex () {

      const { scrollY, rightTops } = this

      let index = rightTops.findIndex((height, index) => {

        return scrollY >= rightTops[index] && scrollY < rightTops[index + 1]

      })

      if (scrollY > rightTops[index] + 50) {

        index++;

      }

      console.log("index",index);

    if(index>=1){

        let leftItem = this.$refs.leftItem

        let el = leftItem[index-1]

      this.$refs.leftMenu.scrollToElement(el, 300)

    }

      return index

    }

  },

  created() {

    this.$nextTick(() => {

        this._calculateLeftHeight()

        this._calculateHeight()

    })

  },

  methods: {

    selectLeft (index, event) {

      console.log(index);

      if (!event._constructed) {

        return

      }

      let rightItem = this.$refs.rightItem

      let el = rightItem[index]

      this.$refs.rightMenu.scrollToElement(el, 300)

    },

    scrollHeight (pos) {

    //   console.log(pos);

      this.scrollY = Math.abs(Math.round(pos.y))

    },

    _calculateHeight() {

      let lis = this.$refs.rightItem;

      console.log(lis)

      let height = 0

      this.rightTops.push(height)

      Array.prototype.slice.call(lis).forEach(li => {

        height += li.clientHeight

        this.rightTops.push(height)

      })

      console.log(this.rightTops)

    },

    _calculateLeftHeight() {

      let lis = this.$refs.leftItem;

      console.log(lis)

      let height = 0

      this.leftTops.push(height)

      Array.prototype.slice.call(lis).forEach(li => {

        height += li.clientHeight

        this.leftTops.push(height)

      })

      console.log("this.leftTops",this.leftTops)

    },

  },

  components: {

    Scroll

  }

}

</script>

<style lang="" scoped>

    ul li{

        list-style-type:none;

    }

  .cascad-menu{

    display:flex;

    position: absolute;

    top :100px;

    bottom: 100px;

    width: 100%;

    border: 1px solid red;

    overflow: hidden;

  }

  .left-menu{

    flex: 0 0 30%;

    width: 30%;

    background: #f3f5f7;

  }

  .left-item{

    height: 54px;

    width: 100%;

    margin-left: -20px;

  }

  .current{

    width: 155%;

    margin-left :-40px;

    text-align:center;

    background: #fff;

  }

  .text{

    width : 100%;

    line-height : 54px;

    }

  .right-menu{

      flex:1

  }

  .right-item{

    height: 100%;

    margin-left :-40px;

    border: 1px solid #ccc;

  }

  .title{

    border-bottom :1px solid #ccc;

    height :20px;

  }

  .data{

        line-height: 40px;

        height: 40px;

        margin-left: -40px;

    }

</style>

后续就可以根据自己的需求去修改界面啦!!!

第一次发,见谅~

侵权的话请告知哦~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个简单的示例,展示了如何在uniapp使用vue3实现左右联动: ``` <template> <view class="container"> <view class="left-list"> <view class="list-item" :class="{ active: activeIndex === index }" v-for="(item, index) in leftList" :key="index" @click="handleClickLeft(index)" > {{ item }} </view> </view> <view class="right-list"> <view class="list-item" v-for="(item, index) in rightList" :key="index" v-show="activeIndex === index" > {{ item }} </view> </view> </view> </template> <script> import { reactive } from 'vue'; export default { setup() { const state = reactive({ leftList: ['A', 'B', 'C', 'D'], rightList: [ ['A1', 'A2', 'A3'], ['B1', 'B2', 'B3'], ['C1', 'C2', 'C3'], ['D1', 'D2', 'D3'], ], activeIndex: 0, }); const handleClickLeft = (index) => { state.activeIndex = index; }; return { state, handleClickLeft, }; }, }; </script> <style> .container { display: flex; flex-direction: row; justify-content: space-between; height: 100vh; } .left-list { width: 200rpx; background-color: #eee; overflow-y: scroll; } .right-list { flex: 1; background-color: #fff; overflow-y: scroll; } .list-item { height: 100rpx; line-height: 100rpx; text-align: center; } .list-item.active { background-color: #f00; color: #fff; } </style> ``` 在这个示例,我们使用了`reactive`函数创建了一个响应式对象`state`,其包含了左侧列表和右侧列表的数据以及当前选的索引。我们通过`v-for`指令渲染了左侧列表和右侧列表,并使用`v-show`指令控制右侧列表的显示。当左侧列表的某一项被点击时,我们更新了`activeIndex`的值,从而实现左右联动的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值