mpvue + Vant Weapp 开发小程序之 van-datetime-picker 和 van-popup

本文详细介绍了如何在WeApp中使用van-popup和van-datetime-picker组件实现自定义的日期选择器。从组件的引入到使用方法,包括如何设置时间范围、监听确认和取消事件,以及如何正确传递和格式化时间戳。

提示:不知道怎么配置环境的请先看第一篇的介绍:点击这里


1.引入

"usingComponents": {
    "van-popup": "/path/vant-weapp/popup/index",
    "van-datetime-picker": "/path/vant-weapp/datetime-picker/index"
  }

2.使用

  1. van-popup默认从中间弹出,position属性可以改变显示位置:可选值为top, bottom, right, left,另外show属性表示是否显示。
  2. van-datetime-picker一般配合van-popup使用:
    <van-popup :show="isShowDatetime" position="bottom">
      <van-datetime-picker
        type="date"
        :value="currentDate"
        @confirm="onDateConfirm"
        @cancel="onDateCancel"
        :min-date="minDate"
        :max-date="maxDate"/>
    </van-popup>

顾名思义,:min-date:max-date表示可选时间的上下限,type="date"必须要有(其他可选值:默认值datetime-日期+时间,time-时间,year-month-年月),@confirm@cancel表示选择日期后点击确定或者取消事件,:value="currentDate"为时间戳,即当前展示的时间。
逻辑代码部分:

  import util from '@/utils'
  export default {
    data () {
      return {
        dateVal: '',
        isShowDatetime: false,
        minDate: new Date((new Date().getFullYear() - 1), 10, 1).getTime(),
        maxDate: new Date((new Date().getFullYear() + 2), 10, 1).getTime(),
        currentDate: new Date().getTime()
      }
    },
    methods: {
      onDateConfirm (e) {
        let time = util.formatDateStr(new Date(e.mp.detail))
        this.dateVal = time
        this.isShowDatetime = false
        this.$emit('onConfirm', {value: this.dateVal, time: e.mp.detail})
      },
      onDateCancel () {
        this.isShowDatetime = false
      },
      showDate () {
        this.isShowDatetime = !this.isShowDatetime
      }
    }
  }
// util.js
const that = {}
that.formatDateStr = function (date) {
  // eslint-disable-next-line one-var
  let MM = '', DD = ''
  if (date.getMonth() > 8) { MM = (date.getMonth() + 1).toString() } else { MM = '0' + (date.getMonth() + 1).toString() }
  if (date.getDate() > 9) { DD = date.getDate().toString() } else { DD = '0' + date.getDate().toString() }
  return date.getFullYear() + '-' + MM + '-' + DD
}
export default that
  1. 注意几点:
  • 这里面传入的时间不是new Date()而是new Date().getTime()
  • 点击确定和取消都要调用this.isShowDatetime = false来隐藏掉日期选择器
  • 月份是从 0 开始,而不是 1

最后,源码地址

Vant 框架中,`van-datetime-picker` `van-time-picker` 是两个独立的组件,分别用于选择日期时间。若需要将它们组合在一起使用以实现一个完整的日期时间选择器,可以通过以下方式实现: ### 1. 页面结构设计 可以在页面中同时放置 `van-datetime-picker` `van-time-picker` 组件,并通过一个统一的弹出层(如 `van-popup`)来控制它们的显示与隐藏。这样用户可以在同一个界面中依次选择日期时间。 ```html <van-popup show="{{ showPicker }}" position="bottom" custom-style="height: 500px" bind:close="onClose"> <view class="picker-container"> <van-datetime-picker type="date" value="{{ dateValue }}" min-date="{{ minDate }}" max-date="{{ maxDate }}" bind:change="onDateChange" /> <van-time-picker value="{{ timeValue }}" bind:change="onTimeChange" /> </view> <van-button type="primary" bindtap="confirmSelection">确定</van-button> </van-popup> ``` ### 2. 数据绑定与事件处理 在页面的 JS 中定义相应的数据属性事件处理函数,以更新用户选择的日期时间。 ```javascript Page({ data: { showPicker: false, dateValue: new Date().getTime(), timeValue: '12:00', minDate: new Date(2020, 0, 1).getTime(), maxDate: new Date(2030, 11, 31).getTime(), selectedDateTime: '' }, onDateChange(event) { this.setData({ dateValue: event.detail }); }, onTimeChange(event) { this.setData({ timeValue: event.detail }); }, confirmSelection() { const { dateValue, timeValue } = this.data; const date = new Date(dateValue); const [hours, minutes] = timeValue.split(':').map(Number); date.setHours(hours); date.setMinutes(minutes); this.setData({ selectedDateTime: date.toLocaleString(), showPicker: false }); }, onClose() { this.setData({ showPicker: false }); } }); ``` ### 3. 样式优化 为了提升用户体验,可以对 `van-datetime-picker` `van-time-picker` 的布局进行样式优化,使其在同一容器中合理排列。 ```css .picker-container { display: flex; flex-direction: column; align-items: center; justify-content: space-around; } ``` ### 4. 兼容性处理 在某些设备上(尤其是安卓系统),可能会出现滑动不流畅或组件行为异常的问题。根据已有经验,可以尝试将 `bind:input` 事件改为 `bind:change` 事件来避免频繁触发导致的性能问题[^4]。 ```html <van-datetime-picker type="date" value="{{ dateValue }}" min-date="{{ minDate }}" max-date="{{ maxDate }}" bind:change="onDateChange" /> <van-time-picker value="{{ timeValue }}" bind:change="onTimeChange" /> ``` ### 5. 弹出层控制 为了确保用户在选择完日期时间后能够正确提交选择结果,建议使用 `van-popup` 控制整个选择器的显示与隐藏,并提供一个“确定”按钮来最终确认选择的值[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值