问题
el-date-picker 组件在选择日期范围时会触发两次 change 事件。当用户选择了范围的开始时,会立即触发一次 change 事件。而当用户选择了范围的结束时,又会触发一次 change 事件。
解决方法
1. 延迟更新
<template><div>选择日期--{{dateValue}}</div><el-date-pickerv-model.lazy="dateValue"type="datetimerange"range-separator="To"start-placeholder="开始日期"end-placeholder="结束日期"@change="handleChangeDate"/>
</template>
<script setup >javascript">
import { ElementPlus } from '@element-plus/icons-vue';
import { ref} from 'vue';
const dateValue= ref("");
let debounceTimer = null;const handleChangeDate= (val) => {handleChange(val);
}
const handleChange = (val) => {// 清除已经设置的定时器,以防止多个事件被延迟执行clearTimeout(debounceTimer);debounceTimer = setTimeout(() => {console.log('Date changed:', val);}, 300); // 延迟300毫秒执行
};
</script>
这种方案适合所有时间范围选择(daterange、datetimerange、monthrange、yearrange),但考虑到 JavaScript 是单线程的,如果在指定的时间点上有大量代码正在执行,setTimeout 里的函数可能会被延迟执行。每一个 setTimeou t都是在增加一个新的JavaScript任务,会影响浏览器主线程,导致界面响应变慢。
2. change、clear事件结合
<template><div>选择日期--{{dateValue}}</div><el-date-pickerv-model="dateValue"type="monthrange"range-separator="至"start-placeholder="开始日期"end-placeholder="结束日期"@change="handlerChangeDate"@clear="handlerClearDate"/>
</template>
<script setup >javascript">
import { ref} from 'vue'
const dateValue= ref("");
const handlerChangeDate= (val) => {if(val){console.log(‘handlerChangeDate’)}
}const handlerClearDate= () => {console.log(‘handlerClearDate’)
}
</script>
这种方案适合daterange、monthrange、yearrange等三种时间范围选择