微信小程序自定义select下拉选项框组件的实现代码


Posted in Javascript onAugust 28, 2018

知识点:组件,animation,获取当前点击元素的索引与内容

微信小程序中没有select下拉选项框,所以只有自定义。自定义的话,可以选择模板的方式,也可以选择组件的方式来创建。

这次我选择了组件,这样只需引入组件和添加数据,其它的不用管,就能实现多个地方重复使用了。

第一步:创建组件所需的文件

我喜欢把共用的内容都放在和pages文件同级的地方,所以有了下面的目录结构

微信小程序自定义select下拉选项框组件的实现代码

(1) 先创建一个自定义名字的文件夹,例如我上面的Componet

(2) 再创建一个select文件夹,然后:右键这个文件夹,新建下面的这个Component。然后输入需要创建的名称,我这里为了方便就取了select的名字。然后就会自动创建4个文件,js、json、wxml、wxss。

微信小程序自定义select下拉选项框组件的实现代码

第二步:开始配置组件

注意:如果通过第一步创建的可直接跳过第二步。

(1) 通过第一步创建的组件的文件夹中,已经自动配置好了。只需在引入组件的时候,在引入组件的页面的json文件中配置组件的名称和组件的位置。

(2) 如果自己手动创建组件的js、json、wxml、wxss这个文件,那么需要在json文件中填入 "component": true 表示自定义组件声明。js文件中也需要写成这种格式:

Component({
 properties: {
  // 这里定义了innerText属性,属性值可以在组件使用时指定
  innerText: {
   type: String,
   value: 'default value',
  }
 },
 data: {
  // 这里是一些组件内部数据
  someData: {}
 },
 methods: {
  // 这里是一个自定义方法
  customMethod: function(){}
 }
})

第三步:自定义组件样式及js。

注意:这里可以在 app.json 的 pages 中把组件所在的页面放到第一位,这样就能在组件的页面编写代码了,比如我上面的目录结构:就需要写成 "Componet/select/select", 后面再是其它的页面。这样方便得多。

1. 组件的wxml

<view class='com-selectBox'>
  <view class='com-sContent' bindtap='selectToggle'>
    <view class='com-sTxt'>{{nowText}}</view>
    <image src='../../public/img/local/down.png' class='com-sImg' animation="{{animationData}}"></image>
  </view>
  <view class='com-sList' wx:if="{{selectShow}}">
    <view wx:for="{{propArray}}" data-index="{{index}}" wx:key='' class='com-sItem' bindtap='setText'>{{item.text}}</view>
  </view>
</view>

(1)  animation="{{animationData}}" 这个是下箭头的动画效果

(2)  data-index="{{index}}" 这个是当前元素被点击时的索引

(3) selectToggle是模仿下拉选项框隐藏和显示的事件。

(4) setText是模仿下拉选项框选择子项之后,设置内容的事件。

(5) selectShow是表示option选项显示与否

2. 组件的wxss

.com-selectBox{
  width: 200px;
}
.com-sContent{
  border: 1px solid #e2e2e2;
  background: white;
  font-size: 16px;
  position: relative;
  height: 30px;
  line-height: 30px;
}
.com-sImg{
  position: absolute;
  right: 10px;
  top: 11px;
  width: 16px;
  height: 9px;
  transition: all .3s ease;
}
.com-sTxt{
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  padding:0 20px 0 6px;
  font-size: 14px;
}
.com-sList{
  background: white;
  width: inherit;
  position: absolute;
  border: 1px solid #e2e2e2;
  border-top: none;
  box-sizing: border-box;
  z-index: 3;
  max-height: 120px;
  overflow: auto;
}
.com-sItem{
  height: 30px;
  line-height: 30px;
  border-top: 1px solid #e2e2e2;
  padding: 0 6px;
  text-align: left;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 14px;
}
.com-sItem:first-child{
  border-top: none;
}

 3. 组件的 js

// Componet/Componet.js
Component({
 /**
  * 组件的属性列表
  */
  properties: {
    propArray:{
      type:Array,
    }
  },
 /**
  * 组件的初始数据
  */
  data: {
    selectShow:false,//初始option不显示
    nowText:"请选择",//初始内容
    animationData:{}//右边箭头的动画
  },
 /**
  * 组件的方法列表
  */
  methods: {
 //option的显示与否
    selectToggle:function(){
      var nowShow=this.data.selectShow;//获取当前option显示的状态
      //创建动画
      var animation = wx.createAnimation({
        timingFunction:"ease"
      })
      this.animation=animation;
      if(nowShow){
        animation.rotate(0).step();
        this.setData({
          animationData: animation.export()
        })
      }else{
        animation.rotate(180).step();        
        this.setData({
          animationData: animation.export()
        })
      }
      this.setData({
        selectShow: !nowShow
      })
    },
    //设置内容
    setText:function(e){
      var nowData = this.properties.propArray;//当前option的数据是引入组件的页面传过来的,所以这里获取数据只有通过this.properties
      var nowIdx = e.target.dataset.index;//当前点击的索引
      var nowText = nowData[nowIdx].text;//当前点击的内容
      //再次执行动画,注意这里一定,一定,一定是this.animation来使用动画
      this.animation.rotate(0).step();
      this.setData({
        selectShow: false,
        nowText:nowText,
        animationData: this.animation.export()
      })
    }
  }
})

