【React】TimePicker进阶:解决开始时间可大于结束时间的业务场景与禁止自动排版

目录


前言

该例子框架为React + TypeScript + Ant Design

📢注意:

本文使用React 18+和Ant Design 5.x版本

需要预先安装dayjs处理日期时间

示例包含完整的类型定义和实时显示功能


提示:以下是本篇文章正文内容,下面案例可供参考

一、实现步骤

完整示例

typescript 复制代码
import React, { useState } from "react";
import ReactDOM from "react-dom/client";
import { TimePicker, Card, Typography } from "antd";
import type { Dayjs } from "dayjs";
import "antd/dist/reset.css";

const { RangePicker } = TimePicker;
const { Text } = Typography;

const App = () => {
  const [timeRange, setTimeRange] = useState<
    [Dayjs | null, Dayjs | null] | null
  >(null);

  const handleChange = (times: [Dayjs | null, Dayjs | null] | null) => {
    setTimeRange(times);

    if (times && times[0] && times[1]) {
      console.log(
        "选择的时间段:",
        times[0].format("HH:mm"),
        "至",
        times[1].format("HH:mm")
      );
    }
  };

  return (
    <div style={{ padding: 24 }}>
      <Card title="时间范围选择器(带校验)" style={{ width: 400 }}>
        <RangePicker
          value={timeRange}
          onChange={handleChange}
          format="HH:mm"
          placeholder={["开始时间", "结束时间"]}
          order={false}
        />

        {timeRange && timeRange[0] && timeRange[1] && (
          <div style={{ marginTop: 16 }}>
            <Text>
              选择的时间段: {timeRange[0].format("HH:mm")} -{" "}
              {timeRange[1].format("HH:mm")}
            </Text>
          </div>
        )}

        <Text type="secondary" style={{ display: "block", marginTop: 8 }}>
          尝试选择开始时间大于结束时间,组件会自动调整顺序
        </Text>
      </Card>
    </div>
  );
};

// 渲染到DOM
const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);
root.render(<App />);

export default App;

二、主要核心

主要解决问题的核心点是,在AntDesign组件RangePicker中有一个属性:order={false}

相关推荐
会飞的战斗鸡13 分钟前
JS中的链表(含leetcode例题)
javascript·leetcode·链表
方也_arkling1 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
qq_177767371 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_177767371 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
web打印社区1 小时前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
烬头88212 小时前
React Native鸿蒙跨平台采用了函数式组件的形式,通过 props 接收分类数据,使用 TouchableOpacity实现了点击交互效果
javascript·react native·react.js·ecmascript·交互·harmonyos
Amumu121382 小时前
Vuex介绍
前端·javascript·vue.js
2601_949809592 小时前
flutter_for_openharmony家庭相册app实战+相册详情实现
javascript·flutter·ajax
qq_177767372 小时前
React Native鸿蒙跨平台通过Animated.Value.interpolate实现滚动距离到动画属性的映射
javascript·react native·react.js·harmonyos
2601_949833392 小时前
flutter_for_openharmony口腔护理app实战+饮食记录实现
android·javascript·flutter