微信小程序> 微信小程序之自定义select下拉选项框组件-微信小程序拖动添加选项-微信小程序拖动排序

微信小程序之自定义select下拉选项框组件-微信小程序拖动添加选项-微信小程序拖动排序

浏览量:2220 时间: 来源:矜媛宝
1.

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

2.

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

3.

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

4.

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

5.

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

6.

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

7.

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

8.

第二步:开始配置组件

9.

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

10.

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

11.

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

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

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

13.

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

14.

1.组件的wxml

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

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

16.

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

17.

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

18.

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

19.

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

20.

2.组件的wxss

.com-selectBox{width:200px;}.com-sContent{border:1pxsolid#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.3sease;}.com-sTxt{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:020px06px;font-size:14px;}.com-sList{background:white;width:inherit;position:absolute;border:1pxsolid#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:1pxsolid#e2e2e2;padding:06px;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;}.com-sItem:first-child{border-top:none;}21.

3.组件的js

//Componet/Componet.jsComponent({/***组件的属性列表*/properties:{propArray:{type:Array,}},/***组件的初始数据*/data:{selectShow:false,//初始option不显示nowText:"请选择",//初始内容animationData:{}//右边箭头的动画},/***组件的方法列表*/methods:{   //option的显示与否selectToggle:function(){varnowShowthis.data.selectShow;//获取当前option显示的状态//创建动画varanimationwx.createAnimation({timingFunction:"ease"})this.animationanimation;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){varnowDatathis.properties.propArray;//当前option的数据是引入组件的页面传过来的,所以这里获取数据只有通过this.propertiesvarnowIdxe.target.dataset.index;//当前点击的索引varnowTextnowData[nowIdx].text;//当前点击的内容//再次执行动画,注意这里一定,一定,一定是this.animation来使用动画this.animation.rotate(0).step();this.setData({selectShow:false,nowText:nowText,animationData:this.animation.export()})}}})22.

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

23.

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

24.

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

25.

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

26.

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

27.

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

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

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

29.

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

30.

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

Selectprop-array'{{selectArray}}'/Select31.

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

32.

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

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

最终结果:

34.

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

Selectprop-array'{{selectArray}}'/SelectSelectprop-array'{{selectArray}}'/Select35.

这样的方式组件并不会相互影响,都是独立的。

36.

对了,组件样式的规则可以查看官方的规则

37.

第五步:获取点击的内容,即组件间的通信

38.

效果有了,最关键的是获取选中的内容。这个怎么实现呢,这时候需要组建间通信与事件了。

39.

1.对组件的事件进行监听:

Selectprop-array'{{selectArray}}'bind:myget'getDate'/Select40.

(1)这里myget是自定义的子组件需要触发的事件名,getDate是引入组件的页面需要获取传过来的数据的自定义的事件名。

41.

2.子组件触发事件

42.

因为这里的select组件是点击下拉列表的内容才进行内容的更新,所以这里只需要在下拉列表里添加一个点击事件,而原来已经设置了setText事件。所以只需要在setText函数里面写触发事件就行了。

43.

在setText函数的内容里加上:

varnowDate{id:nowIdx,text:nowText}this.triggerEvent('myget',nowDate)44.

(1)这里的myget和bind:myget,名称一定要对应。

45.

(2)nowDate是需要传回的数据,不一定要弄成对象,想传什么传什么,我这里只是演示而已。我试了一下也可以传函数。。。

46.

3.引入组件的页面的js

47.

添加引入组件时,自定义的函数:

getDate:function(e){console.log(e.detail)}48.

e的内容为:

49.

传过来的值就在detail里面。

50.

到此,一个完整的select组件就完成了。

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