返回顶部
首页 > 资讯 > 精选 >微信小程序自定义日期选择器的示例分析
  • 535
分享到

微信小程序自定义日期选择器的示例分析

2023-06-26 03:06:31 535人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关微信小程序自定义日期选择器的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。日期选择器是我们在写项目的过程中经常遇到的,有需要标题的选择器,也有不需要标题的选择器今

这期内容当中小编将会给大家带来有关微信小程序自定义日期选择器的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

日期选择器是我们在写项目的过程中经常遇到的,有需要标题的选择器,也有不需要标题的选择器

今天给大家带来一个自定义的时间选择器,废话不多说,直接上代码

第一步:先创建一个picker的文件夹

微信小程序自定义日期选择器的示例分析

第二步 :在wxml中写布局样式

<!--picker/picker.wxml--><view class="full-box {{isOpen?'cur':''}}">    <!--<view class="modal" bindtap="tapModal"></view>-->    <view class="picker">        <view class="picker-header">            <view bindtap="cancle" >                <text>{{cancelText}}</text>            </view>            <text >{{titleText}}</text>            <view bindtap="sure">                <text   >{{sureText}}</text>            </view>        </view>        <picker-view            value="{{value}}"            class="picker-content"            bindpickstart="_bindpickstart"            bindchange="_bindChange"            bindpickend="_bindpickend"            indicator-            mask-        >            <picker-view-column wx:for="{{columnsData}}" wx:key="{{index}}">                <view wx:for="{{item}}" wx:for-item="itemIn" class="picker-line" wx:key="{{index}}">                    <text class="line1">{{isUseKeyWordOfShow?itemIn[keyWordsOfShow]:itemIn}}</text>                </view>            </picker-view-column>        </picker-view>    </view></view>

第三步:wxss中添加样式

