您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

微信小程序中自定义select下拉选项框组件

2025/1/18 4:07:45发布15次查看
知识点:组件,animation,获取当前点击元素的索引与内容微信小程序中没有select下拉选项框,所以只有自定义。自定义的话,可以选择模板的方式,也可以选择组件的方式来创建。
这次我选择了组件,这样只需引入组件和添加数据,其它的不用管,就能实现多个地方重复使用了。
第一步:创建组件所需的文件我喜欢把共用的内容都放在和pages文件同级的地方,所以有了下面的目录结构
先创建一个自定义名字的文件夹,例如我上面的componet
再创建一个select文件夹,然后:右键这个文件夹,新建下面的这个component。然后输入需要创建的名称,我这里为了方便就取了select的名字。然后就会自动创建4个文件,js、json、wxml、wxss。
第二步:开始配置组件注意:如果通过第一步创建的可直接跳过第二步。
通过第一步创建的组件的文件夹中,已经自动配置好了。只需在引入组件的时候,在引入组件的页面的json文件中配置组件的名称和组件的位置。
如果自己手动创建组件的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.jscomponent({  /**   * 组件的属性列表   */    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) 如果出现下面这种说没找到路径的,一定是自己填写的路径不对,认真查找。
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 prop-array='{{selectarray}}'></select><select prop-array='{{selectarray}}'></select>
这样的方式组件并不会相互影响,都是独立的。   
对了,组件样式的规则可以查看官方的规则
第五步:获取点击的内容,即组件间的通信效果有了,最关键的是获取选中的内容。这个怎么实现呢,这时候需要组建间通信与事件了。
1. 对组件的事件进行监听:<select prop-array='{{selectarray}}' bind:myget='getdate'></select>
(1) 这里myget是自定义的子组件需要触发的事件名,getdate是引入组件的页面需要获取传过来的数据的自定义的事件名。
2. 子组件触发事件因为这里的select组件是点击下拉列表的内容才进行内容的更新,所以这里只需要在下拉列表里添加一个点击事件,而原来已经设置了settext事件。所以只需要在settext函数里面写触发事件就行了。
在settext函数的内容里加上:
var nowdate={    id:nowidx,    text:nowtext}this.triggerevent('myget', nowdate)
(1) 这里的 myget 和 bind:myget ,名称一定要对应。
(2) nowdate是需要传回的数据,不一定要弄成对象,想传什么传什么,我这里只是演示而已。我试了一下也可以传函数。。。
3. 引入组件的页面的js
添加引入组件时,自定义的函数:
getdate:function(e){    console.log(e.detail)}
e的内容为:
传过来的值就在detail里面。
到此,一个完整的select组件就完成了。
更新:
如果要select组件默认显示传入的第一个数据,做法是:
(1) 在select组件的wxml页面,在class为com-stxt的view标签中,原来的 {{ nowtext }} 改为 {{ nowtext==' ' ? proparray[0].text : nowtext }}。
(2) 然后在 select 组件 js文件 中原来nowtext的值修改为 ‘ ’ 空。
(3) 这样的话就表示如果最初nowtext为空,就显示传入数据的第一个值,否则就是选中的值
推荐教程:《微信小程序》
以上就是微信小程序中自定义select下拉选项框组件的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product