评论

modal、picker组件————微信小程序日期选择器(有起始日期与终止日期)全!!!

日期选择界面设计及实现

先上图。

每次开始默认获取当前选择的日期。

wxml

<view class="beijing">
  <view class="second">
    <view class="second_1">
      <view class="second_1_1">
        <button bindtap="begin" type="primary">点击重选</button>
      </view>
      <view class="second_1_2">
        <text>当前开始日期:</text>
        <text style="font-weight: bold;">{{year_0}}年{{month_0}}月{{day_0}}日</text>
      </view>
    </view>
    <view class="second_1">
      <view class="second_1_1">
        <button bindtap="end" type="primary">点击重选</button>
      </view>
      <view class="second_1_2">
        <text>当前终止日期:</text>
        <text style="font-weight: bold;">{{year_1}}年{{month_1}}月{{day_1}}日</text>
      </view>
    </view>
  </view>
</view>

<!-- 日期选择器 -->
<view wx:if="{{isShowDates}}" class="showDates">
 <modal show="true" height='60%;width:100%' bindconfirm='day0_1' no-cancel="true">
      <view class="time_text">{{year}}-{{month}}-{{day}}</view>
      <view class="time_title">
        <view class="time_title_text"></view>
        <view class="time_title_text"></view>
        <view class="time_title_text"></view>
      </view>
      <picker-view wx:if="{{years.length>0 && months.length>0 && days.length>0}}"  indicator-style="height: 50px;" class="view_picker" style="width: 100%;" value="{{value}}" bindchange="bindChange" >
     <!--  <text>{{years}}</text>
      <text>{{months}}</text>
      <text>{{days}}</text> -->
          <picker-view-column class="view_picker_column">
            <view wx:for="{{years}}" class="view_picker_text" wx:key="{{index}}">{{item}}</view>
          </picker-view-column>
          <picker-view-column class="view_picker_column">
            <view wx:for="{{months}}" class="view_picker_text" wx:key="{{index}}">{{item}}</view>
          </picker-view-column>
          <picker-view-column class="view_picker_column">
            <view wx:for="{{days}}"  class="view_picker_text" wx:key="{{index}}">{{item}}</view>
          </picker-view-column>
      </picker-view>
  </modal>
</view>

js


