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

问题描述

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

解决方案

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

延迟更新

html 复制代码
<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-picker
      v-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事件结合

html 复制代码
<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-picker
    v-model="value1"
    type="monthrange"
    range-separator="至"
    start-placeholder="开始日期"
    end-placeholder="结束日期"
    @change="handlerDateChange"
    @clear="handlerDateClear"
    />
</template>

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

相关推荐
To_OC3 小时前
写了三遍 Todo List,我终于搞懂了 React 父子组件到底怎么通信
前端·javascript·react.js
勇往直前plus3 小时前
Vue3(篇一) 核心概念——响应式模板语法与组件基础
前端·javascript·vue.js
咩咩啃树皮4 小时前
第43篇:Vue3计算属性(computed)完全精讲——缓存机制、依赖计算、业务最优解
前端·vue.js·缓存
用户938515635075 小时前
从零搭建 AI 日记助手:用 Milvus 向量数据库 + RAG 让机器读懂你的每一天
javascript·人工智能·全栈
徐小夕5 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
a1117766 小时前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
kyriewen7 小时前
别再乱用useEffect了——你写的10个里有8个不该存在
前端·javascript·react.js
Ivanqhz7 小时前
Rust &‘static str浅析
java·前端·javascript·rust
IT_陈寒8 小时前
SpringBoot这个分页坑,我踩了三天才爬出来
前端·人工智能·后端
颜酱8 小时前
05 | 召回前置准备:根据业务数据库生成各数据库(读取配置阶段)
前端·人工智能·后端