微信小程序下拉菜单实例( 二 )


  • 100以内
  • 100-500
  • 500-1000
  • 1000-3000
  • 3000以上

效果如图
相应的js代码要写成:
//声明初始化高亮状态数组function initSubMenuHighLight() {return [['','','','',''],['',''],['','','']];}
点击事件
tapSubMenu: function(e) {// 隐藏所有一级菜单this.setData({subMenuDisplay: initSubMenuDisplay()});// 处理二级菜单 , 首先获取当前显示的二级菜单标识var indexArray = e.currentTarget.dataset.index.split('-');console.log("indexArray : " + indexArray);var newSubMenuHighLight = initSubMenuHighLight();// 与一级菜单不同 , 这里不需要判断当前状态 , 只需要点击就给class赋予highlight即可newSubMenuHighLight[indexArray[0]][indexArray[1]] = 'highlight';console.log(newSubMenuHighLight);// 设置为新的数组this.setData({subMenuHighLight: newSubMenuHighLight});}
这样就实现了高亮与取消高亮 。但还没完 , 与一级菜单不同 , 这里与兄弟子菜单是非互斥的 , 也就是说点击了本菜单 , 是不能一刀切掉兄弟菜单的高亮状态的 。于是我们改进js代码 。
声明方式 , 改用变量形式 , 方便存储 。
//定义初始化数据 , 用于运行时保存var initSubMenuHighLight = [['','','','',''],['',''],['','','']];
点击事件
tapSubMenu: function(e) {// 隐藏所有一级菜单this.setData({subMenuDisplay: initSubMenuDisplay()});// 处理二级菜单 , 首先获取当前显示的二级菜单标识var indexArray = e.currentTarget.dataset.index.split('-');// 初始化状态// var newSubMenuHighLight = initSubMenuHighLight;for (var i = 0; i < initSubMenuHighLight.length; i++) {// 如果点中的是一级菜单 , 则先清空状态 , 即非高亮模式 , 然后再高亮点中的二级菜单;如果不是当前菜单 , 而不理会 。经过这样处理就能保留其他菜单的高亮状态if (indexArray[0] == i) {for (var j = 0; j < initSubMenuHighLight[i].length; j++) {// 实现清空initSubMenuHighLight[i][j] = '';}// 将当前菜单的二级菜单设置回去}}// 与一级菜单不同 , 这里不需要判断当前状态 , 只需要点击就给class赋予highlight即可initSubMenuHighLight[indexArray[0]][indexArray[1]] = 'highlight';// 设置为新的数组this.setData({subMenuHighLight: initSubMenuHighLight});}
有待完善功能点:
1.显示与隐藏带动画下拉
2.抽象化 , 使用回调函数 , 将监听每个二级菜单的点击
3.数据源与显示应当是分离的 , 一级与二级菜单的key value应该是独立在外 , 系统只认index , 然后对相应点击作处理 , 跳转页面 , 筛选结果等
4.点击二级菜单时 , 会将全部组的清除 , 有待修复
本文链接: 微信小程序下拉菜单实例