const date = new Date()
const nowYear = date.getFullYear()
const nowMonth = date.getMonth() + 1
const nowDay = date.getDate()
let daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
// 根据年月获取当月的总天数
let getDays = function (year, month) {
  if (month === 2) {
    return ((year % 4 === 0) && ((year % 100) !== 0)) || (year % 400 === 0) ? 29 : 28
  } else {
    return daysInMonth[month - 1]
  }
}
// 根据年月日设置当前月有多少天 并更新年月日数组
let setDate = function (year, month, day, _this) {
  let daysNum = year === nowYear && month === nowMonth ? nowDay : getDays(year, month)
  day = day > daysNum ? 1 : day
  let monthsNum = year === nowYear ? nowMonth : 12
  let years = []
  let months = []
  let days = []
  let yearIndex = 9999
  let monthIndex = 0
  let dayIndex = 0
  // 重新设置年份列表
  for (let i = 1990; i <= nowYear; i++) {
    years.push(i)
  }
  years.map((v, idx) => {
    if (v === year) {
      yearIndex = idx
    }
  })
  // 重新设置月份列表
  for (let i = 1; i <= monthsNum; i++) {
    var k = i;
    months.push(k)
  }
  months.map((v, idx) => {
    if (v === month) {
      monthIndex = idx
    }
  })
  // 重新设置日期列表
  for (let i = 1; i <= daysNum; i++) {
    var k = i;
    days.push(k)
  }
  days.map((v, idx) => {
    if (v === day) {
      dayIndex = idx
    }
  })
  _this.setData({
    //时间列表参数
    years: years,
    months: months,
    days: days,
    //选中的日期
    year: year,
    month: month,
    day: day,
    value: [yearIndex, monthIndex, dayIndex],
  })
}
Page({
 
  data: {
    //时间列表参数
    flag: false,
    years: [],
    months: [],
    days: [],
    //选中的日期
    year: nowYear,
    month: nowMonth,
    day: nowDay,
    //默认开始日期
    year_0: nowYear,
    month_0: nowMonth,
    day_0: nowDay,
    //默认终止日期
    year_1: nowYear,
    month_1: nowMonth,
    day_1: nowDay,
    value: [9999, 1, 1],
    isShowDates:false,
    flag1:0 //用于标记是起始日期与终止日期,1表示起始,2表示终止

  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    setDate(this.data.year, this.data.month, this.data.day, this);
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
  ,
  bindChange: function (e) {
    let val = e.detail.value
    setDate(this.data.years[val[0]], this.data.months[val[1]], this.data.days[val[2]], this)
  }
  ,
  begin(){
    this.setData({
      isShowDates:true,
      flag1:1
    })
  },
  end() {
    this.setData({
      isShowDates: true,
      flag1: 2
    })
  },
  day0_1(){
    if(this.data.flag1==1){
      //更新开始日期
      this.setData({
        year_0: this.data.year,
        month_0: this.data.month,
        day_0: this.data.day
      })
      console.log("当前选择的开始日期:", this.data.year_0, "-", this.data.month_0, "-", this.data.day_0)
    }
    else if (this.data.flag1==2){
      //更新终止日期
      this.setData({
        year_1: this.data.year,
        month_1: this.data.month,
        day_1: this.data.day
      })
      console.log("当前选择的终止日期:", this.data.year_1, "-", this.data.month_1, "-", this.data.day_1)
    }
    console.log("点击了确定!")
    this.setData({
      isShowDates: false
    })
  }

})

wxss

/* pages/xiaoyuanka/myMoneyMoneyHistory/myMoneyMoneyHistory.wxss */
.time_text{
  text-align: center;
}
.showDates{
  position: fixed;
  width: 80%;
  height: 80%;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  font-size: 36rpx;
  z-index: 9999;
}
.time_title{
  display: flex;
  flex-direction: row;
  justify-content: space-around;
}
.view_picker{
  height: 300rpx;
}
.view_picker_text{
  color: #000;
  font-size: 40rpx;
  text-align: center;
  line-height: 100rpx;
}


.second{
  height: 250rpx;
  width: 100%;
  display: flex;
  flex-direction:column;
  justify-content: space-evenly;
  align-content: space-evenly;
  align-items: center;
  /* border: 2rpx solid black; */
  /* margin-top: 10rpx; */

}

.second_1{
  height: 100rpx;
  width: 100%;
  display: flex;
  flex-direction: row;
  justify-content: space-evenly;
  /* border: 2rpx solid red; */
}

.second_1_1{
  height: 100rpx;
  width: 200rpx;
  /* border: 2rpx solid black; */
  line-height: 100rpx; /*行间距*/
  font-weight: bold;
}

.second_1_2{
  height: 100rpx;
  width: 500rpx;
  /* border: 2rpx solid black; */
  line-height: 100rpx; /*行间距*/
  /* text-decoration: underline; */
}

.beijing{
  background-image: url("https://726f-robot-448af6-1258473156.tcb.qcloud.la/%E6%A0%A1%E5%9B%AD%E5%8D%A1%E4%B8%AA%E4%BA%BA%E4%BD%99%E9%A2%9D%E8%83%8C%E6%99%AF.png?sign=eca13a0ce14e07e1681d90fcc92a67f5&t=1583836518");
  height: 100vh;
}

有一个小bug,就是当你选择完开始日期后,再去选择终止日期哪里,默认的日期就是开始日期,这里我没改 如果读者想改随意,不影响最终功能。

点赞 1
收藏
评论
登录 后发表内容