首页 > 其他分享 >uView的DatetimePicker组件在confirm回调中取不到v-model的最新值

uView的DatetimePicker组件在confirm回调中取不到v-model的最新值

时间:2024-06-18 19:10:17浏览次数:10  
标签:confirm filterDate ...... uView 中取 value ---- confirmFilterDate

前情

uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app,在uniapp生态中uView是其中非常好的全平台的第三方开源ui库,我在公司项目中果断的使用了它。

我一个过滤弹窗有二个表单需要选择开始日期和结束日期,于是想到复用一个日期选择组件,通过设置不同标志来区分是不同表单触发的,再在confrim回调里根据不同标志把v-model上的值赋值到不同表单上

示例代码片段:

<template>
	<view class="page-container">
		<custom-popup 
			:isVisble="filterFormVisible" 
			custom-style="top:206rpx;" 
			@maskClick="fliterFormToggle"
		>
			<view class="filter-main">
				<view class="filter-content">
					// ......
					<text class="filter-type">入驻时间:</text>
					<view class="filter-item-date-wrap">
								<u-input 
									v-model="filterDateStart" 
									placeholder="选择开始时间" 
									readonly 
									@click.native="pickerDate('filterDateStart')"
								>
									<text slot="prefix" class="iconfont">&#xe65f;</text>
								</u-input>
								<view class="filter-connect"></view>
								<u-input 
									v-model="filterDateEnd" 
									placeholder="选择结束时间" 
									readonly 
									@click.native="pickerDate('filterDateEnd')"
								>
									<text slot="prefix" class="iconfont">&#xe65f;</text>
								</u-input>
							</view>
				</view>
				// ......
			</view>
		</custom-popup>
		
		// 日期选择器
		<u-datetime-picker
			:show="showDatePicker"
			ref="datetimePicker"
			mode="date"
			v-model="filterDate"
			:formatter="formatter"
			@cancel="showDatePicker = false"
			@confirm="confirmFilterDate"
		/>
		
	</view>
</template>

<script>
	import customPopup from '../../components/customPopup/customPopup.vue';
	
	export default {
		components: {
			customPopup
		},
		data() {
			return {
				filterFormVisible: false,
				showDatePicker: false,
				filterDateStart: '',
				filterDateEnd: '',
				filterDate: new Date().getTime()
			}
		},
		mounted() {
			// 微信小程序需要用此写法
			this.$refs.datetimePicker.setFormatter(this.formatter)
		},
		methods: {
			filterDateChange(e) {
				console.log('---- filterDateChange ----:', e);
				this.filterForm.regDate = e.detail.value;
			},
			filterReset() {
				
			},
			filterSubmit() {
				
			},
			fliterFormToggle() {
				this.filterFormVisible = !this.filterFormVisible;
			},
			pickerDate(type) {
				this.showDatePicker = true;
				// 标志变量,用于区分是哪个表单触发的
				this.dateType = type;
			},
			confirmFilterDate() {
				console.log('---- confirmFilterDate ----:', this.filterDate);
				// 通过标志变量,把值赋值到正确的表单上
				this[this.dateType] = e.value;
				this.showDatePicker = false;
			},
			formatter(type, value) {
				if (type === 'year') {
					return `${value}年`
				}
				if (type === 'month') {
					return `${value}月`
				}
				if (type === 'day') {
					return `${value}日`
				}
				return value
			},
		}
	}
</script>

// ......

坑位

但是事与愿违,在confirm回调里取到v-model绑定的值不是最新的,而是上一次的值,更奇怪的是你点击二次就能拿到最新的值了

Why?

通过看了DatetimePicker的源码发现,引起这个问题的原因很简单,因为它的代码是先触发confirm回调,再才触发input事件去更新v-model上的值,当你在confirm回调去取值的时候,值还没有更新,点第二次可以那是因为值已经更新了。

组件源码片段如下:

......

// 点击工具栏的确定按钮
confirm() {
	this.$emit('confirm', {
		value: this.innerValue,
		mode: this.mode
	})
	this.$emit('input', this.innerValue)
},
......

解决方案

方案1

既然发现是因为更新延后,我们可以加个定时器来获取

示例代码片段:

......
confirmFilterDate() {
		console.log('---- confirmFilterDate ----:0', this.filterDate);
		setTimeout(() => {
			console.log('---- confirmFilterDate ----:1', this.filterDate);
			// 通过标志变量,把值赋值到正确的表单上
			this[this.dateType] = this.filterDate;
			this.showDatePicker = false;
		}, 0);
	},
......

方案2

通过vue自带的$nextTick来解决

示例代码片段:

......
confirmFilterDate() {
	console.log('---- confirmFilterDate ----:0', this.filterDate);
	this.$nextTick(() => {
		console.log('---- confirmFilterDate ----:1', this.filterDate);
		this[this.dateType] = this.filterDate;
		this.showDatePicker = false;
	})
},
......

方案3(目前推荐)

其实可以不用依赖v-model值,confirm回调有把最新的日期选择值传回来,直接取那个值即可

示例代码片段:

confirmFilterDate(e) {
	console.log('---- confirmFilterDate ----:0', this.filterDate, e);
	this[this.dateType] = e.value;
	this.showDatePicker = false;
},

或者可以再等等,我有向uView官方提了一个PR:https://github.com/umicro/uView2.0/pull/1068 希望能优化这一个问题,如果能合并那后续就可以在confirm回调里愉快的获取v-model最新值了。

标签:confirm,filterDate,......,uView,中取,value,----,confirmFilterDate
From: https://www.cnblogs.com/xwwin/p/18254966

相关文章

  • python后端结合uniapp与uview组件tabs,实现自定义导航按钮与小标签颜色控制
    实现效果(红框内):后端api如下:@task_api.route('/user/task/states_list',methods=['POST','GET'])@visitor_token_requireddeftask_states(user):name_list=['待接单','设计中','交付中','已完成','......
  • uni-app项目uview的表单验证在小程序上不生效
    前情uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app,在uniapp生态中uView是其中非常好的全平台的第三方开源ui库,我在公司项目中果断的使用了它。坑位在用uView做小程序表单验证的时候......
  • 关于Vue弹框组件this.$confirm
    确定后不能刷新页面列表show_tank(record){varthat=thisthis.$confirm({title:'您确定要选择吗?',content:'选择后不可修改',closable:true,//是否显示右上角的xmaskClosable:true,//触发阴影层的点击......
  • 浅谈C#中取消令牌CancellationTokenSource
    基础操作CancellationTokenSourcecancellationTokenSource=newCancellationTokenSource();cancellationTokenSource.Token.Register(()=>{Console.WriteLine("取消了1111");});......
  • uView Picker 选择器 setIndexs用法
    uView官方文档,质量不高。有很多地方写的不清楚。比如Picker选择器组件。项目中有个页面,属于表单,用了Picker选择器,需要根据数据设置选中项。官方文档如下图。看完根本不知道setIndexs到底要填什么值。应该写个示例。无奈只能看源码。得知应该通过如下方式填写:this.$refs.film......
  • R语言中取色器 colorfindr测试
      需求:一张图片,想知道到底是什么颜色,在R语言中的颜色系统中。测试图片如下: 001、install.packages("colorfindr")##安装包library("colorfindr")##加载包get_colors(img="aa.png",min_share=......
  • uView(u-collapse)折叠 展开 高度问题 无法撑开 nextTick
    <u-collapseref="myCollapse"@change="change"accordion><u-collapse-itemv-for="(level,index)inlevelList":key="index":title="level.name"ref="collapseHeight">&......
  • van-dialog 点击confirm确定时如果不满足条件则不允许关闭
    <van-dialogv-model="showDialog"@confirm="confirmFn"@cancel="showDialog=false"title="添加故障现象"show-cancel-button:before-close="onBeforeClose">......
  • uview2 tabs左右滑动切换
    首先思路:在滑动区域监听事件,记录用户的起始位置,根据用户滑动的坐标判断出用户操作。<viewclass="body"@touchstart="touchStart"@touchmove="touchMove"@touchend="touchEnd">新增三个事件,用于监听用户操作touchStart(event){//记录触摸起始点的横坐......
  • uni app uview新增商品页(无限级分类选择和多图上传)
    uniappuview新增商品页(无限级分类选择和多图上传)给自己的牛腩商品库UNIAPP加的一个新增功能,就是通用的新增页面,用的uview2(https://uviewui.com/components/intro.html),能选择无限级分类和多图上传,自已觉得这个新增页面在以后做uniapp项目的时候很多地方会用到吧,先记下来了,以......