Vueは左右メニュー連動実現(更新)
7433 ワード
title:Vue実現左右メニュー連動実現date:2018-08-11 16:31:34 tags: Vue 左右連動top:100 copyright:true 知っている
個人ブログ
Github
ソース転送ゲート:Rain 120/vue-study
掘金コメントのニーズに応じて、データインタフェースを更新し、いくつかの問題を修正しました.
以前、テイクアウトソフトでこの左右連動の効果を見て面白かったので、
このコンポーネントは2つの部分に分けられ、1、左メニューです.2、右メニュー.
ダイナミックデータ構造
Dataデータは、ユーザがカスタマイズしてコンテンツを追加し、
左メニューの
右メニューの
ここは
もちろんこれはサブアセンブリなので、親アセンブリを介して
このビジネスシーンでは、右のメニューのスクロールの高さに基づいて左のメニューの位置を計算することを実現しています.もちろん、左のメニューもクリックすることで右のメニューがどれだけスクロールする必要があるかを決定することができます.では、どのようにして容器のスクロールの距離を得るのでしょうか.以前はbetter-scrollを使用していましたが、ドキュメントを読むことで
右のメニューの
method
傍受されたposを出してみましょう
コンソールから現在スクロールされているpos情報が表示されているのを見ることができます.移動端の開発では、座標軸は私たちの数学の座標軸とは逆なので、スライド時のy軸の値は負数です.
ユーザーがスクロールしている場合、現在のスクロール距離の実際の区間を計算し、
従って、現在左メニュー
ここに
使用
ここで私たちは基本的にこれらのニーズを達成しました
個人ブログ
Github
ソース転送ゲート:Rain 120/vue-study
掘金コメントのニーズに応じて、データインタフェースを更新し、いくつかの問題を修正しました.
以前、テイクアウトソフトでこの左右連動の効果を見て面白かったので、
Vue
を使って実現してみましたが、この連動を単独のコンポーネントに引き離して、くだらないことは言わないで、まず効果図を1枚ください.このコンポーネントは2つの部分に分けられ、1、左メニューです.2、右メニュー.
ダイナミックデータ構造
menus: [
{
name: ' 1',
data: [
{
name: '1.1'
},
{
name: '1.2'
},
{
name: '1.3'
},
{
name: '1.4'
},
{
name: '1.5'
},
{
name: '1.6'
}
]
}
]
Dataデータは、ユーザがカスタマイズしてコンテンツを追加し、
DOM
をレンダリングする左メニューの
DOM
構造"left-menu"
:data="menus"
ref="leftMenu">
"left-menu-container">
- "left-item"
ref="leftItem"
:class="{'current': currentIndex === index}"
@click="selectLeft(index, $event)"
v-for="(menu, index) in menus"
:key="index">
"text">{{menu.name}}
右メニューの
DOM
構造"right-menu"
:data="menus"
ref="rightMenu"
@scroll="scrollHeight"
:listenScroll="true"
:probeType="3">
"right-menu-container">
- "right-item" ref="rightItem" v-for="(menu, i) in menus" :key="i">
"title">{{menu.name}}
- "(item, j) in menu.data" :key="j">
"data-wrapper">
"data">{{item.name}}
ここは
demo
を作るためなので、データ上は単なる捏造です.もちろんこれはサブアセンブリなので、親アセンブリを介して
props
を渡すので、props
を定義します.props: {
menus: {
required: true,
type: Array,
default () {
return []
}
}
},
このビジネスシーンでは、右のメニューのスクロールの高さに基づいて左のメニューの位置を計算することを実現しています.もちろん、左のメニューもクリックすることで右のメニューがどれだけスクロールする必要があるかを決定することができます.では、どのようにして容器のスクロールの距離を得るのでしょうか.以前はbetter-scrollを使用していましたが、ドキュメントを読むことで
scroll
のイベントがあることがわかり、このイベントを傍受することでスクロールしたpos
を取得することができます.if (this.listenScroll) {
let me = this
this.scroll.on('scroll', (pos) => {
me.$emit('scroll', pos)
})
}
右のメニューの
scroll
コンポーネントでscrollイベントを傍受しました@scroll="scrollHeight"
method
scrollHeight (pos) {
console.log(pos);
this.scrollY = Math.abs(Math.round(pos.y))
},
傍受されたposを出してみましょう
コンソールから現在スクロールされているpos情報が表示されているのを見ることができます.移動端の開発では、座標軸は私たちの数学の座標軸とは逆なので、スライド時のy軸の値は負数です.
li
の高さを手に入れることができます _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)
}
DOM
というcreated
の後にこの計算高さの関数を呼び出します _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)
}
ユーザーがスクロールしている場合、現在のスクロール距離の実際の区間を計算し、
hook
を取得する必要があります.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
であるべきメニュー項目index = 1
以上が左メニューである右メニューのスライド連動による実現であり、ユーザも左メニューをクリックすることにより右メニューの連動を実現することができ、この場合、メニュー項目にactive
を加える@click="selectLeft(index, $event)"
ここに
click
を付けるのは、オリジナルクリックイベントかbetter-scroll配布イベントかを区別するためですselectLeft (index, event) {
if (!event._constructed) {
return
}
let rightItem = this.$refs.rightItem
let el = rightItem[index]
this.$refs.rightMenu.scrollToElement(el, 300)
},
使用
"menus">
ここで私たちは基本的にこれらのニーズを達成しました