element-plus 日期选择添加确定按钮

需求:选择日期后,点击确定按钮关闭面板

思路:

  1. 使用shortcuts自定义确定和取消按钮
  2. 选择日期后使用handleOpen()强制开启面板
  3. 点击确定后使用handleClose()关闭面板
javascript 复制代码
<template>
    <el-date-picker
        ref="pickerRef"
        v-model="dateValue"
        type="daterange"
        range-separator="To"
        start-placeholder="Start date"
        end-placeholder="End date"
        :shortcuts="shortcuts"
        @change="dateChange"
        @focus="focusChange"
    />
</template>

<script setup>
    import { ref, nextTick } from 'vue'
    import { ElButton, ElDatePicker } from 'element-plus'

    const dateValue = ref('')
    const pickerRef = ref(null)
    let isClickPicker = false
    const shortcuts = ref([
        {
            text: '取消',
            onClick(picker) {
                console.log('点击取消')
                isClickPicker = true
                pickerRef.value && pickerRef.value.handleClose()
                setTimeout(() => {
                    dateValue.value = ''
                }, 10)
            }
        },
        {
            text: '确定',
            onClick(picker) {
                // 关闭面板
                isClickPicker = true
                console.log('点击确定')
                if(!dateValue.value) {
                  // message.warning('请选择日期!')
                  console.log('请选择日期!')
                  return false
                }
                pickerRef.value && pickerRef.value.handleClose()
            }
        }
    ])
    const dateChange = (date) => {
        pickerRef.value && pickerRef.value.handleOpen()
    }
    const focusChange = () => {
        // 点击确定后聚焦,强制关闭面板
        if (isClickPicker) {
            pickerRef.value && pickerRef.value.handleClose()
            isClickPicker = false
        }
    }
</script>

<style>
    .el-picker-panel__body-wrapper {
        height: 108%;
        border: 1px solid #e4e4e4;
        width: 100%;
    }
    .el-date-picker.has-sidebar {
        width: 330px !important;
    }
    .el-picker-panel__sidebar {
        right: 0px;
        top: 310px !important;
        width: 150px;
        display: flex;
    }
    .el-picker-panel__body {
        padding-bottom: 20px;
        margin-left: 0px !important;
    }
</style>
相关推荐
晓得迷路了几秒前
栗子前端技术周刊第 150 期 - Stack Overflow 开发者调查结果、TanStack Start 1.0...
javascript·css·后端
vx_Biye_Design3 分钟前
PHP中医养生馆预约系统60841-计算机课程设计、毕业设计
vue.js·spring boot·后端·mysql·php·课程设计·express
IT_陈寒4 分钟前
Vite性能优化完全指南
前端·人工智能·后端
燕落南枝5 分钟前
HTML 表单入门:表单容器、文本框与密码框属性详解
前端·microsoft·html
TYC919 分钟前
Mac创建Vue3+TypeScript或者React+TypeScript项目
前端·javascript·typescript
程序员小孔.20 分钟前
基于 SpringBoot + UniApp + Vue 的家政服务系统设计与实现
前端·数据库·spring boot·python·docker·微信小程序
Profile排查笔记26 分钟前
指纹浏览器 GitHub 项目怎么选?先看仓库交付的是工具、内核还是管理器
前端·人工智能·后端·自动化
风骏时光牛马31 分钟前
云原生驱动的分布式高可用架构设计与落地实践
前端
梦曦i37 分钟前
uni-app x 专属 Pinia 库正式发布
前端·pinia·uni-app x
一次旅行2 小时前
DeepSeek‑V4.1‑Flash‑1017完整解读:模型升级+Search/Fetch搜索API开放,Agent开发者要注意哪些坑
前端·网络·人工智能