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 相关文章推荐
在html页面中包含共享页面的方法
Oct 24 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
javascript的内存管理详解
Aug 07 Javascript
浅析JavaScript中的类型和对象
Nov 29 Javascript
js格式化金额可选是否带千分位以及保留精度
Jan 28 Javascript
浅谈javascript的分号的使用
May 12 Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 Javascript
vue2.0 父组件给子组件传递数据的方法
Jan 15 Javascript
js简单遍历获取对象中的属性值的方法示例
Jun 19 Javascript
详解将微信小程序接口Promise化并使用async函数
Aug 05 Javascript
Vue.set 全局操作简单示例
Sep 19 Javascript
一分钟学会JavaScript中的try-catch
Dec 14 Javascript
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微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
Python金融数据可视化汇总
2017/11/17 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
公务员转正考察材料
2014/02/07 职场文书
《美丽的小路》教学反思
2014/02/26 职场文书
社区工作者感言
2014/03/02 职场文书
通信工程专业求职信
2014/06/04 职场文书
婚前协议书标准版
2014/10/19 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
会议主持词结束语
2015/07/03 职场文书
Java异常体系非正常停止和分类
2022/06/14 Java/Android