(1) 组件的 properties 属性是对外属性,我理解的是可以当做 data 数据来使用,它是一个含有三个属性的对象,分别是 type 表示属性类型、 value 表示属性初始值、 observer 表示属性值被更改时的响应函数。type 是必填的,其它的可选。如果只有 type,可以写成:属性名:type类型。

(2) 组件的 data 和普通页面的data一样,是组件的内部数据,和 properties 一同用于组件的模版渲染。

(3) 组件的 method 是专门用于 事件响应函数 和 任意的自定义方法。在这里面获取数据有两种方法:一种是获取data里的数据: this.data.属性名;一种是获取 properties 中的属性值: this.properties.属性名

(4) 创建animation动画,作用在通过 true 和 false 切换显示状态的内容上没有过渡、没有过渡、没有过渡。

第四步:引入组件,传入组件所需数据

1. 引入前,需要在引入组件的页面的json文件中配置,比如我要在 index.wxml 中引入,那么在 index.json 中我就需要配置:

"usingComponents": {
  "Select": "/Componet/select/select"
}

(1) Select 是你定义的组件的名称,后面的是组件所在的位置。 /  单斜杠表示根目录,是绝对路径。

(2) 如果出现下面这种说没找到路径的,一定是自己填写的路径不对,认真查找。

微信小程序自定义select下拉选项框组件的实现代码

2. 配置好后,就可以引入组件。

<Select prop-array='{{selectArray}}'></Select>

(1) prop-array 是我自定义的属性名,这个是和组件所在的 js 中properties中的属性是对应的。在 properties 定义的属性中,属性名采用驼峰写法(例如:propArray);在引入组件的 wxml 中,指定属性值时则对应使用连字符写法(例如:prop-array="...")。

3. 最后就是传入数据了。在引入组件的js的data中,添加:

selectArray: [{
  "id": "10",
  "text": "会计类"
}, {
  "id": "21",
  "text": "工程类"
}]

 最终结果:

微信小程序自定义select下拉选项框组件的实现代码

 如果引入两个相同的组件,传入的数据也相同:

<Select prop-array='{{selectArray}}'></Select>
<Select prop-array='{{selectArray}}'></Select>

总结

以上所述是小编给大家介绍的微信小程序自定义select下拉选项框组件的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
爆炸式的JS圆形浮动菜单特效代码
Mar 03 Javascript
javascript showModalDialog,open取得父窗口的方法
Mar 10 Javascript
window.name代替cookie的实现代码
Nov 28 Javascript
基于Javascript实现弹出页面效果
Jan 01 Javascript
js单页hash路由原理与应用实战详解
Aug 14 Javascript
轻松搞定jQuery+JSONP跨域请求的解决方案
Mar 06 jQuery
使用js实现将后台传入的json数据放在前台显示
Aug 06 Javascript
layui输入框只允许输入中文且判断长度的例子
Sep 18 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
Sep 26 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
Nov 24 Javascript
vue如何使用外部特殊字体的操作
Jul 30 Javascript
React + Threejs + Swiper 实现全景图效果的完整代码
Jun 28 Javascript
微信小程序中上传图片并进行压缩的实现代码
Aug 28 #Javascript
vee-validate vue 2.0自定义表单验证的实例
Aug 28 #Javascript
vue+element-ui动态生成多级表头的方法
Aug 28 #Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
Aug 28 #jQuery
对Vue table 动态表格td可编辑的方法详解
Aug 28 #Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 #Javascript
layui实现文件或图片上传记录
Aug 28 #Javascript
You might like
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
PHP 加密与解密的斗争
2009/04/17 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
js利用div背景,做一个竖线的效果。
2008/11/22 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
浅析jquery与checkbox的checked属性的问题
2016/04/27 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
jquery css实现流程进度条
2020/03/26 jQuery
原生js实现弹窗消息动画
2020/11/20 Javascript
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
python实现textrank关键词提取
2018/06/22 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
django云端留言板实例详解
2019/07/22 Python
Python Django 简单分页的实现代码解析
2019/08/21 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
Python 随机按键模拟2小时
2020/12/30 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
工作中个人的自我评价
2013/12/31 职场文书
自行车租赁公司创业计划书
2014/01/28 职场文书
上班看电影检讨书
2014/02/12 职场文书
鲜花方阵解说词
2014/02/13 职场文书
高三学习决心书
2014/03/11 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
卫生主题班会
2015/08/14 职场文书
原生CSS实现文字无限轮播的通用方法
2021/03/30 HTML / CSS
python基于opencv批量生成验证码的示例
2021/04/28 Python