首頁  >  文章  >  web前端  >  微信小程式中自訂select下拉選項框元件

微信小程式中自訂select下拉選項框元件

hzc
hzc轉載
2020-06-24 10:10:074180瀏覽

知識點元件animation取得目前點擊元素的索引與內容

微信小程式中沒有select下拉選項框,所以只有自訂。自訂的話,可以選擇模板的方式,也可以選擇元件的方式來建立。

這次我選擇了元件,這樣只需引入元件和添加數據,其它的不用管,就能實現多個地方重複使用了。

第一步:建立元件所需的檔案

我喜歡把共用的內容都放在和pages檔案同級的地方,所以有了下面的目錄結構

 

  1. #先建立一個自訂名字的資料夾,例如我上面的Componet

  2. 再建立一個select資料夾,然後:右鍵這個資料夾,新建下面的這個Component。然後輸入需要建立的名稱,我這裡為了方便就取了select的名字。然後就會自動建立4個檔案,js、json、wxml、wxss。

第二步:開始設定元件

#注意:如果透過第一步建立的可直接跳過第二步。

  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.jsonpages 中把元件所在的頁面放到第一位,這樣就能在元件的頁面寫程式了,例如我上面的目錄結構:就需要寫成 "Componet/select/select", 後面再是其它的頁面。這樣方便很多。

1. 元件的wxml

<view class=&#39;com-selectBox&#39;>
    <view class=&#39;com-sContent&#39; bindtap=&#39;selectToggle&#39;>
        <view class=&#39;com-sTxt&#39;>{{nowText}}</view>
        <image src=&#39;../../public/img/local/down.png&#39;  class=&#39;com-sImg&#39;  animation="{{animationData}}"></image>
    </view>
    <view class=&#39;com-sList&#39; wx:if="{{selectShow}}">
        <view wx:for="{{propArray}}" data-index="{{index}}" wx:key=&#39;&#39; class=&#39;com-sItem&#39; bindtap=&#39;setText&#39;>{{item.text}}</view>
    </view></view>
  1. (1)  animation="{{animationData}}" 這個是下箭頭的動畫效果

  2. (2)  ## data-index="{{index}}"

  3.  這個是當前元素被點擊時的索引
  4. ## (3) selectToggle是模仿下拉選項方塊隱藏和顯示的事件。
  5. (4) setText是模仿下拉選項方塊選擇子項目之後,設定內容的事件。
  6. (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. (1) 元件的 #properties 屬性是對外屬性,我理解的是可以當作data 資料來使用,它是一個含有三個屬性的對象,分別是 type 表示屬性類型、 #value 表示屬性初始值、 observer# 表示屬性值已變更時的回應函數。 type 是必填的,其它的可選。如果只有 type,可以寫成:屬性名稱:type型別

  2. (2) 元件的data 和一般頁面的data一樣,是元件的內部數據,和 properties

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

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

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

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

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

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

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

<Select prop-array=&#39;{{selectArray}}&#39;></Select>

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

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

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

 最终结果:

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


<Select prop-array=&#39;{{selectArray}}&#39;></Select><Select prop-array=&#39;{{selectArray}}&#39;></Select>

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

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

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

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

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

<Select prop-array=&#39;{{selectArray}}&#39; bind:myget=&#39;getDate&#39;></Select>

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

2. 子组件触发事件

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

在setText函数的内容里加上:

var nowDate={
    id:nowIdx,
    text:nowText
}this.triggerEvent('myget', nowDate)
  1. (1) 这里的 myget 和 bind:myget ,名称一定要对应。

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

3. 引入组件的页面的js

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

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

e的内容为:

传过来的值就在detail里面。

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

更新:

如果要select组件默认显示传入的第一个数据,做法是:

  1. (1) 在select组件的wxml页面,在class为com-sTxt的view标签中,原来的 {{ nowText }} 改为 {{ nowText==' ' ? propArray[0].text : nowText }}。

  2. (2) 然后在 select 组件 js文件 中原来nowText的值修改为 ‘ ’ 空。

  3. (3) 这样的话就表示如果最初nowText为空,就显示传入数据的第一个值,否则就是选中的值

推荐教程:《微信小程序

以上是微信小程式中自訂select下拉選項框元件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除