摘要:動態(tài)數(shù)據(jù)結(jié)構(gòu)菜單數(shù)據(jù)是用戶自定義增加一些內(nèi)容,并渲染左菜單的結(jié)構(gòu)右菜單的結(jié)構(gòu)這里是為了做,所以在數(shù)據(jù)上只是單純捏造。
知乎
個(gè)人博客
Github
源碼傳送門:Rain120/vue-study
根據(jù)掘金評論需求,更新了數(shù)據(jù)接口并修復(fù)了一些問題之前在外賣軟件上看到這個(gè)左右聯(lián)動的效果,覺得很有意思,所以就嘗試使用Vue來實(shí)現(xiàn),將這個(gè)聯(lián)動抽離成為一個(gè)多帶帶的組件,廢話少說,先來一張效果圖。
這個(gè)組件分為兩個(gè)部分,1、左菜單;2、右菜單。
動態(tài)數(shù)據(jù)結(jié)構(gòu)
menus: [ { name: "菜單1", data: [ { name: "1.1" }, { name: "1.2" }, { name: "1.3" }, { name: "1.4" }, { name: "1.5" }, { name: "1.6" } ] } ]
data數(shù)據(jù)是用戶自定義增加一些內(nèi)容,并渲染DOM
左菜單的DOM結(jié)構(gòu)
右菜單的DOM結(jié)構(gòu)
這里是為了做demo,所以在數(shù)據(jù)上只是單純捏造。
當(dāng)然因?yàn)檫@是個(gè)子組件,我們將通過父組件傳遞props,所以定義props
props: { menus: { required: true, type: Array, default () { return [] } } },
在這個(gè)業(yè)務(wù)場景中,我們的實(shí)現(xiàn)方式是根據(jù)右邊菜單滾動的高度來計(jì)算左邊菜單的位置,當(dāng)然左邊菜單也可以通過點(diǎn)擊來確定右邊菜單需要滾動多高的距離,那么我們?nèi)绾潍@得該容器滾動的距離呢?
之前一直在使用better-scroll,通過閱讀文檔,我們知道它有有scroll事件,我們可以通過監(jiān)聽這個(gè)事件來獲取滾動的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打出來看看
我們可以看到控制臺打出了當(dāng)前滾動的pos信息,因?yàn)樵谝苿佣碎_發(fā)時(shí),坐標(biāo)軸和我們數(shù)學(xué)中的坐標(biāo)軸相反,所以上滑時(shí)y軸的值是負(fù)數(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這個(gè)hook之后調(diào)用這個(gè)計(jì)算高度的函數(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) }
當(dāng)用戶在滾動時(shí),我們需要計(jì)算當(dāng)前滾動距離實(shí)在那個(gè)區(qū)間內(nèi),并拿到他的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 } }
所以當(dāng)前應(yīng)該是左邊菜單index = 1的菜單項(xiàng)active
以上是左邊菜單根據(jù)右邊菜單的滑動聯(lián)動的實(shí)現(xiàn),用戶也可以通過點(diǎn)擊左邊菜單來實(shí)現(xiàn)右邊菜單的聯(lián)動,此時(shí),我們給菜單項(xiàng)加上click事件
@click="selectLeft(index, $event)"
這里加上$event是為了區(qū)分原生點(diǎn)擊事件還是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) },
使用
到這里我們就基本上完成了這些需求了
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96836.html
摘要:如下圖要實(shí)現(xiàn)的功能如下勾選三級聯(lián)動的材料勾選最后一級的材料把勾選的材料信息動態(tài)添加到下面表格中數(shù)據(jù)三級聯(lián)動數(shù)據(jù)材料鍵值對選中的材料從后臺獲取三級聯(lián)動數(shù)據(jù)調(diào)用封裝的函數(shù)把最后一項(xiàng)添加到函數(shù)中獲取最后一級材料函數(shù)遍歷材料樹如果有下級材料就一直 如下圖,要實(shí)現(xiàn)的功能如下,勾選三級聯(lián)動的材料,勾選最后一級的材料,把勾選的材料信息動態(tài)添加到下面表格中showImg(https://segment...
摘要:因?yàn)橛X得這個(gè)是在項(xiàng)目中最常用的功能,提取出來方便復(fù)用的才是組件然而我才發(fā)現(xiàn)這個(gè)想法是有問題的。聯(lián)動思考悟緣起于最近的一個(gè)表單開發(fā),頁面上有個(gè)是聯(lián)動菜單的選項(xiàng)。兩個(gè)組件放在不同的板塊內(nèi),相互獨(dú)立,方便管理和維護(hù)。 今天在家躺了一天,直到晚上才考慮清楚,當(dāng)人沒有明確目標(biāo)的時(shí)候,太容易被環(huán)境影響了。目標(biāo)需要切合實(shí)際,至于和實(shí)際之間的距離,取決于當(dāng)前認(rèn)知的正確和全面。 既有認(rèn)知(誤) 一般說到...
摘要:里邊涉及到的指令是自定義的指令,為了處理移動端的點(diǎn)擊操作,我還整理了一片陋文移動點(diǎn)擊長按滑動指令然后這個(gè)組件的源碼我放在了我出來的項(xiàng)目上謝謝各位品嘗, 以下這段都是廢話,請?zhí)^ 公司移動端開發(fā)平臺進(jìn)行了大變革,前端架構(gòu)由DCloud大生態(tài)轉(zhuǎn)換為VUE,所以移動端的UI組件庫從MUI改為使用MintUI,然后開始大刀闊斧的把MintUI組件改成MUI組件的樣子,然后發(fā)現(xiàn)少了幾個(gè)較為常用的...
餓了么 vue 項(xiàng)目總結(jié) 項(xiàng)目效果預(yù)覽 ele效果預(yù)覽項(xiàng)目源碼地址 ele源碼跟著慕課網(wǎng)黃軼老師 敲餓了么 vue 項(xiàng)目 作者項(xiàng)目源代碼地址 項(xiàng)目完成之后 npm run build 這本來是寫在最后面一段的,我現(xiàn)在把他寫在了最前面,方便我們事先知道,整個(gè)項(xiàng)目做完之后是什么樣子的 項(xiàng)目完成之后在 根目錄 下 npm run build (就是 npm run dev 的那個(gè)目錄) 會在根目錄...
摘要:最近用仿寫途牛旅行遇到了這樣的城市列表選擇頁面,花了些時(shí)間,用實(shí)現(xiàn)了一下并讓它體驗(yàn)的接近安卓原生組件很多地方都會有這樣的側(cè)邊欄字母列表菜單,可以滑動實(shí)現(xiàn)內(nèi)容列表聯(lián)動。 最近用vue仿寫途牛旅行APP 遇到了這樣的城市列表選擇頁面,花了些時(shí)間,用Vue實(shí)現(xiàn)了一下并讓它體驗(yàn)的接近 安卓/IOS 原生組件 很多地方都會有這樣的側(cè)邊欄字母列表菜單,可以滑動實(shí)現(xiàn)內(nèi)容列表聯(lián)動。 比如手機(jī)通訊錄,城...
閱讀 2910·2021-11-11 10:58
閱讀 1958·2021-10-11 10:59
閱讀 3521·2019-08-29 16:23
閱讀 2365·2019-08-29 11:11
閱讀 2812·2019-08-28 17:59
閱讀 3882·2019-08-27 10:56
閱讀 2115·2019-08-23 18:37
閱讀 3139·2019-08-23 16:53