欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue實現(xiàn)左右菜單聯(lián)動實現(xiàn)代碼

 更新時間:2018年08月12日 11:23:46   作者:Rain120  
這篇文章主要介紹了Vue實現(xiàn)左右菜單聯(lián)動實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文介紹了Vue實現(xiàn)左右菜單聯(lián)動實現(xiàn)代碼嗎,分享給大家,也給自己留個筆記,具體如下:

Github

源碼傳送門: Rain120/vue-study

之前在外賣軟件上看到這個左右聯(lián)動的效果,覺得很有意思,所以就嘗試使用 Vue 來實現(xiàn),將這個聯(lián)動抽離成為一個單獨的組件,廢話少說,先來一張效果圖。

這個組件分為兩個部分,1、左菜單;2、右菜單。 左菜單的 DOM 結構

<scroll
 class="left-menu"
 :data="leftMenu"
 ref="leftMenu">
 <div class="left-menu-container">
 <ul>
  <li
  class="left-item"
  ref="leftItem"
  :class="{'current': currentIndex === index}"
  @click="selectLeft(index, $event)"
  v-for="(item, index) in leftMenu"
  :key="index">
  <p class="text">{{item}}</p>
  </li>
 </ul>
 </div>
</scroll>

右菜單的 DOM 結構

<scroll
 class="right-menu"
 :data="rightMenu" 
 ref="rightMenu"
 @scroll="scrollHeight"
 :listenScroll="true"
 :probeType="3">
 <div class="right-menu-container">
 <ul>
  <li class="right-item" ref="rightItem" v-for="(items, i) in rightMenu" :key="i">
  <div class="data-wrapper">
   <div class="title">{{items.title}}</div>
   <div class="data" v-for="(item, j) in items.data" :key="j">{{item}}</div>
  </div>
  </li>
 </ul>
 </div>
</scroll>

這里是為了做 demo ,所以在數(shù)據(jù)上只是單純捏造。

當然因為這是個子組件,我們將通過父組件傳遞 props ,所以定義 props

props: {
 leftMenu: {
 required: true,
 type: Array,
 default () {
  return []
 }
 },
 rightMenu: {
 required: true,
 type: Array,
 default () {
  return []
 }
 },
}

在這個業(yè)務場景中,我們的實現(xiàn)方式是根據(jù)右邊菜單滾動的高度來計算左邊菜單的位置,當然左邊菜單也可以通過點擊來確定右邊菜單需要滾動多高的距離,那么我們如何獲得該容器滾動的距離呢? 之前一直在使用better-scroll,通過閱讀文檔,我們知道它有有 scroll 事件,我們可以通過監(jiān)聽這個事件來獲取滾動的 pos

if (this.listenScroll) {
 let me = this
 this.scroll.on('scroll', (pos) => {
 me.$emit('scroll', pos)
 })
}

所以我們在右邊菜單的 scroll 組件上監(jiān)聽scroll事件

@scroll="scrollHeight"

method

scrollHeight (pos) {
 console.log(pos);
 this.scrollY = Math.abs(Math.round(pos.y))
},

我們將監(jiān)聽得到的pos打出來看看

我們可以看到控制臺打出了當前滾動的pos信息,因為在移動端開發(fā)時,坐標軸和我們數(shù)學中的坐標軸相反,所以上滑時y軸的值是負數(shù)

所以我們要得到每一塊 li 的高度,我們可以通過拿到他們的 DOM

 _calculateHeight() {
 let lis = this.$refs.rightItem;
 let height = 0
 this.rightHeight.push(height)
 Array.prototype.slice.call(lis).forEach(li => {
 height += li.clientHeight
 this.rightHeight.push(height)
 })
console.log(this.rightHeight)
}

我們在 created 這個 hook 之后調用這個計算高度的函數(shù)

 _calculateHeight() {
 let lis = this.$refs.rightItem;
 let height = 0
 this.rightHeight.push(height)
 Array.prototype.slice.call(lis).forEach(li => {
 height += li.clientHeight
 this.rightHeight.push(height)
 })
 console.log(this.rightHeight)
}

