mpvue实现左侧导航与右侧内容的联动


Posted in Javascript onOctober 21, 2019

本文实例为大家分享了mpvue左侧导航与右侧内容联动的具体代码,供大家参考,具体内容如下

效果图如下:

mpvue实现左侧导航与右侧内容的联动

(1)左侧导航联动右侧内容

实现:点击左侧导航,右侧内容滑到对应的位置,并且导航上有current当前样式。

mpvue用的还是微信小程序提供的组件scroll-view,它里面有一个属性scroll-into-view,值为某子元素的id,滚动到该元素。

template:

<scroll-view class="menu-wrapper" scroll-y>
 <ul>
 <li class="menu-item"
 v-for="(item,index) in goods"
 :class="index===currentIndex ? 'current' : ''"
 :key="index"
 @tap="selectMenu(index)">
  {{item.name}}
 </li>
 </ul>
</scroll-view>
<scroll-view scroll-y
  :scroll-into-view="contentId"
  scroll-with-animation="true"
  class="foods-wrapper">
 <ul>
 <li v-for="(item,i) in goods"
 :id="'con_'+i"
 class="food-list food-list-hook" :key="i">
 </li>
 </ul>
<scroll-view>

js:

data() {
 return {
 goods: [],
 contentId: '', // 每个food-list的id,scroll-into-view滚动到对应的id
 currentIndex: 0
 }
},
methods: {
 selectMenu(index) {
 this.contentId = `con_${index}`
 this.currentIndex = index
 }
}

(2)在左侧导航联动右侧内容的基础上增加右侧内容联动左侧导航

实现:滑动右侧内容区域,给左侧对应导航增加current样式,并且当导航高度过长,会联动其滚动

补充:contentHeight是右侧内容scroll-view的高度,同时也是左侧导航scroll-view的高度,navItemHeight是导航ul下每一个item的高度,当导航下ul的高度超过scroll-view的高度,并且this.currentIndex * this.navItemHeight  > this.contentHeight,导航才向上滚动。

tempate:

<scroll-view class="menu-wrapper"
  :scroll-into-view="navId"
  scroll-with-animation="true"
  scroll-y>
 <ul class="menu-ul">
 <li class="menu-item"
 v-for="(item,index) in goods"
 :id="'nav_'+index"
 :class="index===currentIndex ? 'current' : ''"
 :key="index"
 @tap="selectMenu(index)">
  {{item.name}}
 </li>
 </ul>
</scroll-view>
<scroll-view scroll-y
  @scroll="onScroll"
  :scroll-into-view="contentId"
  scroll-with-animation="true"
  class="foods-wrapper">
 <ul>
 <li v-for="(item,i) in goods"
 :id="'con_'+i"
 class="food-list food-list-hook" :key="i">
 </li>
 </ul>
</scroll-view>

js:

export default{
 data() {
 return {
 goods: [],
 contentId: '', // 每个food-list的id,scroll-into-view滚动到对应的id
 navId: '', // 导航模块对应的id,用来联动内容区域
 currentIndex: 0,
 navulHeight: 0, // 导航里ul高度
 navItemHeight: 0, // 每个导航高度
 listHeight: [], // foods内部块的高度
 contentHeight: [], // 内容区域scroll-view高度
 }
 },
 watch: {
 currentIndex() {
 console.log(this.currentIndex)
 if (this.contentHeight < this.navulHeight) {
 let h = this.currentIndex * this.navItemHeight
 if (h > this.contentHeight) {
  // 导航滑动
  this.navId = `nav_${this.currentIndex}`
 } else {
  this.navId = 'nav_0'
 }
 }
 }
 },
 methods: {
 selectMenu(index) {
 this.contentId = `con_${index}`
 this.navId = `nav_${index}`
 this.currentIndex = index
 },
 onScroll(e) {
 this.contentId = ''
 let scrollTop = e.target.scrollTop
 // console.log(scrollTop)
 let length = this.listHeight.length
 if (scrollTop >= this.listHeight[length - 1] - this.contentHeight) {
 return
 } else if (scrollTop > 0 && scrollTop < this.listHeight[0]) {
 this.currentIndex = 0
 }
 for (let i = 0; i < length; i++) {
 if (scrollTop >= this.listHeight[i - 1] && scrollTop < this.listHeight[i]) {
  this.currentIndex = i
 }
 }
 // console.log(this.currentIndex)
 },
 getFoodHeight() {
 var query = wx.createSelectorQuery()
 let h = 0
 query.selectAll('.food-list-hook').boundingClientRect((rects) => {
 // console.log(rects)
 rects.forEach((rect) => {
  h += rect.height
  this.listHeight.push(h)
 })
 // console.log(this.listHeight)
 })
 query.select('.foods-wrapper').boundingClientRect((rect) => {
 this.contentHeight = rect.height
 })
 query.select('.menu-ul').boundingClientRect((rect) => {
 this.navulHeight = rect.height
 })
 query.select('.menu-item').boundingClientRect((rect) => {
 this.navItemHeight = rect.height
 }).exec()
 }
 },
 watch: {
 goods() {
 // 获取模块高度,即food-list
 setTimeout(() => {
 this.getFoodHeight()
 }, 60)
 }
 }
}

更多教程点击《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 多行滚动代码(附详细解释)
Jun 17 Javascript
javascript实现日历控件(年月日关闭按钮)
Dec 12 Javascript
javascript通过className来获取元素的简单示例代码
Jan 10 Javascript
Jquery中ajax方法data参数的用法小结
Feb 12 Javascript
JavaScript中的setMilliseconds()方法使用详解
Jun 11 Javascript
javascript制作幻灯片(360度全景图片)
Jul 28 Javascript
js实现简单计算器
Nov 22 Javascript
JavaScript解八皇后问题的方法总结
Jun 12 Javascript
打造自己的jQuery插件入门教程
Sep 23 Javascript
浅谈vuex 闲置状态重置方案
Jan 04 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
Oct 28 Javascript
vue element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
vue项目中常见问题及解决方案(推荐)
Oct 21 #Javascript
vue.js实现左边导航切换右边内容
Oct 21 #Javascript
vue+element树组件 实现树懒加载的过程详解
Oct 21 #Javascript
JavaScript函数IIFE使用详解
Oct 21 #Javascript
vue实现侧边栏导航效果
Oct 21 #Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
Oct 21 #Javascript
vue-cli基础配置及webpack配置修改的完整步骤
Oct 20 #Javascript
You might like
php教程之phpize使用方法
2014/02/12 PHP
PHP分页类集锦
2014/11/18 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
Python 查找字符在字符串中的位置实例
2018/05/02 Python
matplotlib实现区域颜色填充
2019/03/18 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
Python networkx包的实现
2020/02/14 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
what is the difference between ext2 and ext3
2013/11/03 面试题
工商管理应届生求职信
2013/10/07 职场文书
魅力教师事迹材料
2014/01/10 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
英语专业自荐书
2014/06/13 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书
Vue全局事件总线你了解吗
2022/02/24 Vue.js
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python