微信小程序 WXDropDownMenu组件详解及实例代码


Posted in Javascript onOctober 24, 2016

微信小程序 WXDropDownMenu组件详解,这里给个小的示例,帮助大家学习理解,

功能: 适用于商品列表筛选与功能菜单跳转

先来看下效果图:

微信小程序 WXDropDownMenu组件详解及实例代码

思路与步骤:

布局方面,整体使用dl来写,二级包在dd中,用ul li来写;交互方面,点击某一级菜单,关闭兄弟子菜单,点击某子菜单关闭所有菜单。

1.使用dt做出第一级菜单

2.使用dd嵌套第二级菜单,初始隐藏、position为absolute,使用z-index浮出页面层

/*总菜单容器*/
.menu {
   display: block;
  height: 38px;
}

/*一级菜单*/
.menu dt {
  font-size: 15px;
  float: left;
  /*hack*/
  width: 33%;
  height: 38px;
  border-right: 1px solid #d2d2d2;
  border-bottom: 1px solid #d2d2d2;
  text-align: center;
  background-color: #f4f4f4;
  color: #5a5a5a;
  line-height: 38px;
}

/*二级菜单外部容器样式*/
.menu dd{
  position: absolute;
  width: 100%;
  /*hack*/
  top:39px;
  left:0;
  z-index:999;
}

/*二级菜单普通样式*/
.menu li{
  font-size: 14px;
  line-height: 34px;
  color: #575757;
  height: 34px;
  display: block;
  padding-left: 8px;
  background-color: #fff;
  border-bottom: 1px solid #dbdbdb;
}

查看效果,接下来实现点击事件。

如图

微信小程序 WXDropDownMenu组件详解及实例代码

3.dt绑定点击事件tapMainMenu,flag控制显隐toggle,提供2个class,hidden与show,来控制显隐。注:dt也是可以bindTap的,不单是view。

/* 显示与隐藏 */
.show {
  display: block;
}

.hidden {
  display: none;
}

4.关闭所有一级菜单,每个一级菜单都有一个index标识,由tapMainMenu事件传递过去,与数组subMenuDisplay一一对应,当前元素subMenuDisplay[index]视原来状态决定是显示或隐藏。

核心代码:

<dl class="menu">
  <dt data-index="0" bindtap="tapMainMenu">价格</dt>
  <dd class="{{subMenuDisplay[0]}}">
    <ul><li>sub1</li><li>sub2</li></ul>
  </dd>
</dl>
// 使用function初始化array,相比var initSubMenuDisplay = [] 既避免的引用复制的,同时方式更灵活,将来可以是多种方式实现,个数也不定的
function initSubMenuDisplay() {
  return ['hidden', 'hidden', 'hidden'];
}

Page({
  data:{
    subMenuDisplay:initSubMenuDisplay()
  },
  tapMainMenu: function(e) {
//    获取当前显示的一级菜单标识
    var index = parseInt(e.currentTarget.dataset.index);
    // 生成数组,全为hidden的,只对当前的进行显示
    var newSubMenuDisplay = initSubMenuDisplay();
//    如果目前是显示则隐藏,反之亦反之。同时要隐藏其他的菜单
    if(this.data.subMenuDisplay[index] == 'hidden') {
      newSubMenuDisplay[index] = 'show';
    } else {
      newSubMenuDisplay[index] = 'hidden';
    }
    // 设置为新的数组
    this.setData({
      subMenuDisplay: newSubMenuDisplay
    });
  }
});

5.选中二级菜单当前项,但给个系统icon及改变背景色,文本加粗,同样改变一级菜单标题,demo中给出一个弹窗

声明tapSubMenu方法,监听二级点击事件

tapSubMenu: function(e) {
    //    获取当前显示的一级菜单标识
    var index = parseInt(e.currentTarget.dataset.index);
    console.log(index);
    // 隐藏所有一级菜单
    this.setData({
      subMenuDisplay: initSubMenuDisplay()
    });
  }

加highlight效果

/*二级菜单高亮样式*/
.menu li.highlight{
  background-color: #f4f4f4;
}

与一级菜单不同,使用二维数组的方式实现点击高亮,这样才能定位到是某一级的某二级菜单,再决定显示隐藏。 布局文件改成:

<dd class="{{subMenuDisplay[0]}}">
    <ul>
      <li class="{{subMenuHighLight[0][0]}}" data-index="0-0" bindtap="tapSubMenu">100以内</li>
      <li class="{{subMenuHighLight[0][1]}}" data-index="0-1" bindtap="tapSubMenu">100-500</li>
      <li class="{{subMenuHighLight[0][2]}}" data-index="0-2" bindtap="tapSubMenu">500-1000</li>
      <li class="{{subMenuHighLight[0][3]}}" data-index="0-3" bindtap="tapSubMenu">1000-3000</li>
      <li class="{{subMenuHighLight[0][4]}}" data-index="0-4" bindtap="tapSubMenu">3000以上</li>
    </ul>
  </dd>

效果如图

微信小程序 WXDropDownMenu组件详解及实例代码

相应的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.点击二级菜单时,会将全部组的清除,有待修复

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
表单提交时自动复制内容到剪贴板的js代码
Mar 16 Javascript
javascript firefox兼容ie的dom方法脚本
May 18 Javascript
javascript下判断一个元素是否存在的代码
Mar 05 Javascript
namespace.js Javascript的命名空间库
Oct 11 Javascript
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
Sep 26 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
Dec 20 Javascript
javascript实现移动端上的触屏拖拽功能
Mar 04 Javascript
vue.js初学入门教程(1)
Nov 03 Javascript
jQuery UI仿淘宝搜索下拉列表功能
Jan 10 Javascript
JS实现评价的星星功能
Aug 20 Javascript
Node.js之删除文件夹(含递归删除)代码实例
Sep 09 Javascript
JavaScript算法学习之冒泡排序和选择排序
Nov 02 Javascript
微信小程序 购物车简单实例
Oct 24 #Javascript
Select2.js下拉框使用小结
Oct 24 #Javascript
微信小程序 绘图之饼图实现
Oct 24 #Javascript
用jmSlip编写移动端顶部日历选择控件
Oct 24 #Javascript
微信小程序 富文本转文本实例详解
Oct 24 #Javascript
微信小程序 参数传递详解
Oct 24 #Javascript
10分钟掌握XML、JSON及其解析
Dec 06 #Javascript
You might like
为PHP初学者的8点有效建议
2010/11/20 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
javascript下判断一个元素是否存在的代码
2010/03/05 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
详解Python中用于计算指数的exp()方法
2015/05/14 Python
详解python多线程之间的同步(一)
2019/04/03 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
python实现可变变量名方法详解
2019/07/01 Python
python 提取文件指定列的方法示例
2019/08/07 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
PyTorch安装与基本使用详解
2020/08/31 Python
教师自荐书
2013/10/08 职场文书
先进工作者推荐材料
2014/12/23 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
css 边框添加四个角的实现代码
2021/10/16 HTML / CSS
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL