微信小程序时间选择器自定义组件

微信小程序官方

方法: 官方提供的 picker、picker-view、picker-view-column 标签(具体点开头官方链接)

一份简单好用的代码(在下方展示),根据需求可修改使用(代码风格很差,自己可优化)

以下是组件,是完整的(js、wxml、wxss、json),可直接复制代码到 components 中 例如:

  • components
    – TimeComponent(组件)

      		-- TimeComponent.js
      		
      		-- TimeComponent.json
      		
      		-- TimeComponent.wxml
      		
      		-- TimeComponent.wxss
    

    对应复制进去先看效果,自己优化

  • pages
    – index (页面)

      		-- index.js
      		
      		-- index.json
      		
      		-- index.wxml
      		
      		-- index.wxss
    

在最后会有页面引用代码

//组件内 js 例:组件名为 TimeComponent.js
const date = new Date()
const years = []
const months = []
const days = []
const hourss = []
const minutes = []
for (let i = date.getFullYear(); i <=2066 ; i++) {
    years.push(i)
}
for (let i = 1; i <= 12; i++) { 
    if(i<10) i = "0"+i
    months.push(i)
}
for (let i = 1; i <= 31; i++) {
    if(i<10) i = "0"+i
    days.push(i)
}
// 时
for (var i = 0; i < 24; i++) {
    if(i<10) i = "0"+i
    hourss.push(i);
}
// 分
for (var i = 0; i < 60; i ++) {
    if(i<10) i = "0"+i
    minutes.push(i);
}
let year; // 年
let month; //  月
let day; // 日
let hours; // 时
let minute; // 分
Component({
    properties: {
        times: {
            type: Object,
            value: {}
        }
    },
    data: {
        years,
        months,
        days,
        hourss,
        minutes,
        value: [0, 0, 0,0,0],
    },
    ready() {
        /**
         * 以下代码可能太繁琐了,可以自己处理优化下代码。
         * 主要功能就是,在点击使用组件的时候,每次进来都展示当前时间,任何时候点击都展示当前点击时候的时				       间。
         */
            const s = this.properties.times;
            const {value, years, months, days, hourss, minutes} = this.data;
            const yearIndex = years.findIndex(v => v == s.year);
            const monthIndex = months.findIndex(v => v == s.month);
            const dayIndex = days.findIndex(v => v == s.day);
            const hoursIndex = hourss.findIndex(v => v == s.hours);
            const minuteIndex = minutes.findIndex(v => v == s.minute);
            value[0] = yearIndex;
            value[1] = monthIndex;
            value[2] = dayIndex;
            value[3] = hoursIndex;
            value[4] = minuteIndex;
            this.year = years[value[0]];
            this.month = months[value[1]];
            this.day = days[value[2]];
            this.hours = hourss[value[3]];
            this.minute = minutes[value[4]];
            this.setData({value});
    },
    methods: {
        /**
         * 关闭当前组件
        */  
        handleCancle() {
            this.triggerEvent('handleCancle')
        },
        /**
         * 监听选择时间
        */
        bindChange(e) {
            const val = e.detail.value;
            this.setData({
              year: this.data.years[val[0]],
              month: this.data.months[val[1]],
              day: this.data.days[val[2]],
              hours: this.data.hourss[val[3]],
              minute: this.data.minutes[val[4]],
            })
        },
        handleOk() {
            console.log(this.year,'years')
            const {year, month, day, hours, minute} = this;
            // 打印,查看后可删除掉
            console.log(`${year}-${month}-${day} ${hours}-${minute}`,);
            console.log(`${year}${month}${day}${hours}${minute}`);
            this.handleCancle(); // 调用关闭函数,关闭组件
            /**
             * 以下方法可把选择好的时间传给父组件(调用当前的组件的页面)如果可用打开注释,不可用删掉即可。
             * 注意:调用一下方法,必须在父组件标签上定义 bind:方法名="方法名" 例如:bind:handleTimeChoice="handleTimeChoice"
             * this.triggerEvent('handleTimeChoice', {year, month, day, hours, minute});
            */
        }
    }
})

<!--组件内 wxml 例:组件名为 TimeComponent.wxml-->
<view class="container">
    <view class="page-body">
        <view class="selected-date">
            <view bindtap="handleCancle" style="color: #999999">取消</view>
            <view bindtap="handleOk" style="color: #EA5504">确定</view>
        </view>
        <picker-view indicator-style="height: 50px;" style="width: 100%; height: 300px;background: #ccc" value="{{value}}" bindchange="bindChange">
            <picker-view-column>
                <view wx:for="{{years}}" wx:key="{{years}}" style="line-height: 50px; text-align: center;">{{item}}年</view>
            </picker-view-column>
            <picker-view-column>
                <view wx:for="{{months}}" wx:key="{{months}}" style="line-height: 50px; text-align: center;">{{item}}月</view>
            </picker-view-column>
            <picker-view-column>
                <view wx:for="{{days}}" wx:key="{{days}}" style="line-height: 50px; text-align: center;">{{item}}日</view>
            </picker-view-column>
            <picker-view-column>
                <view wx:for="{{hourss}}" wx:key="{{hourss}}" style="line-height: 50px; text-align: center;">{{item}}时</view>
            </picker-view-column>
            <picker-view-column>
                <view wx:for="{{minutes}}" wx:key="{{minutes}}" style="line-height: 50px; text-align: center;">{{item}}分</view>
            </picker-view-column>
        </picker-view>
    </view>
</view>
<!--组件内 wxss 例:TimeComponent.wxss-->
.container {
    width: 100%;
    position: fixed;
    bottom: 0;
    left: 0;
    background-color: #FFFFFF;
}
.selected-date {
    padding: 20rpx 40rpx;
    display: flex;
    background-color: #FFFFFF;
    justify-content: space-between;
}
// 组件内 json  例:TimeComponent.json
{
    "component": true,
    "usingComponents": {}
}

以下是页面调用组件(使用方法)

可以当作父组件,要引入子组件(时间选择器组件)

// 页面 index.js
Page({
  data: {
    picker: false,
    times: null,
  },
  onLoad() {},
  handleTimeComponent() {
  /*
  * 下面的 new Date() 放在这里,没有放在全局的原因
  * 是因为,每次点击可以拿到当前最新时间,如果放在全局,只能拿到进入页面的时间,后面的时间不会变化。
  */
    const date = new Date()
    this.setData({times: {year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate(), hours: date.getHours(), minute: date.getMinutes()},picker: true});
  },
  handleCancle() {
    this.setData({picker: false})
  }
})
<!-- 页面 index.wxml-->
<view>
    <text bindtap="handleTimeComponent">选择时间</text>
	<view wx:if="{{picker}}" class="timeChoiceStyle">  
	  <component-time times="{{times&&times}}" bind:handleCancle="handleCancle" bind:handleTimeChoice="handleTimeChoice"/>
	</view>
</view>
<!--页面 index.wxss-->
.timeChoiceStyle {
  width: 100%;
  height: 100vh;
  position: fixed;
  top: 0;
  left: 0;
  background-color: rgba(0, 0, 0, 0.5);
}
<!--页面 index.json-->
// 例如:组件名 TimeComponent -> 下面有 TimeComponent.js TimeComponent.wxml TimeComponent.wxss TimeComponent.json
// 直接引入到目录即可,不用引入后缀名,否则会报错
{
  "usingComponents": {
    "time-component": "../../components/TimeComponent"
  }
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值