.full-box{    position: fixed;    left: 0;    right: 0;    bottom: 0;    top: 0;    z-index: 9999;    opacity: 0;    background:rgba(0,0,0,.4);    transition:all .4s ease-in-out 0;    pointer-events:none;}.full-box.cur{    opacity:1;    pointer-events:auto} .modal{    position: absolute;    width: 100%;    height: 50%;    bottom:-50%;    left: 0;    background: transparent;    transition:all .4s ease-in-out 0;} .picker{    position: absolute;    width: 100%;    height: 235px;    bottom: -235px;    left: 0;    background: #fff;    display: flex;    flex-direction: column;    transition:all .4s ease-in-out 0;} .cur .picker{    bottom:0;}.cur .modal{    bottom:50%;}.picker-line{    display: flex;    justify-content: center;    align-items: center;}.picker-header {    height: 20%;    box-sizing: border-box;    padding: 0 20rpx;    display: flex;    justify-content: space-between;    align-items: center;    border-bottom: 1px solid #eeeeee;}.picker-header view {    height: 100%;    display: flex;    justify-content: center;    align-items: center;}.picker-header view text{    font-size: 36rpx;}.picker-content {    flex-grow: 1;}.line1{    overflow: hidden;    text-overflow: ellipsis;    white-space: nowrap;    lines:1}

第四步:js中写组件的属性

// picker/picker.jsimport { isPlainObject } from './tool' Component({    properties: {    scrollType: {      type: String,      value: 'nORMal'// "link": scroll间联动  "normal": scroll相互独立    },    listData: {      type: Array,      value: [],      observer: function(newVal) {        if (newVal.length === 0 || this._compareDate()) return        this._setTempData()        const tempArr = [...new Array(newVal.length).keys()].map(() => 0)        this.data.lastValue = this.data.tempValue = tempArr        this._setDefault()         // let {defaultPickData} = this.properties;        // if(newVal.length === 0) return;        //        // this._setDefault(newVal, defaultPickData)      }    },    defaultPickData: {      type: Array,      value: [],      observer: function(newVal) {        if (newVal.length === 0 || this._compareDate()) return        this._setTempData()        this._setDefault()      }    },    keyWordsOfShow: {      type: String,      value: 'name'    },    isshowPicker: {      type: Boolean,      value: false,      observer: function(newVal) {        if (newVal) {          this._openPicker()        } else {          this._closePicker()        }      }    },    titleText: {// 标题文案      type: String,      value: '请选择到馆日期'    },    cancelText: {// 取消按钮文案      type: String,      value: '取消'    },    sureText: {// 确定按钮文案      type: String,      value: '确定'    },  },     data: {    columnsData: [],    value: [],    backData: [],    height: 0,    isOpen: false,    isUseKeywordOfShow: false,    scrollEnd: true, // 滚动是否结束    lastValue: [], // 上次各个colum的选择索引    tempValue: [],    isFirstOpen: true,    onlyKey: '',    defaultPickDataTemp: '',    listDataTemp: ''  },    methods: {    tapModal() {      this.properties.isShowPicker = false      this._closePicker()    },    cancle() {      this.triggerEvent('cancle')      this._closePicker()    },    sure() {      const { scrollEnd, tempValue } = this.data      if (!scrollEnd) return      const backData = this._getBackDataFromValue(tempValue)      this.setData({        backData      })      this.triggerEvent('sure', {        choosedData: backData,        choosedIndexArr: tempValue      })      this._closePicker()    },    _bindChange(e) {      const { scrollType } = this.properties      const { lastValue } = this.data      let val = e.detail.value      switch (scrollType) {        case 'normal':          this.data.tempValue = val.concat()          this.data.tempValue = val.concat()          break        case 'link':          // let column_02 = this._getColumnData(this.properties.listData[val[0]].children);          // let column_03 = this._getColumnData(this.properties.listData[val[0]].children[val[1]].children);          var tempArray = []          if (val.length > 1) {            val.slice(0, val.length - 1).reduce((t, c, i) => {              const v = t[c].children              tempArray.push(this._getColumnData(v))              return v            }, this.properties.listData)          }          // let columnsData = [this.data.columnsData[0],column_02,column_03];          var columnsData = [this.data.columnsData[0], ...tempArray]           // 设置value关联          var compareIndex = this._getScrollCompareIndex(lastValue, val)          if (compareIndex > -1) {            let tempI = 1            while (val[compareIndex + tempI] !== undefined) {              val[compareIndex + tempI] = 0              tempI++            }          }          val = this._validate(val)          this.data.lastValue = val.concat()          this.data.tempValue = val.concat()          this.setData({            columnsData            // value: val          })      }    },    _validate(val) {      const { columnsData } = this.data      columnsData.forEach((v, i) => {        if (columnsData[i].length - 1 < val[i]) {          val[i] = columnsData[i].length - 1        }      })      this.setData({        value: val      })      return val    },    _bindpickend() {      this.data.scrollEnd = true    },    _bindpickstart() {      this.data.scrollEnd = false    },    _openPicker() {      if (!this.data.isFirstOpen) {        if (this.properties.listData.length !== 0) {          this._setDefault(this._computedBackData(this.data.backData))        }      }      this.data.isFirstOpen = false      this.setData({        isOpen: true      })    },    _closePicker() {      this.setData({        isOpen: false      })    },    _getColumnData(arr) {      return arr.map((v) => this._fomateObj(v))    },    _fomateObj(o) {      const tempO = {}      for (const k in o) {        k !== 'children' && (tempO[k] = o[k])      }      return tempO    },    _getScrollCompareIndex(arr1, arr2) {      let tempIndex = -1      for (let i = 0, len = arr1.length; i < len; i++) {        if (arr1[i] !== arr2[i]) {          tempIndex = i          break        }      }      return tempIndex    },    // 根据id获取索引    _getIndexByIdOfObject(listData, idArr, key, arr) {      if (!Array.isArray(listData)) return      for (let i = 0, len = listData.length; i < len; i++) {        if (listData[i][key] === idArr[arr.length][key]) {          arr.push(i)          return this._getIndexByIdOfObject(listData[i].children, idArr, key, arr)        }      }    },    _setDefault(inBackData) {      const { scrollType } = this.properties      let { listData, defaultPickData } = this.properties       const { lastValue } = this.data      if (inBackData) {        defaultPickData = inBackData      }      let backData = []      switch (scrollType) {        case 'normal':          if (isPlainObject(listData[0][0])) {            this.setData({              isUseKeywordOfShow: true            })          }          if (Array.isArray(defaultPickData) && defaultPickData.length > 0) {            backData = listData.map((v, i) => v[defaultPickData[i]])            this.data.tempValue = defaultPickData            this.data.lastValue = defaultPickData          } else {            backData = listData.map((v) => v[0])          }          this.setData({            columnsData: listData,            backData: backData,            value: defaultPickData          })          break        case 'link':          // let column_01 = this._getColumnData(newVal);          // let column_02 = this._getColumnData(newVal[0].children);          // let column_03 = this._getColumnData(newVal[0].children[0].children);          // let columnsData = [column_01,column_02,column_03];          var columnsData = []          // 如果默认值          if (Array.isArray(defaultPickData) && defaultPickData.length > 0 && defaultPickData.every((v, i) => isPlainObject(v))) {            const key = this.data.onlyKey = Object.keys(defaultPickData[0])[0]             const arr = []             this._getIndexByIdOfObject(listData, defaultPickData, key, arr)             defaultPickData = arr            let tempI = 0            do {              lastValue.push(defaultPickData[tempI])              columnsData.push(this._getColumnData(listData))              listData = listData[defaultPickData[tempI]].children              tempI++            } while (listData)            backData = columnsData.map((v, i) => v[defaultPickData[i]])            // 如果没有默认值          } else {            this.data.onlyKey = this.properties.keyWordsOfShow || 'name'            do {              lastValue.push(0)              columnsData.push(this._getColumnData(listData))              listData = listData[0].children            } while (listData)            backData = columnsData.map((v) => v[0])          }          this.data.tempValue = defaultPickData          this.data.lastValue = defaultPickData          this.setData({            isUseKeywordOfShow: true,            columnsData,            backData          })          setTimeout(() => {            this.setData({              value: defaultPickData            })          }, 0)          break      }    },    _computedBackData(backData) {      const { scrollType, listData } = this.properties      const { onlyKey } = this.data      if (scrollType === 'normal') {        return backData.map((v, i) => listData[i].findIndex((vv, ii) => this._compareObj(v, vv)))      } else {        const t = backData.map((v, i) => {          const o = {}          o[onlyKey] = v[onlyKey]          return o        })         return t      }    },    _compareObj(o1, o2) {      const { keyWordsOfShow } = this.properties      if (typeof o1 !== 'object') {        return o1 === o2      } else {        return o1[keyWordsOfShow] === o2[keyWordsOfShow]      }    },    _getBackDataFromValue(val) {      let tempArr = []      if (val.length > 0) {        tempArr = this.data.columnsData.reduce((t, v, i) => {          return t.concat(v[val[i]])        }, [])      } else {        tempArr = this.data.columnsData.map((v, i) => v[0])      }      return tempArr    },    _compareDate() { // 完全相等返回true      const { defaultPickDataTemp, listDataTemp } = this.data      const { defaultPickData, listData } = this.properties       return defaultPickDataTemp === defaultPickData && listDataTemp === listData    },    _setTempData() {      const { defaultPickData, listData } = this.properties      this.data.defaultPickDataTemp = defaultPickData      this.data.listDataTemp = listData    }  }})

第五步:创建一个tool.js文件

function _typeof(obj) {  return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();}function isString(obj) { //是否字符串  return _typeof(obj) === 'string'}function isPlainObject(obj) {  return _typeof(obj) === 'object';}module.exports = {  isString,  isPlainObject}

第六步:在所需的页面的JSON中进行引用

{  "usinGComponents": {    "picker": "../../picker/picker"  }}

第七步:在所需的页面的wxml中写入布局

 <button bindtap="showPicker_11">时间的五列联动picker</button><view>选择数据:{{picker_11_data}}</view><view>选择索引:{{picker_11_index}}</view><picker isShowPicker="{{isShow_11}}" keyWordsOfShow="name" bindsure="sureCallBack_11" bindcancle="cancleCallBack_11" scrollType="link" listData="{{listData_11}}"></picker>

第八步:在所需的页面的js中调用我们的自定义选择器

// pages/index/index.jsimport { times } from './time.js';Page({     data: {    isShow_11: false,    listData_11:times,    picker_11_data:[],  },  onLoad () {    setTimeout(() => {      this.setData({        defaultPickData_08:[          {code:'110000'},{code:'110100'},{code:'110101'}        ]      })    },3000)  },   showPicker_11: function () {    this.setData({      isShow_11: true,    })   },   sureCallBack_11 (e) {    let data = e.detail    console.log("data",data);    this.setData({      isShow_11: false,      picker_11_data: JSON.stringify(e.detail.choosedData),      picker_11_index:JSON.stringify(e.detail.choosedIndexArr)     })  },  cancleCallBack_11 () {    this.setData({      isShow_11: false    })  }, })

第九步:创建一个time.js的文件

微信小程序自定义日期选择器的示例分析

const times =[ {  name:'2021年',  id:1,  children:[    {      name:'1月',      id:11,      children:[        {          name:'1日',          id:111,          children:[            {              name:'1时',              id:1111,              children:[                {                  name:'1分',                  id:11111,                },                {                  name:'2分',                  id:11112,                },              ]            },          ]        },        {          name:'2日',          id:112,          children:[            {              name:'1时',              id:1121,              children:[                {                  name:'1分',                  id:11111,                },                {                  name:'2分',                  id:11112,                },                             ]            },            {              name:'2时',              id:1121,                          },          ]        },        {          name:'3日',          id:113,          children:[            {              name:'小',              id:1131,            },            {              name:'大',              id:1132            },          ]        }      ]    },    {      name:'2月',      id:12,      children:[        {          name:'1日',          id:121,          children:[            {              name:'1时',              id:1121,              children:[                {                  name:'1分',                  id:11111,                },                {                  name:'2分',                  id:11112,                },                             ]            },            {              name:'2时',              id:1121,                          },          ]        },        {          name:'2日',          id:122,          children:[            {              name:'1时',              id:1121,              children:[                {                  name:'1分',                  id:11111,                },                {                  name:'2分',                  id:11112,                },                             ]            },            {              name:'2时',              id:1121,                          },          ]        },        {          name:'3日',          id:123,          children:[            {              name:'1时',              id:1121,              children:[                {                  name:'1分',                  id:11111,                },                {                  name:'2分',                  id:11112,                },                             ]            },            {              name:'2时',              id:1121,                          },          ]        }      ]    }  ]},{  name:'2022年',  id:1,  children:[    {      name:'1月',      id:11,      children:[        {          name:'1日',          id:111,          children:[            {              name:'1时',              id:1111,              children:[                {                  name:'1分',                  id:11111,                },                {                  name:'2分',                  id:11112,                },              ]            },          ]        },        {          name:'2日',          id:112,          children:[            {              name:'1时',              id:1121,              children:[                {                  name:'1分',                  id:11111,                },                {                  name:'2分',                  id:11112,                },                             ]            },            {              name:'2时',              id:1121,                          },          ]        },        {          name:'3日',          id:113,          children:[            {              name:'小',              id:1131,            },            {              name:'大',              id:1132            },          ]        }      ]    },    {      name:'2月',      id:12,      children:[        {          name:'1日',          id:121,          children:[            {              name:'1时',              id:1121,              children:[                {                  name:'1分',                  id:11111,                },                {                  name:'2分',                  id:11112,                },                             ]            },            {              name:'2时',              id:1121,                          },          ]        },        {          name:'2日',          id:122,          children:[            {              name:'1时',              id:1121,              children:[                {                  name:'1分',                  id:11111,                },                {                  name:'2分',                  id:11112,                },                             ]            },            {              name:'2时',              id:1121,                          },          ]        },        {          name:'3日',          id:123,          children:[            {              name:'1时',              id:1121,              children:[                {                  name:'1分',                  id:11111,                },                {                  name:'2分',                  id:11112,                },                             ]            },            {              name:'2时',              id:1121,                          },          ]        }      ]    }  ]},]module.exports = {  times,}

完成上述步骤后,一个自定义的日期选择器就完成了

微信小程序自定义日期选择器的示例分析

上述就是小编为大家分享的微信小程序自定义日期选择器的示例分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 微信小程序自定义日期选择器的示例分析

本文链接: https://lsjlt.com/news/306440.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 微信小程序自定义日期选择器的示例分析
    这期内容当中小编将会给大家带来有关微信小程序自定义日期选择器的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。日期选择器是我们在写项目的过程中经常遇到的,有需要标题的选择器,也有不需要标题的选择器今...
    99+
    2023-06-26
  • 微信小程序自定义日期选择器
    日期选择器是我们在写项目的过程中经常遇到的,有需要标题的选择器,也有不需要标题的选择器 今天给大家带来一个自定义的时间选择器,废话不多说,直接上代码 第一步:先创建一个picker的...
    99+
    2024-04-02
  • 微信小程序日历弹窗选择器的示例分析
    小编给大家分享一下微信小程序日历弹窗选择器的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先上一个效果图:时间改为5月份...
    99+
    2024-04-02
  • 微信小程序自定义滚动选择器
    本文实例为大家分享了微信小程序自定义滚动选择器的具体代码,供大家参考,具体内容如下 最近项目里有个需求要做个滚动选择器,在网上找了半天也没找到合适的demo,没办法只能发挥我的聪明才...
    99+
    2024-04-02
  • 微信小程序怎么自定义滚动选择器
    这篇文章主要介绍“微信小程序怎么自定义滚动选择器”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序怎么自定义滚动选择器”文章能帮助大家解决问题。js:// pages/xuanzeq...
    99+
    2023-07-02
  • 微信小程序如何自定义多列选择器
    今天小编给大家分享一下微信小程序如何自定义多列选择器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。项目需要,需要实现一个多列...
    99+
    2023-07-02
  • 微信小程序自定义时间段picker选择器
    本文实例为大家分享了微信小程序自定义时间段picker选择器的具体代码,供大家参考,具体内容如下 想实现一个可以选择年份和时间段的日期选择器,如下所示 微信小程序自带的picker...
    99+
    2024-04-02
  • 微信小程序自定义多列选择器使用
    本文实例为大家分享了微信小程序自定义多列选择器的具体代码,供大家参考,具体内容如下 项目需要,需要实现一个多列选择器,在用户确定之前,无论列表如何转,都不会影响已确定值的显示,只要用...
    99+
    2024-04-02
  • 微信小程序日期选择器如何使用
    本文小编为大家详细介绍“微信小程序日期选择器如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序日期选择器如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。需求:在小程序开发中,时常会遇到日期选...
    99+
    2023-07-02
  • 微信小程序日期选择器使用详解
    本文实例为大家分享了微信小程序日期选择器的具体代码,供大家参考,具体内容如下 需求:在小程序开发中,时常会遇到日期选择器、时间选择器或者地区选择器来进行选择的功能。往往设计图上面并不...
    99+
    2024-04-02
  • 微信小程序实现日期范围选择
    本文实例为大家分享了微信小程序实现日期范围选择的具体代码,供大家参考,具体内容如下 样式如下: 分别点击开始日期和结束日期选择时间(底部弹框): date.wxml:  <...
    99+
    2024-04-02
  • 微信小程序自定义复选框
    本文实例为大家分享了微信小程序自定义复选框的具体代码,供大家参考,具体内容如下 1、效果  2、wxml <checkbox-group bindchange="c...
    99+
    2024-04-02
  • 微信小程序的示例分析
    这篇文章主要介绍微信小程序的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!未来的发展趋势未来的发展趋势是一切触手可及。比如去餐馆吃饭,扫一扫二维码就可以看菜单、点菜、付款;到公交站台,扫一扫二维码就知道有哪些...
    99+
    2023-06-26
  • 实现微信小程序中的日期选择器效果
    随着微信小程序的广泛应用,越来越多的开发者需要实现日期选择器效果来提高用户体验。本文将介绍如何在微信小程序中实现日期选择器效果,并给出具体的代码示例。一、实现思路实现日期选择器效果的基本思路是:首先在 WXML 中建立日期选择器组件,通过 ...
    99+
    2023-11-21
    微信小程序 实现 日期选择器
  • 微信小程序App生命周期的示例分析
    小编给大家分享一下微信小程序App生命周期的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!微信小程序App生命周期:on...
    99+
    2024-04-02
  • 微信小程序中怎么自定义一个多列选择器
    这篇文章给大家介绍微信小程序中怎么自定义一个多列选择器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在.wxml建一个自定义picker组件:<picker  &nbs...
    99+
    2024-04-02
  • 微信小程序页面生命周期的示例分析
    小编给大家分享一下微信小程序页面生命周期的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下页面生命周期函数onLo...
    99+
    2024-04-02
  • 微信小程序如何实现日期范围选择
    本篇内容介绍了“微信小程序如何实现日期范围选择”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!样式如下:分别点击开始日期和结束日期选择时间(底...
    99+
    2023-07-02
  • 在微信小程序使用picker实现日期选择
    微信小程序开发项目中,或多或少要使用时间选择器picker实现日期选择。选择开始日期和结束日期 而且选择开始时间后,选择结束时间,能够选择的日期不能比开始日期还要早。要实现以上效果可这样写: 在wxml中写 ...
    99+
    2023-08-25
    微信小程序 小程序 前端
  • 微信小程序怎么自定义复选框
    本篇内容介绍了“微信小程序怎么自定义复选框”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果 wxml<checkbox-g...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作