uni-datetime-picker组件填坑,在mounted后再赋值calendar日历不展示或错误展示回显的日期。

当需求存在tab切换展示uni-datetime-picker,且每次切换需要初始化默认选中日期的时候,就会出现这样的bug。

就以两个不同类型的日期选择框进行切换展示为例:

没填坑之前的代码:

<uni-datetime-picker v-show="activeTab==='part'" type="date" v-model="searchTime"/>
<uni-datetime-picker v-show="activeTab==='all'" type="daterange" v-model="searchTimeRange"/>


//初始化data的数据
data() {
    return {
        searchTime: '',
        searchTimeRange:'',
    }
},

created() {
	this.searchTime = getThisDate();   //getThisDate获取当天日期方法
	this.searchTimeRange = getThisWeek();   //getThisWeek获取本周日期的方法
},

methods: {
changeTab(data) {
    if(data.name===this.activeTab)return;  //点击相同tab时阻止

    //切换时重置日期
	this.searchTime = getThisDate();   
	this.searchTimeRange = getThisWeek();

	this.activeTab = data.name;
    this.getList();
}

显示结果:当选择到其他日期,再切换tab。单个日期选择的选择框是重置的日期,但选择的日历还是前面选择的日期;日期范围选择器的选择框也重置了日期,但选择的日历选中了三个日期。

填坑之路:

最开始想的是组件内日历组件 数据失去响应式或没有重新加载。就简单暴力的用v-if,但结果就是:日期回显不出来,日期选择不能选中,组件完全失效。

然后想到,既然daterange的效果是之前选中的结束日期还在存在,那就在切换时先置空,再赋值本周日期。结果很理想,效果实现。

changeTab(data) {
	if(data.name===this.activeTab)return;
	this.searchTime = getThisDate();
	this.searchTimeRange = [];  //rang选择日期范围的需要重置为空数组,再进行赋值。否则会出现回显错误
	
	this.activeTab = data.name;		
	setTimeout(_=>{
		this.searchTimeRange = getThisWeek();  //重新赋值本周
					
		this.getList();
	},0)
},

但单个日期选择date组件使用这个方法直接完全没有用,还导致最开始选中的时间也没有选中了。因此,就需要对uni-datetime-picker组件的代码进行改造。找到uni_modules文件夹下的uni-datetime-picker.vue文件。

会发现,watch监听value时有个判断.当满足这个判断条件时,就不会再去更新日历组件上面选中的日期。当切换重新赋值,打印isEmitValue会发现非初次赋值日期时为true,满足条件就不会去更新视图选中。

所以可以从父组件上再传一个参数来,判断是否需要刷新视图。改造后的代码如下:

<uni-datetime-picker v-show="activeTab==='part'" type="date" 
v-model="searchTime" :isAnyRefresh="true"/>

在uni-datetime-picker组件内props:

watch的判断增加条件:

完美,收官!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用 `uni-datetime-picker` 组件时,可以在确认选择日期范围后的回调函数中进行日期范围的判断。具体实现方法如下: 1. 在 `template` 中使用 `uni-datetime-picker` 组件,并设置好开始日期和结束日期的 `v-model` 变量: ```html <uni-datetime-picker :start-date.sync="startDate" :end-date.sync="endDate" @confirm="onDateRangeSelected" ></uni-datetime-picker> ``` 2. 在 `script` 中编写 `onDateRangeSelected` 回调函数。在该函数中,判断用户选择的日期范围是否超过1年,以及开始日期是否大于结束日期: ```javascript export default { data() { return { startDate: '', // 开始日期 endDate: '', // 结束日期 }; }, methods: { onDateRangeSelected() { // 判断日期范围是否超过1年 var diff = new Date(this.endDate) - new Date(this.startDate); var oneYearInMs = 365 * 24 * 60 * 60 * 1000; // 1年的毫秒数 if (diff > oneYearInMs) { uni.showToast({ title: '选择的日期范围不能超过1年', icon: 'none', }); return; } // 判断开始日期是否大于结束日期 if (new Date(this.startDate) > new Date(this.endDate)) { uni.showToast({ title: '开始日期不能大于结束日期', icon: 'none', }); return; } // 日期范围符合要求,进行其他操作 // ... }, }, }; ``` 在上述代码中,我们使用 `new Date()` 将日期字符串转换为 `Date` 对象,然后用减法计算出两个日期之间的毫秒数,从而判断日期范围是否超过1年。同时,我们也可以比较两个 `Date` 对象的大小,以判断开始日期是否大于结束日期。如果日期范围不符合要求,我们可以使用 `uni.showToast` 方法向用户提示错误信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值