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

news/2024/9/21 6:54:02

前情

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最新值了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/46972.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

解决VSCode中Debug和运行路径不一致

哈喽,大家好,我是木头左!当尝试调试程序时,程序的运行路径与预期不符。这通常会导致程序无法正确读取文件或访问资源,从而影响调试过程。为了解决这个问题,可以在launch.json文件中配置CWD参数,以确保Debug和运行路径一致。 配置launch.json文件 launch.json文件是VSCod…

redis——基础服务

博主自学redis所用,欢迎交流讨论首先为什么要做一个redis出来?数据库不够用了吗?考虑到原本的应用程序是客户端访问服务端,服务端访问业务数据需要去数据库去拿,而数据库是个持久化的应用程序,是需要磁盘IO的,这就导致了速度会慢,并且如果存在大量的访问,会导致数据库…

接口测试:Mock 的价值与意义

简介 做测试的过程中,对于一些不容易构造、不容易获取的对象,用一个虚拟的对象来替代它,来达到相同的效果,这个虚拟的对象就是 Mock。当做测试的时候,如果后端某些接口还不成熟、所依赖的接口不稳定或者所依赖的接口为第三方接口、构造依赖的接口数据太复杂等等这些问题的…

【CC2DX引擎分析】Action动作的执行流程源码分析

cocos2dx内Action动作的管理与执行流程在引擎源码上的分析。 本文旨在自己对cocos2dx引擎学习的一个笔记总结,对Action动作源码进行分析,加深对动作执行流程的把握,学习架构并之后更好的提高代码质量。 分析总览 从main函数中的Application::getInstance()->run();开始作…

实验一 客户端脚本编程

一、实验目的 通过设计一个个人主页网站,学习常用的HTML标记,学习使用CSS对页面进行美化,掌握JavaScript的语法和常用的浏览器对象,初步学会使用Eclipse创建网站和编辑网页的方法。 二、实验内容和要求 1) 自己设计网页内容,做一张展示自己网页。要求展示的主要内容有:基…

Linux 提权-MySQL UDF

本文通过 Google 翻译 MySQL User Defined Functions – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0 前言 1 什么是用户定义函数 (UDF) ? 2 枚举 UDF 漏洞利用条件2.1 手动枚举 UDF 漏洞利用条件2.1…

1.2 陶瓷电容(MLCC)选型----硬件设计指南(持续补充更新)

本系列文章是笔者总结多年工作经验,结合理论与实践进行整理备忘的笔记。希望能直接指导硬件工程师的设计实操,争取每一条设计要点指南都做到有理有据。既能帮助自己温习整理避免遗忘也能帮助其他需要参考的朋友。笔者也会不定期根据遇到的问题和想起的要点进行查漏补缺。如有…

Profibus转Modbus网关帮助PLC实现智能激光设备通讯

通过Profibus转Modbus网关(XD-MDPB100),可以实现PLC与激光设备之间的无缝连接,实现数据的实时传输与指令的可靠执行。本文将深入探讨PLC通过Profibus转Modbus网关(XD-MDPB100)与激光设备进行通讯的应用案例,带您一窥其中的奥秘。它简单易实现,具有良好的兼容性和可靠性…