當用戶在滾動時,我們需要計算當前滾動距離實在那個區(qū)間內,并拿到他的 index

computed: {
 currentIndex () {
 const { scrollY, rightHeight } = this
 const index = rightHeight.findIndex((height, index) => {
  return scrollY >= rightHeight[index] && scrollY < rightHeight[index + 1]
 })
 return index > 0 ? index : 0
 }
}

所以當前應該是左邊菜單 index = 1 的菜單項 active 以上是左邊菜單根據(jù)右邊菜單的滑動聯(lián)動的實現(xiàn),用戶也可以通過點擊左邊菜單來實現(xiàn)右邊菜單的聯(lián)動,此時,我們給菜單項加上 click事件

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

這里加上 $event 是為了區(qū)分原生點擊事件還是[better-scroll]((https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/#better-scroll 是什么)派發(fā)的事件

selectLeft (index, event) {
 if (!event._constructed) {
 return
 }
 let rightItem = this.$refs.rightItem
 let el = rightItem[index]
 this.$refs.rightMenu.scrollToElement(el, 300)
},

到這里我們就基本上完成了這些需求了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • vue實現(xiàn)集成騰訊TIM即時通訊

    vue實現(xiàn)集成騰訊TIM即時通訊

    最近在做商城類的項目,需要使用到客服系統(tǒng),用戶選擇的騰訊IM即時通信,所以本文主要介紹了vue實現(xiàn)集成騰訊TIM即時通訊,感興趣的可以了解一下
    2021-06-06
  • Vue中跨域及打包部署到nginx跨域設置方法

    Vue中跨域及打包部署到nginx跨域設置方法

    這篇文章主要介紹了Vue中跨域以及打包部署到nginx跨域設置方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • JavaScript之Vue.js【入門基礎】

    JavaScript之Vue.js【入門基礎】

    本文主要介紹一下Vue.js并附上在Node.js環(huán)境下搭建一個簡單的Demo實例代碼。條理清晰,有助于閱讀和理解。有需要的朋友可以看下
    2016-12-12
  • 談談vue中mixin的一點理解

    談談vue中mixin的一點理解

    vue中提供了一種混合機制--mixins,用來更高效的實現(xiàn)組件內容的復用。下面給大家談談我對vue中mixin的一點理解,需要的朋友參考下吧
    2017-12-12
  • Vue前端柱狀圖實例(疊狀條形圖)

    Vue前端柱狀圖實例(疊狀條形圖)

    這篇文章主要介紹了Vue前端柱狀圖實例(疊狀條形圖),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • vue 實現(xiàn)cli3.0中使用proxy進行代理轉發(fā)

    vue 實現(xiàn)cli3.0中使用proxy進行代理轉發(fā)

    今天小編就為大家分享一篇vue 實現(xiàn)cli3.0中使用proxy進行代理轉發(fā),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • vue之字符串、數(shù)組之間的相互轉換方式

    vue之字符串、數(shù)組之間的相互轉換方式

    這篇文章主要介紹了vue之字符串、數(shù)組之間的相互轉換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Ant Design Vue table組件如何自定義分頁器

    Ant Design Vue table組件如何自定義分頁器

    這篇文章主要介紹了Ant Design Vue table組件如何自定義分頁器問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue+ElementUi實現(xiàn)點擊表格鏈接頁面跳轉和路由效果

    Vue+ElementUi實現(xiàn)點擊表格鏈接頁面跳轉和路由效果

    這篇文章主要介紹了Vue+ElementUi實現(xiàn)點擊表格中鏈接進行頁面跳轉和路由,本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 基于element-ui自定義封裝大文件上傳組件的案例分享

    基于element-ui自定義封裝大文件上傳組件的案例分享

    本文主要介紹了以element-ui基礎封裝大文件上傳的組件,包括斷點續(xù)傳,秒傳,上傳進度條,封裝思想邏輯來源于el-upload 組件源碼,文中有具體案例分享,需要的朋友可以參考下
    2024-01-01

最新評論