<template>
<yk-tooltip
:arrow="false"
placement="bottom"
:trigger="['focus', 'none']"
:open="openTimepicker"
:close-delay="0"
:overlay-style="{
backgroundColor: '#fff',
color: '#000',
padding: '2px 0 8px',
transform: 'translateY(-8px)',
}"
@open-change="onOpenPickerChange"
>
<yk-input
v-if="type === 'time'"
v-model="inputValue"
placeholder="请选择时间"
:size="size"
:style="style"
:disabled="disabled"
@focus="onFocusInput"
@change="onChangeInput"
>
<template #suffix>
<IconCloseOutline
v-if="isDelete"
class="input-icon delete-icon"
@mouseleave="isDelete = false"
@click="onClickDelete"
/>
<IconTimeOutline
v-else
class="input-icon"
@mouseenter="isDelete = true"
/>
</template>
</yk-input>
<div v-else ref="rangeWrapperRef" class="range-picker-wrapper">
<yk-input
ref="startInputRef"
v-model="startInputValue"
placeholder="开始时间"
size="m"
style="width: 140px"
@focus="onFocusStartInput"
@change="onChangeInput"
></yk-input>
<div>-</div>
<yk-input
ref="endInputRef"
v-model="endInputValue"
placeholder="结束时间"
size="m"
style="width: 140px"
@focus="onFocusEndInput"
@change="onChangeInput"
></yk-input>
<IconCloseOutline
v-if="isDelete"
class="input-icon delete-icon"
@mouseleave="isDelete = false"
@click="onClickDelete"
/>
<IconTimeOutline
v-else
class="input-icon"
@mouseenter="isDelete = true"
/>
</div>
<template #content>
<div class="yk-timepicker-container">
<div class="yk-timepicker">
<div v-if="hourColumn" ref="hourColRef" class="yk-timepicker-column">
<ul>
<li
v-for="h in hourNum"
ref="cellHourRef"
:class="[
'yk-timepicker-cell',
{ 'yk-timepicker-cell-selected': selected.hour[h - 1] },
{ 'yk-timepicker-cell-disabled': isDisabled('hour', h - 1) },
]"
@click.left="selcetCell('hour', h)"
>
{{ getNeededValue('hour', h - 1) }}
</li>
</ul>
</div>
<div v-if="minuteColumn" ref="minColRef" class="yk-timepicker-column">
<ul>
<li
v-for="m in 60"
ref="cellMinutRef"
:class="[
'yk-timepicker-cell',
{ 'yk-timepicker-cell-selected': selected.minute[m - 1] },
{
'yk-timepicker-cell-disabled': isDisabled('minute', m - 1),
},
]"
@click.left="selcetCell('minute', m)"
>
{{ getNeededValue('minute', m - 1) }}
</li>
</ul>
</div>
<div v-if="secondColumn" ref="secColRef" class="yk-timepicker-column">
<ul>
<li
v-for="s in 60"
ref="cellSecondRef"
:class="[
'yk-timepicker-cell',
{ 'yk-timepicker-cell-selected': selected.second[s - 1] },
{
'yk-timepicker-cell-disabled': isDisabled('second', s - 1),
},
]"
@click.left="selcetCell('second', s)"
>
{{ getNeededValue('second', s - 1) }}
</li>
</ul>
</div>
<div
v-if="normalizedUse12Hours"
ref="halfColRef"
class="yk-timepicker-column"
>
<ul>
<li
:class="[
'yk-timepicker-cell',
{ 'yk-timepicker-cell-selected': halfDay === 'am' },
]"
@click.left="onClickHalfDay('am')"
>
AM
</li>
<li
:class="[
'yk-timepicker-cell',
{ 'yk-timepicker-cell-selected': halfDay === 'pm' },
]"
@click.left="onClickHalfDay('pm')"
>
PM
</li>
</ul>
</div>
</div>
<div v-if="$slots.extra" class="yk-timepicker-footer-extra-wrapper">
<slot name="extra"></slot>
</div>
<div v-if="!disableConfirm" class="yk-timepicker-footer">
<yk-button type="secondary" size="s" @click="onClickNow">
此刻
</yk-button>
<yk-button size="s" @click="onConfirm">确定</yk-button>
</div>
</div>
</template>
</yk-tooltip>
</template>
<script setup lang="ts">
import { computed, ref } from 'vue'
import { startWithZero, getNowTimeData, checkTimeStr } from './util'
import type {
TimeSelected,
TimeType,
TimeValue,
ScrollBehavior,
TimePickerProps,
HalfDay,
PickerValue,
RangeTime,
} from './time-picker'
const props = withDefaults(defineProps<TimePickerProps>(), {
modelValue: '',
defaultValue: '',
size: 'l',
style: null,
disabled: false,
disableConfirm: false,
step: null,
type: 'time',
use12Hours: false,
format: 'hh:mm:ss',
disabledHours: () => [],
disabledMinutes: () => [],
disabledSeconds: () => [],
})
const emit = defineEmits(['update:modelValue'])
const inputValue = ref<string | undefined>()
const startInputValue = ref<string | undefined>()
const endInputValue = ref<string | undefined>()
const selectedValue = ref<PickerValue>({
time: { hour: '', minute: '', second: '' },
startTime: { hour: '', minute: '', second: '' },
endTime: { hour: '', minute: '', second: '' },
})
const confirmedValue = ref<PickerValue>({
time: { hour: '', minute: '', second: '' },
startTime: { hour: '', minute: '', second: '' },
endTime: { hour: '', minute: '', second: '' },
})
const selected = ref<TimeSelected>({
hour: Array(24).fill(false),
minute: Array(60).fill(false),
second: Array(60).fill(false),
})
const hourColRef = ref<HTMLElement>()
const minColRef = ref<HTMLElement>()
const secColRef = ref<HTMLElement>()
const rangeWrapperRef = ref<HTMLElement>()
const startInputRef = ref()
const endInputRef = ref()
const openTimepicker = ref(false)
const isDelete = ref(false)
const cellMinutRef = ref([])
const cellHourRef = ref([])
const cellSecondRef = ref([])
const halfColRef = ref()
const halfDay = ref<HalfDay>('pm')
const isStartTime = ref(false)
const isEndTime = ref(false)
let itemHeight: number
// 计算单个时间选项是否禁用
const isDisabled = computed(() => {
const disabledHourArr = props.disabledHours()
const disabledMinutesArr = props.disabledMinutes()
const disabledSecondsArr = props.disabledSeconds()
return (type: TimeType, index: number) => {
let _arr: number[] = []
switch (type) {
case 'hour':
_arr = disabledHourArr
break
case 'minute':
_arr = disabledMinutesArr
break
case 'second':
_arr = disabledSecondsArr
break
default:
break
}
return _arr.includes(index)
}
})
const hourNum = computed(() => {
return normalizedUse12Hours.value ? 13 : 24
})
const hourColumn = computed(() => {
return [/hh:mm:ss/gi, /hh:mm/gi, /hh/gi].some((regex) =>
regex.test(normalizedFormat.value),
)
})
const minuteColumn = computed(() => {
return [/hh:mm:ss/gi, /mm:ss/gi, /mm/gi].some((regex) =>
regex.test(normalizedFormat.value),
)
})
const secondColumn = computed(() => {
return [/hh:mm:ss/gi, /mm:ss/gi, /ss/gi].some((regex) =>
regex.test(normalizedFormat.value),
)
})
const normalizedFormat = computed(() => {
if (/a/gi.test(p
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Vue3+Ts+Less 开发的前端UI框架项目源码.zip(教程+源代码+附上详细代码说明)。一款高含金量的项目,项目经过验证通过,可直接运行 项目代码齐全,教程详尽,有具体的使用说明,是个不错的有趣项目。 项目(高含金量项目)适用于在学的学生,踏入社会的新新工作者、相对自己知识查缺补漏或者想在该等领域有所突破的技术爱好者学习,资料详尽,内容丰富,附上源码和教程方便大家学习参考,
资源推荐
资源详情
资源评论
收起资源包目录
Vue3+Ts+Less 开发的前端UI框架项目源码.zip(教程+源代码+附上详细代码说明) (1035个子文件)
index.html 345B
commitlint.config.js 66B
index.js 62B
components.json 4KB
package.json 3KB
package.json 2KB
package.json 823B
tsconfig.json 813B
package.json 736B
package.json 732B
tsconfig.json 692B
tsconfig.json 528B
develops.json 431B
tsconfig.node.json 386B
tsconfig.json 356B
tsconfig.json 343B
designs.json 214B
theme.less 5KB
variables.less 4KB
markdown.less 4KB
basis.less 3KB
index.less 3KB
index.less 3KB
index.less 3KB
timeline.less 3KB
index.less 3KB
checkbox.less 3KB
animate.less 3KB
variables.less 3KB
index.less 3KB
index.less 3KB
index.less 2KB
index.less 2KB
index.less 2KB
timeline-item.less 2KB
preview.less 2KB
select-view.less 2KB
radio-shape.less 2KB
file-list.less 2KB
index.less 2KB
picture-list.less 2KB
index.less 2KB
index.less 2KB
index.less 2KB
index.less 2KB
index.less 2KB
index.less 2KB
index.less 2KB
index.less 2KB
index.less 2KB
index.less 2KB
index.less 2KB
index.less 2KB
index.less 1KB
index.less 1KB
index.less 1KB
button-shape.less 1KB
index.less 1KB
index.less 1KB
functions.less 1KB
tree-view.less 1KB
tree-view.less 1KB
index.less 1KB
index.less 1KB
index.less 975B
color-card.less 931B
crop.less 916B
main.less 915B
index.less 913B
index.less 885B
index.less 851B
normalize.less 832B
index.less 832B
index.less 818B
index.less 818B
draggle.less 755B
slider-marks.less 733B
icon.less 715B
radio-group.less 714B
mixin.less 695B
index.less 689B
tree-node-switcher.less 631B
tree-node.less 592B
index.less 498B
index.less 494B
index.less 363B
index.less 341B
checkbox-group.less 295B
variables.less 294B
index.less 233B
index.less 232B
index.less 231B
index.less 192B
index.less 169B
variables.less 154B
index.less 91B
index.less 75B
index.less 62B
index.less 60B
index.less 59B
共 1035 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11
资源评论
不会倒的鸡蛋
- 粉丝: 1609
- 资源: 310
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 外置式V型永磁游标电机,额定电流25A,输出转矩122.8N.m,24槽19极,额定转速300rpm,附相关参考文献 模型整体
- ...ur_topology_2_tuxiao.pdf
- 1模型简介:COMSOL Multiphysics对钻孔在不同边界应力作用下的损伤,自定义设置损伤变量并设置多个研究步骤实现
- 6DAD81D7-D0F3-4A1F-8281-6D5705507669.MOV.mov
- 方正二合一保护卡windows驱动文件
- 西门子1500PLC仓储物流 立体仓库程序,附带图纸堆垛机西门子PLC程序+输送线程序 物流仓储 1.涵盖通信,算法,运动控
- MATLAB编程:基于串并联Sagnac环的微波光子滤波器滤波响应频率响应分析
- 基于SpringBoot+Vue+MyBatis实现的音乐网站源码+数据库+文档说明-毕业设计.zip
- 方正软件保护卡V2.1
- 套餐一:针板电极 棒板电极 平板电极击穿电压 静电场仿真 套餐二:COMSOL仿真教学0基础讲解教程 (边界设置 网格 数据)3
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功