elementUI 时间段快捷选择及禁用(包含d2-crud-plus中使用)

需求

vue项目elementUI,需求为时间范围搜索,带快捷键并且只能选择今天之前,90天内的时间。搜索今天为实时数据,不能使用时间段,只能单独搜索。

※注

需求是今天不可选,只有时间为空时才查询今天,所有下面代码中时间段快捷选择时,结束时间都是昨天。具体可根据自己需求修改。

效果


昨天

近一周

近一月

代码

html 复制代码
<el-date-picker v-model="time" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
        size="small" value-format="yyyyMMdd" :picker-options="disableTime" />
       data() {
    return {
      disableTime: {
        disabledDate: (time) => {
          return time.getTime() > Date.now() - 1000 * 60 * 60 * 24 || time.getTime() < Date.now() - 1000 * 60 * 60 * 24 * 90
        }
      },
    }
  }, 
js 复制代码
<script>
export default {
	data() {
		return {
			// 设置禁用范围
			disableTime: {
        		disabledDate: (time) => {
          			return time.getTime() > Date.now() - 1000 * 60 * 60 * 24 || time.getTime() < Date.now() - 1000 * 60 * 60 * 24 * 90
        		},
		        shortcuts: [
		          {
		            text: '今天',
		            onClick(picker) {
		              picker.$emit('pick', null)
		            }
		          },
		          {
		            text: '昨天',
		            onClick(picker) {
		              const start = new Date()
		              start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)
		              picker.$emit('pick', [start, start])
		            }
		          },
		          {
		            text: '最近一周',
		            onClick(picker) {
		              const end = new Date()
		              const start = new Date()
		              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
		              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)
		              picker.$emit('pick', [start, end])
		            }
		          },
		          {
		            text: '最近一个月',
		            onClick(picker) {
		              const end = new Date()
		              const start = new Date()
		              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
		              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)
		              picker.$emit('pick', [start, end])
		            }
		          }
		        ]
      		},
		}
	}
}
</script>

d2-crud-plus中代码

js 复制代码
export const crudOptions = (vm) => {
	return {
		columns: [
			{
	        	title: '时间',
	        	key: 'time',
	        	type: 'datetime',
	        	search: { // 搜索
	          		disabled: false, // 是否禁用该字段的查询
	          		width: '250px',
	          		component: { // 查询框组件配置,默认根据form配置生成
	            		name: 'el-date-picker',
	            		props: {
	              			'value-format': 'yyyy-MM-dd',
	              			type: 'daterange',
	              			'range-separator': '-',
	              			'start-placeholder': '开始时间',
	              			'end-placeholder': '结束时间',
	              			'picker-options': {
	                			disabledDate(time) {
	                  				return time.getTime() > Date.now() - 1000 * 60 * 60 * 24 || time.getTime() < Date.now() - 1000 * 60 * 60 * 24 * 90
	                			},
	                			shortcuts: shortcuts
	              			}
	            		}
	          		},
	          		order: 2 // 查询字段排序,数字越小越靠前
	        	}
	     	},
		]
	}
}

const shortcuts = [
  {
    text: '今天',
    onClick(picker) {
      picker.$emit('pick', null)
    }
  }, {
    text: '昨天',
    onClick(picker) {
      const start = toNooning()
      const end = toNooning()
      addDays(start, -1)
      addDays(end, -1)
      picker.$emit('pick', [start, end])
    }
  }, {
    text: '近一周',
    onClick(picker) {
      const start = toNooning()
      const end = toNooning()
      addDays(start, -7)
      addDays(end, -1)
      picker.$emit('pick', [start, end])
    }
  }, {
    text: '近一月',
    onClick(picker) {
      const start = toNooning()
      const end = toNooning()
      addDays(start, -30)
      addDays(end, -1)
      picker.$emit('pick', [start, end])
    }
  }
]
function toNooning(date) {
  if (date == null) {
    date = new Date()
  }
  date.setHours(12)
  date.setMinutes(0)
  date.setSeconds(0)
  return date
}
function addDays(date, days) {
  date.setTime(date.getTime() + 3600 * 1000 * 24 * days)
}
相关推荐
LYFlied1 分钟前
WebAssembly (Wasm) 跨端方案深度解析
前端·职场和发展·wasm·跨端
七月丶2 分钟前
实战复盘:我为什么把 TypeScript 写的 CLI 工具用 Rust 重写了一遍?
前端·后端·rust
over6975 分钟前
《闭包、RAG与AI面试官:一个前端程序员的奇幻LangChain之旅》
前端·面试·langchain
JIngJaneIL10 分钟前
基于java+ vue交友系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·交友
苹果酱056717 分钟前
解决linux mysql命令 bash: mysql: command not found 的方法
java·vue.js·spring boot·mysql·课程设计
拉不动的猪20 分钟前
回顾计算属性的缓存与监听的触发返回结果
前端·javascript·vue.js
karshey44 分钟前
【IOS webview】h5页面播放视频时,IOS系统显示设置的icon
前端·ios
树欲静而风不止慢一点吧44 分钟前
小米手环9应用/游戏开发快速入门
前端·javascript·小程序
小七不懂前端1 小时前
我用 NestJS + Vue3 + Prisma + PostgreSQL 打造了一个企业级 sass 多租户平台
前端·vue.js·后端
晚星star1 小时前
2.2 Node的模块实现
前端·node.js