ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Mesop 日期选择器 date_picker 组件完全指南:输入、日历选择与事件处理

Mesop 日期选择器 date_picker 组件完全指南:输入、日历选择与事件处理 Mesop 日期选择器 date_picker 组件完全指南输入、日历选择与事件处理【免费下载链接】mesopRapidly build AI apps in Python项目地址: https://gitcode.com/GitHub_Trending/me/mesop导读本文全面讲解 Mesop 内置的日期选择器组件me.date_picker它允许用户通过日历小部件选择日期或以自由文本形式输入日期底层基于 Angular Material 的 datepicker 组件实现。读完本文你将掌握me.date_picker的全部配置参数外观、校验、占位符、颜色、浮动标签等与DatePickerChangeEvent事件的使用方式并能借助仓库中的可运行示例与端到端测试在 AI 应用中快速落地日期选择交互。功能概述根据 date_picker 官方文档日期选择器Date picker为用户提供了两种输入方式自由文本输入直接在输入框中键入日期日历小部件选择点击日历图标从弹出的日历控件中挑选日期。该组件基于 Angular Material datepicker 组件 提供 Python 接口并通过 protobufdatepicker.proto与 Angular 侧组件datepicker.ts通信最终由 datepicker.ng.html 渲染出mat-form-field、mat-input、mat-datepicker-toggle与mat-datepicker的完整结构。快速上手示例官方文档给出了一个完整的可运行示例对应仓库中的 demo/date_picker.py。该示例演示了日期选择器的核心用法组件与状态绑定、事件回调更新状态、页面渲染所选日期。from dataclasses import field from datetime import date import mesop as me me.stateclass class State: picked_date: date | None field(default_factorylambda: date(2024, 10, 1)) def on_load(e: me.LoadEvent): me.set_theme_mode(system) me.page( path/date_picker, security_policyme.SecurityPolicy( allowed_iframe_parents[https://mesop-dev.github.io] ), on_loadon_load, ) def app(): state me.state(State) with me.box( styleme.Style( displayflex, flex_directioncolumn, gap15, paddingme.Padding.all(15), ) ): me.date_picker( labelDate, disabledFalse, placeholder9/1/2024, requiredTrue, valuestate.picked_date, readonlyFalse, hide_required_markerFalse, coloraccent, float_labelalways, appearanceoutline, on_changeon_date_change, ) me.text(Selected date: _render_date(state.picked_date)) def on_date_change(e: me.DatePickerChangeEvent): state me.state(State) state.picked_date e.date def _render_date(maybe_date: date | None) - str: if maybe_date: return maybe_date.strftime(%Y-%m-%d) return None示例中的关键交互链路如下状态定义State.picked_date使用datetime.date类型初始值为2024-10-01因此页面首次加载时输入框会显示该日期组件渲染me.date_picker的value与state.picked_date绑定实现受控组件式的单向数据流事件回调用户选择或输入有效日期后触发on_date_change回调中通过e.date拿到新日期并写回状态结果展示me.text将当前选中日期按%Y-%m-%d格式展示未选择时显示None。若你在本地运行 mesop可通过mesop main.py启动应用并将页面路径设为/date_picker直接体验该示例。API 详解官方文档通过::: mesop.components.datepicker.datepicker.date_picker与::: mesop.components.datepicker.datepicker.DatePickerChangeEvent两条 API 引用自动生成签名文档。以下基于 datepicker.py 源码逐项展开说明。date_picker 函数签名与参数def date_picker( *, label: str , on_change: Callable[[DatePickerChangeEvent], Any] | None None, appearance: Literal[fill, outline] fill, style: Style | None None, disabled: bool False, placeholder: str , required: bool False, value: date | None None, readonly: bool False, hide_required_marker: bool False, color: Literal[primary, accent, warn] primary, float_label: Literal[always, auto] auto, subscript_sizing: Literal[fixed, dynamic] fixed, hint_label: str , key: str | None None, )各参数说明如下参数类型默认值说明labelstr日期输入框的标签文本渲染为 Angular Material 的mat-label为空时不显示标签on_changeCallable[[DatePickerChangeEvent], Any] \| NoneNone当用户通过日历选择或输入框失焦blur指定了有效日期时触发appearancefill \| outlinefill表单域外观样式对应 Material 的填充式与描边式两种风格styleStyle \| NoneNone应用于日期输入框的样式disabledboolFalse是否禁用该组件placeholderstr占位提示文本如9/1/2024用于展示期望的日期格式requiredboolFalse是否为必填项参与表单校验语义valuedate \| NoneNone初始值使用 Python 标准库datetime.date传入None表示空readonlyboolFalse是否只读只读时不可编辑文本但日历交互是否可用由前端行为决定hide_required_markerboolFalse是否隐藏必填标记Material 表单域默认在必填时显示*号colorprimary \| accent \| warnprimary表单域配色主题需配合 Mesop 主题系统使用float_labelalways \| autoauto标签是否始终浮动或仅在用户输入/聚焦时浮动subscript_sizingfixed \| dynamicfixed是否为提示/错误文本预留一行固定空间fixed还是根据内容从 0 动态增长dynamic切换时可能引起布局抖动hint_labelstr表单域下方的提示文本mat-hint常用于补充格式说明keystr \| NoneNone组件 key用于在同页面多次使用时区分事件来源详见 组件 key 说明注意value只作为初始值使用。当 Python 端状态更新后重新渲染时前端会在ngOnChanges中检测到value变化见 datepicker.ts 第 47-57 行只有初始值字符串发生变化时才会把新值写入FormControl从而避免覆盖用户正在编辑的内容。DatePickerChangeEvent 事件dataclass(kw_onlyTrue) class DatePickerChangeEvent(MesopEvent): Represents a date picker change event. This event will only fire if a valid date is specified. Attributes: date: Date value key (str): key of the component that emitted this event. date: date要点date本次变更产生的日期值Pythondatetime.date对象key由基类MesopEvent提供标识触发事件的组件 key仅在日期有效时触发无效输入如月份 13不会触发该事件对应官方文档中 This event will only fire if a valid date is specified 的说明。在 datepicker.py 中事件通过register_event_mapper注册将前端传来的字符串格式%Y-%m-%d解析为date对象_DATEPICKER_DATE_FORMAT %Y-%m-%d register_event_mapper( DatePickerChangeEvent, lambda userEvent, key: DatePickerChangeEvent( date_try_make_date(userEvent.string_value), keykey.key, ), )源码实现剖析Python 侧组件注册与数据下发datepicker.py 中date_picker通过register_native_component注册为原生组件调用insert_component时将valuedate对象经_try_make_date_str用isoformat()转换为YYYY-MM-DD字符串如2024-10-01后写入 proto 的value字段将on_change回调通过register_event_handler注册并把返回的 handler id 写入on_change_handler_id字段未传回调时该字段为空字符串。对应 proto 消息 datepicker.proto 定义了全部 13 个字段value、placeholder、disabled、required、readonly、hide_required_marker、color、float_label、appearance、subscript_sizing、hint_label、label、on_change_handler_id实现了 Python API 与前端组件的结构化通信。Angular 侧渲染与事件回传datepicker.ts 声明了mesop-datepicker组件standalone关键行为通过provideNativeDateAdapter()使用浏览器原生 Date 适配器即不依赖第三方日期库ngOnChanges中反序列化 proto 配置并将初始日期字符串拆分为年月日year, month - 1, date注意月份从 0 开始设置到FormControlonChange处理MatDatepickerInputEvent仅当输入值有效时构造UserEvent并携带 handler id 与格式化后的日期字符串YYYY-M-D经channel.dispatch回传给 Python 端。模板 datepicker.ng.html 将上述配置逐项映射到 Material 指令上hideRequiredMarker、color、floatLabel、appearance、subscriptSizing作用于mat-form-fieldmat-label仅在有label时渲染matInput绑定disabled、placeholder、required、readonly与(dateChange)事件mat-hint在设置hint_label时显示mat-datepicker-toggle提供日历开关mat-datepicker承载日历面板。从上述结构可以推断所有 Python 参数最终都落到 Material 组件的标准属性上因此其视觉与交互能力与 Angular Material datepicker 基本一致例如支持通过输入框键入日期、点击 toggle 弹出日历、本地化格式由浏览器环境决定等。端到端测试验证仓库为日期选择器提供了 Playwright 端到端测试datepicker_test.ts 与配套应用 datepicker_app.py覆盖三条核心路径可作为组件行为的权威验证依据测试场景操作期望结果输入有效日期点击输入框并填写9/10/2024页面显示Selected date: 2024-09-10事件正确触发输入无效日期填写13/10/2024月份 13 非法事件不触发日期保持初始值2024-10-01从日历选择点击 Open calendar选中日期 15页面显示Selected date: 2024-10-15这三个用例精确对应DatePickerChangeEvent仅有效日期触发 的语义无效输入不会产生状态更新而通过日历选择一定得到合法日期因此必然触发事件并更新展示。与其他组件的配合使用me.date_picker返回单个组件节点可自由嵌套进me.box、me.sidenav、me.card等布局容器中其style参数支持 Mesop 的 Style 样式系统例如设置宽度、外边距等。若需要同时选择起止日期可参考 date_range_picker 组件若在表单中使用可将选中日期存入状态并在提交时校验。示例中展示的me.set_theme_mode(system)跟随系统主题会直接影响coloraccent等配色在不同明暗主题下的呈现效果建议在包含日期选择器的页面中显式设置主题模式。常见问题与注意事项日期格式Mesop 内部以 ISO 格式YYYY-MM-DD在前后端间传输但输入框的占位符与用户键入格式如9/10/2024受浏览器/原生 Date 适配器影响展示时建议按需求格式化示例中使用strftime(%Y-%m-%d)。无效输入不回调键入非法日期如 13 月时on_change不会触发状态保持不变测试中已验证这一点需要校验反馈时可配合required与 Material 表单域的校验样式或自行在回调中做二次校验。value是初始值而非受控值更新 Python 端value不会强制覆盖用户当前正在编辑的内容只有当日期的初始字符串实际变化时前端才会同步见 datepicker.ts 的ngOnChanges逻辑。subscript_sizing布局默认fixed会为提示/错误预留一行空间切换为dynamic时空间随内容增长但提示文本变化会产生布局抖动。组件 key同一页面渲染多个日期选择器时务必通过key区分不同实例的回调来源e.key。小结me.date_picker以极简的 Python API 封装了成熟的 Angular Material datepicker 能力通过 demo/date_picker.py 可直接上手通过 datepicker.py 可理解每个参数的底层映射通过 datepicker_test.ts 可确认有效日期触发事件、无效输入被忽略的确定性行为。对于需要在 Mesop 应用中收集日期的场景这是开箱即用的首选组件。【免费下载链接】mesopRapidly build AI apps in Python项目地址: https://gitcode.com/GitHub_Trending/me/mesop创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表