WeChat-SmallProgram:自定义select下拉选项框组件
1):创建组件所需的文件
2):自定义组件 CSS 及 JS
组件的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选项显示与否
组件的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;
}
组件的 js:
// components/select.js
Component({
/**
* 组件的属性列表
*/
properties: {
propArray: {
type: Array,
}
}, /**
* 组件的初始数据
*/
data: {
selectShow: false, //初始option不显示
nowText: "请选择分类", //初始内容
animationData: {} //右边箭头的动画
}, /**
* 组件的方法列表
*/
methods: {
//option的显示与否
selectToggle: function() {
console.log("select-selectToggle");
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) {
console.log("select-setText");
var nowData = this.properties.propArray; //当前option的数据是引入组件的页面传过来的,所以这里获取数据只有通过this.properties
var index = e.target.dataset.index; //当前点击的索引
var nowId = nowData[index].id;
var nowText = nowData[index].text; //当前点击的内容
//再次执行动画,注意这里一定,一定,一定是this.animation来使用动画
this.animation.rotate(0).step();
this.setData({
selectShow: false,
nowText: nowText,
animationData: this.animation.export()
});
var nowDate = {
id: nowId,
text: nowText
}
this.triggerEvent('myget', nowDate)
},
// 初始化数据
initData(e) {
console.log("select-initData");
this.setData({
selectShow: false, //初始option不显示
nowText: "请选择分类", //初始内容
animationData: {} //右边箭头的动画
});
}
}
})
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 中我就需要配置:
1):sub-unit-select 是你定义的组件的名称,后面的是组件所在的位置。 / 单斜杠表示根目录,是绝对路径。
2):如果出现下面这种说没找到路径的,一定是自己填写的路径不对,认真查找。
配置好后,就可以引入组件:
<sub-unit-select id="init" prop-array='{{selectArray}}' bind:myget='getDataSelect'></sub-unit-select>
1):prop-array 是我自定义的属性名,这个是和组件所在的 js 中properties中的属性是对应的。
在 properties
定义的属性中,属性名采用驼峰写法(例如:propArray);在引入组件的 wxml
中,指定属性值时则对应使用连字符写法(例如:prop-array="..."
)。
2):id="init" 也是自定义的属性 用来获取组件信息。例如我们要在引用页面 调用 组件内的方法。
onLoad: function(options) {
console.log("album-details-onload"); // 获取引用组件信息
this.compData = this.selectComponent("#init") },
// 自定义事件
modalCancel(e) {
console.log("album-details-modalCancel");
var _this = this;
this.compData.initData(); },
3):bind:myget='getDataSelect' 获取点击的内容,即组件间的通信。效果有了,最关键的是获取选中的内容。这个怎么实现呢,这时候需要 组建间通信与事件 了。
这里myget是自定义的子组件需要触发的事件名,getDataSelect 是引入组件的页面需要获取传过来的数据的自定义的事件名。
子组件触发事件:
因为这里的select组件是点击下拉列表的内容才进行内容的更新,所以这里只需要在下拉列表里添加一个点击事件,而原来已经设置了setText事件。
所以只需要在setText函数里面写触发事件就行了。
var nowDate = {
id: nowId,
text: nowText
}
this.triggerEvent('myget', nowDate)
这里的 myget 和 bind:myget ,名称一定要对应。
nowDate是需要传回的数据,不一定要弄成对象,想传什么传什么,我这里只是演示而已。我试了一下也可以传函数。。。
最后就是传入数据了。在引入组件的js的data中,添加:
selectArray: [{
"id": "10",
"text": "会计类"
}, {
"id": "21",
"text": "工程类"
}]
最终结果:
如果引入两个相同的组件,传入的数据也相同:
<sub-unit-select id="init" prop-array='{{selectArray}}' bind:myget='事件名称2'></sub-unit-select>
<sub-unit-select id="init" prop-array='{{selectArray}}' bind:myget='事件名称2'></sub-unit-select>
这样的方式组件并不会相互影响,都是独立的。
对了,组件样式的规则可以查看 官方的规则
在引用组件的页面 JS 中添加函数 :
// 获取下拉框选择的数据
getDataSelect: function(e) {
console.log("album-details-getDataSelect");
var _this = this;
console.log(e)
},
e 的内容:
传过来的值就在detail里面。
到此,一个完整的select组件就完成了。
You have to work hard to look effortless
You're going to sneak up and surprise everyone
引文:https://www.cnblogs.com/zjjDaily/p/9548433.htm
WeChat-SmallProgram:自定义select下拉选项框组件的更多相关文章
- 微信小程序之自定义select下拉选项框组件
知识点:组件,animation,获取当前点击元素的索引与内容 微信小程序中没有select下拉选项框,所以只有自定义.自定义的话,可以选择模板的方式,也可以选择组件的方式来创建. 这次我选择了组件, ...
- CSS自定义select下拉选择框(不用其他标签模拟)
今天群里有人问到怎么自定义select下拉选择框的样式,于是群里就展开了激烈的讨论,刚开始一直就是考虑怎样使用纯CSS实现,把浏览器默认的样式覆盖掉,但最后均因兼容问题处理不好而失败告终,最后的解决方 ...
- [js开源组件开发]模拟下拉选项框select
模拟下拉选项框select 在css3流行的情况下,下拉框还是无法满足PD的需求,所以有了autosearch,有了模拟下拉框.效果如下图: select DEMO请案例点击这里查看.http://w ...
- jsp代码中实现下拉选项框的回显代码
用到了c标签库:首先要在jsp中导入jstl的核心库标签 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/js ...
- [jQueryUI] – Chosen:select下拉选择框美化插件及问题
Chosen 是一个支持jquery的select下拉框美化插件,它能让丑陋的.很长的select选择框变的更好看.更方便.不仅如此,它更扩展了select,增加了自动筛选的功能.它可对列表进行分组, ...
- angularjs select下拉搜索框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 类似select下拉选择框同时又支持手动输入的元素 datalist 介绍。
有时候我们会有这样的需求,通过使用下拉菜单给用户一定的选择范围,同时又可以使用户在找不到选择项的时候手动输入.这个时候我们就需要用到html5的datalist属性了. datalist包含<o ...
- select下拉选框的默认值,包括每次进入页面的默认值
下拉选: <select onchange="selectTotal(this.value)" style="width: 50px;"> ...
- 自定义 select 下拉菜单
.selectBeautifyMainStyle{ color: #9fa0a0; font-size: 14px; font-family: "alegreya_sansthin" ...
随机推荐
- (Win10)Java,Maven,Tomcat8.0,Mysql8.0.15安装与环境配置,以及IDEA2019.3使用JDBC连接MySQL、创建JavaEE项目
之前用windows+linux的双系统,最近不怎么舒服就把双系统给卸了,没想到除了问题,导致有linux残余,于是就一狠心重装了电脑,又把Java及其相关的一些东西重新装了回来,还好当初存了网盘链接 ...
- SpringBoot整合Swagger2案例,以及报错:java.lang.NumberFormatException: For input string: ""原因和解决办法
原文链接:https://blog.csdn.net/weixin_43724369/article/details/89341949 SpringBoot整合Swagger2案例 先说SpringB ...
- Web图片资源的加载与渲染时机
此文研究页面中的图片资源的加载和渲染时机,使得我们能更好的管理图片资源,避免不必要的流量和提高用户体验. 浏览器的工作流程 要研究图片资源的加载和渲染,我们先要了解浏览器的工作原理.以Webkit引擎 ...
- Echarts轻松入门,内附踩坑秘籍
首先介绍一下我们的主角ECharts ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Fir ...
- p2.js 与 createjs 的组合应用
开始前简单说下其他几款js物理引擎 box2d老牌,功能全面,但是效率低下,移动端基不用考虑的 matterjs 效率目前我测试下来最高,但是依然还在开发中(好像还很缓慢),目前功能局限,而且有bu ...
- centos7搭建ceph集群
一.服务器规划 主机名 主机IP 磁盘配比 角色 node1 public-ip:10.0.0.130cluster-ip:192.168.2.130 sda,sdb,sdcsda是系统盘,另外两块数 ...
- 实验一 Linux系统与应用准备
实验一 Linux系统与应用准备 项目 内容 作业归属 班级课程 作业要求 课程作业要求 学号-姓名 17041419-刘金林 作业学习目标 1.学习博客园软件开发者学习社区使用技巧和经验:2.学习M ...
- 【猫狗数据集】利用tensorboard可视化训练和测试过程
数据集下载地址: 链接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw提取码:2xq4 创建数据集:https://www.cnblogs.com/xi ...
- ubutu 12.04
1.[系统设置]->[外观]->[行为]->[自动隐藏启动器],隐藏左侧边栏后,可以按快捷键[CTRL+a]弹出侧边栏. 2.QtCreator调试,提示[ptrace不允许的操作] ...
- Qt5小Demo之猜数字游戏
玩法:设定时间进行猜数字,所猜数字为一个四位数,输入自己的数字,系统会提示是大了还是小了,依据条件逐步逼近正确结果.在规定时间里猜对即获胜,否则即失败. 平台支持:Win10下测试正常. 源码地址: ...