Naive UI 的 TimePicker 时间范围限制不生效?
我在用 Naive UI 的 TimePicker 组件,想限制用户只能选 09:00 到 18:00 之间的时间,但设置 :disabled-hours 和 :disabled-minutes 好像没效果,时间还是能随便选。
我试过这样写:
const disabledHours = () => {
return [...Array(9).keys(), ...Array.from({ length: 6 }, (_, i) => 18 + i + 1)]
}
const disabledMinutes = (hour) => {
if (hour === 9) return [...Array(30).keys()] // 09:00 起可选,所以前30分钟禁用?
if (hour === 18) return [...Array.from({ length: 30 }, (_, i) => 30 + i)] // 18:30 后禁用
return []
}
但结果完全不对,要么全禁了,要么根本不限制。是不是我理解错了这两个函数的用法?
首先,我们来看看
:disabled-hours和:disabled-minutes的工作原理。它们的主要作用是返回需要禁用的时间选项,而不是直接指定可选范围。我们需要明确哪些时间不能选择,然后让这些时间被禁用。这里是一个正确的实现方式:
上面的代码中,
disabledHours函数会返回一个数组,包含所有需要禁用的小时数。对于9点之前的和18点之后的所有小时,我们都进行了禁用处理。在
disabledMinutes函数中,我们需要根据当前选择的小时来决定哪些分钟要禁用。如果用户选择了9点,那么0-29分钟会被禁用;如果选择了18点,那么30-59分钟会被禁用。这样设置后,你的 TimePicker 就只能选择从09:30到18:29之间的时间了。这里需要注意,如果你希望用户可以选择整点(比如09:00或者18:00),你需要调整分钟禁用逻辑。
最后别忘了把这两个函数绑定到你的 TimePicker 组件上,像这样:
<n-time-picker :disabled-hours="disabledHours" :disabled-minutes="disabledMinutes"></n-time-picker>这个方案应该能解决你的问题。调试这种时间选择器有时候确实挺烦人的,但只要理解了背后的逻辑,其实也不难。希望这能帮到你!
Naive UI 的
disabled-hours和disabled-minutes都会接收当前选中的小时值作为参数,但你写成了无参函数,所以 hour 实际上是 undefined,条件判断永远不成立。改一下:
核心就是加上
(hour)参数接收选中值,然后用这个值去判断禁哪些分钟。还有个小问题,你原来写
Array.from({ length: 6 }, (_, i) => 18 + i + 1)会生成 19-24,24 超出了小时范围,改成 5 就对了。