欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 【Element Plus系列】解决 DatePicker 组件清空时,触发两次change

【Element Plus系列】解决 DatePicker 组件清空时,触发两次change

2025/2/5 15:48:07 来源:https://blog.csdn.net/duleilewuhen/article/details/145190904  浏览:    关键词:【Element Plus系列】解决 DatePicker 组件清空时,触发两次change

image

问题描述

  el-date-picker 组件在 Element Plus 库中用于日期选择(daterange、datetimerange、monthrange、yearrange),并且在选择日期范围时确实会触发两次 change 事件。这是因为,当用户选择了范围的开始时,会立即触发一次 change 事件。而当用户选择了范围的结束时,又会触发一次 change 事件。

解决方案

  为了解决这个问题,可以采取以下几种策略:

延迟更新

<script setup lang="ts">
import { ElementPlus } from '@element-plus/icons-vue';
import { version as epVersion } from 'element-plus';
import { ref, version as vueVersion } from 'vue';
const value2 = ref("");
let debounceTimer = null;const handleChangeDebounced = (val:any) => {handleChange(val);
}
const handleChange = (val:any) => {// 清除已经设置的定时器,以防止多个事件被延迟执行clearTimeout(debounceTimer);debounceTimer = setTimeout(() => {console.log('Date changed:', val);}, 300); // 延迟300毫秒执行
};
</script><template><p><el-icon color="var(--el-color-primary)"><ElementPlus /></el-icon>Element Plus {{ epVersion }} + Vue {{ vueVersion }}</p><el-divider/><el-date-pickerv-model.lazy="value2"type="datetimerange"range-separator="To"start-placeholder="开始日期"end-placeholder="结束日期"@change="handleChangeDebounced"/>
</template>

【注意】这种方案适合所有时间范围选择(daterange、datetimerange、monthrange、yearrange),但考虑到 JavaScript 是单线程的,如果在指定的时间点上有大量代码正在执行,setTimeout 里的函数可能会被延迟执行。每一个 setTimeou t都是在增加一个新的JavaScript任务,绝对的会影响浏览器主线程的,会造成一定程度达到卡机。

change、clear事件结合

<script setup lang="ts">
import { ElementPlus } from '@element-plus/icons-vue'
import { version as epVersion } from 'element-plus'
import { ref, version as vueVersion } from 'vue'const value1 = ref("");
const handlerDateChange = (val:any) => {if(val){console.log(8)}
}const handlerDateClear = () => {console.log(12)
}
</script><template><p><el-icon color="var(--el-color-primary)"><ElementPlus /></el-icon>Element Plus {{ epVersion }} + Vue {{ vueVersion }}</p><el-date-pickerv-model="value1"type="monthrange"range-separator=""start-placeholder="开始日期"end-placeholder="结束日期"@change="handlerDateChange"@clear="handlerDateClear"/>
</template>

【注意】这种方案适合daterange、monthrange、yearrange等三种时间范围选择。

image

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com