完全指南:用纯 Python 配置字段、表头、排序与过滤)
Reflex 中 AG Grid 列定义Column Definitions完全指南用纯 Python 配置字段、表头、排序与过滤【免费下载链接】reflex️ Web apps in pure Python 项目地址: https://gitcode.com/GitHub_Trending/re/reflexAG Grid 是功能强大的企业级数据网格而 Reflexreflex-enterprise包提供的rxe.ag_grid组件让你完全在 Python 侧定义它的列。本文将围绕 docs/enterprise/ag_grid/column-defs.md 这一核心文档展开系统讲解column_defs的写法、default_col_def全局默认列配置以及表头、排序、过滤、宽度、值变换value getter / formatter、分组列和动态列等进阶用法。读完本文你将能够用字典列表的方式在 Reflex 应用中声明出完整的、可排序可过滤可编辑的 AG Grid 表格。认识 column_defsAG Grid 的列定义入口在 Reflex 中rxe.ag_grid组件通过column_defs属性接收列定义row_data接收要显示的数据。column_defs是一个 Python 列表列表中的每个字典代表一列字典的键就是 AG Grid 的列属性。以 docs/enterprise/ag_grid/index.md 中的首个示例为基础一个包含 3 列的最简网格如下import reflex as rx import reflex_enterprise as rxe import pandas as pd df pd.read_csv(data/wind_dataset.csv) column_defs [ {field: direction}, {field: strength}, {field: frequency}, ] def ag_grid_simple(): return rxe.ag_grid( idag_grid_basic_1, row_datadf.to_dict(records), column_defscolumn_defs, width100%, )这里有几个关键点id是必填的它用于在页面上唯一标识当前 AG Grid 实例同一页面出现多个网格时每个网格的id必须互不相同否则无法正确渲染和管理。row_data接收的是字典列表每个字典代表一行[ {direction: N, strength: 0-1, frequency: 0.5}, {direction: NNE, strength: 0-1, frequency: 0.6}, {direction: NE, strength: 0-1, frequency: 0.5}, ]column_defs也可以直接从 DataFrame 的列名批量生成避免手写每个字段column_defs [{field: i} for i in df.columns]关于命名风格的重要说明原文档特别给出了一条警告如果你是从其他 AG Grid 实现迁移过来的Reflex 同样支持属性名使用 camelCase驼峰写法。例如headerName、checkboxSelection、cellEditor都是合法的。不过官方推荐的规范是使用snake_case下划线风格例如header_name、checkbox_selection、cell_editor——这与 AG Grid 官方 React 文档中普遍使用的 camelCase 不同详见 column-defs.md 顶部的警示框。建议新建项目一律使用 snake_casecamelCase 仅作为从既有 AG Grid 代码迁移时的兼容手段。default_col_def为所有列统一设置默认属性当你有大量列且希望它们共享同一组行为比如都可排序、可过滤、可拖拽调整宽度时不必在每一列里重复书写。AG Grid 提供default_col_def属性来定义所有列的默认配置default_col_def { sortable: True, filter: True, resizable: True, } rxe.ag_grid( idag_grid_basic_default, row_datadf.to_dict(records), column_defscolumn_defs, default_col_defdefault_col_def, width100%, )从实现角度看default_col_def与 AG Grid 原生的defaultColDef一一对应其语义是网格在解析每一列时先应用默认配置再应用该列自身的column_defs字典。因此个别列仍可以通过自己的列定义覆盖默认值——例如某列写{field: direction, sortable: False}就会在全局默认sortable: True的基础上单独关闭排序。合理组合default_col_def与逐列覆盖是保持列配置 DRY 的关键手法。表头自定义header_name 与 header_tooltip未显式指定表头时AG Grid 会取field名称并将首字母大写后显示。通过header_name键可以完全自定义表头文案column_defs [ {field: country}, {field: pop, header_name: Population}, {field: lifeExp, header_name: Life Expectancy}, ]header_name的完整语义是要渲染在列头的名称若未指定且提供了field则默认使用字段名作为表头。与之配套的还有header_tooltip用于给列头挂一个悬停提示。两者可以这样同时使用column_defs [ { field: pop, header_name: Population, header_tooltip: Country population in 2007, }, ]排序、过滤与宽度等常用列属性column_defs中可用的属性非常丰富。根据 index.md 中 column_def props 一节整理的核心属性如下属性类型说明fieldstr从行对象中取单元格数据的字段名col_idstr \| None列的唯一定义 ID可选缺省时默认取fieldtypestr \| None列的类型可指向网格内定义的列类型组cell_data_typebool \| str \| None该列单元格的数据类型True表示从行数据推断默认行为传字符串可指定具体类型False表示不设类型hidebool设为True隐藏该列editablebool \| None该列单元格是否可编辑filterAGFilters \| str \| None该列使用的过滤器设为True使用默认过滤器也可指定过滤器名见下文过滤类型floating_filterbool是否在列头下方显示浮动过滤输入框header_namestr \| None列头显示名称header_tooltipstr \| None列头悬停提示checkbox_selectionbool \| None是否渲染用于行选择的多选框cell_editorAGEditors \| str \| None该列单元格的自定义编辑器见下文编辑cell_editor_paramsdict[str, list[Any]] \| None传给 cellEditor 组件的参数除了上表还有sortable是否可排序、resizable是否可拖拽调整列宽、width列宽像素值等常用属性它们同样可以直接出现在列定义字典中例如column_defs [ {field: country, sortable: False}, {field: pop, header_name: Population, width: 160}, {field: lifeExp, header_name: Life Expectancy, filter: True}, ]排序与过滤的开关逻辑排序默认情况下点击列头即可对任意列排序在列定义中设置sortable: False可单独禁用某列的排序。过滤设置filter: True启用该列默认过滤器也可以指定过滤类型——rxe.ag_grid.filters.date、rxe.ag_grid.filters.number、rxe.ag_grid.filters.text分别保证输入值符合日期、数字、文本类型rxe.ag_grid.filters.set与rxe.ag_grid.filters.multi仅在 AG Grid Enterprise 版本中可用column_defs [ {field: Task, filter: True}, {field: Start, filter: rxe.ag_grid.filters.date}, {field: Duration, filter: rxe.ag_grid.filters.number}, {field: Resource, filter: rxe.ag_grid.filters.text}, ]浮动过滤器在列定义或default_col_def中设置floating_filter: True即可在列头下方显示内联过滤输入框对所有列生效时放在default_col_def中即可。多列过滤器EnterpriseagMultiColumnFilter可以把多种过滤类型组合到同一列上column_defs [ { field: athlete, filter: agMultiColumnFilter, filter_params: { filters: [ {filter: agTextColumnFilter}, {filter: agSetColumnFilter}, ], }, }, ]注意企业版过滤器通常需要通过enterprise_modules属性显式导入对应模块例如agSetColumnFilter需要SetFilterModuleagMultiColumnFilter需要MultiFilterModule过滤器工具面板side_barTrue时显示需要FiltersToolPanelModule。详见 index.md 中的 Functionality you need is not available/working in Reflex 一节。值变换在列定义里做计算与格式化列定义不仅是取字段、显示字段还可以嵌入值变换逻辑在网格前端完成计算与格式化从而减少后端预处理负担。这些用法在 docs/enterprise/ag_grid/value-transformers.md 中有系统介绍都属于列定义字典的键。value_getter计算单元格的值value_getter接收行数据params.data并返回要显示的值例如两列求和column_defs [ {field: col_a, header_name: Column A}, {field: col_b, header_name: Column B}, { field: sum, header_name: Sum, value_getter: params.data.col_a params.data.col_b, }, ]value_formatter格式化单元格的值value_formatter接收单元格的值params.value并返回格式化后的文本例如给价格加货币符号column_defs [ {field: product_name, header_name: Product Name}, { field: price, header_name: Price ($), value_formatter: $ params.value, }, ]格式化表达式有多种写法文档推荐的优先级是简洁的内联 JavaScript 表达式最可靠Python lambda 适合做基础类型转换lambda 收到的是一个符号化的params变量短箭头函数可以用rx.vars.FunctionStringVar.create(...)传入CURRENCY_FORMATTER rx.vars.FunctionStringVar.create( (params) $ params.value.toFixed(2) ) column_defs [{field: price, value_formatter: CURRENCY_FORMATTER}]需要提醒的是过长的多行函数体往往渲染失败逻辑一旦复杂建议在 Python 后端先算好或改用cell_renderer单元格渲染器可用 Reflex 组件替换单元格内容。此外value_getter与value_formatter始终作为列定义的一部分直接传入不会被注册成 AG Grid 的独立 components。分组列用 children 组织列层级AG Grid 支持把多列组织到同一个父级列组下这在 docs/enterprise/ag_grid/aligned-grids.md 的对齐网格示例中有完整体现。父列用children键承载子列并用column_group_show控制子列在组内的开合状态column_defs [ {field: athlete}, {field: age}, { header_name: Medals, children: [ { field: total, column_group_show: closed, col_id: total, value_getter: params.data.gold params.data.silver params.data.bronze, width: 100, }, {field: gold, column_group_show: open, width: 100}, {field: silver, column_group_show: open, width: 100}, {field: bronze, column_group_show: open, width: 100}, ], }, ]这个例子同时展示了children列组、col_id显式指定列 ID、value_getter与width的组合用法。需要留意的是列组的展开收起会改变列集合因此分组列与 pivot透视功能不兼容两者不要同时用于对齐网格。动态列定义把 column_defs 放进 State由于column_defs只是普通 Python 数据它可以被放进 Reflex State 变量中从而实现运行时切换列的效果。index.md 的 AG Grid with State 一节给出了完整示例点击按钮在全列与两列之间切换class AgGridState(rx.State): The app state. all_columns: list [] two_columns: list [] column_defs: list all_columns n_clicks 0 rx.event def init_columns(self): self.all_columns [ {field: country}, {field: pop}, {field: continent}, {field: lifeExp}, {field: gdpPercap}, ] self.two_columns [ {field: country}, {field: pop}, ] self.column_defs self.all_columns rx.event def update_columns(self): self.n_clicks 1 if self.n_clicks % 2 ! 0: self.column_defs self.two_columns else: self.column_defs self.all_columns def ag_grid_simple_with_state(): return rx.box( rx.button(Toggle Columns, on_clickAgGridState.update_columns), rxe.ag_grid( idag_grid_basic_with_state, row_datadf.to_dict(records), column_defsAgGridState.column_defs, on_mountAgGridState.init_columns, width100%, height40vh, ), width100%, )关键机制是每当column_defs这个 State 变量被更新网格就会用新的列定义重新渲染。同理row_data也可以来自 State例如AGGridState.data这样的list[dict]变量让数据与列都保持响应式。这种做法在仪表盘、报表类应用中非常实用——用户的操作如按钮点击、表单提交可以直接改变网格的列结构。与 pandas / 数据库集成列定义与数据源解耦是 Reflex AG Grid 的一大特点pandas 场景用df.to_dict(records)把 DataFrame 转成字典列表喂给row_data用[{field: i} for i in df.columns]或手写列表喂给column_defs。仓库文档演示用的示例数据位于 docs/app/data/如wind_dataset.csv、gapminder2007.csv、GanttChart-updated.csv。数据库场景index.md 的 AG Grid with Data from a Database 一节演示了完整链路页面加载时把 CSV 数据插入数据库insert_dataframe_to_db用rx.var计算属性从数据库查出数据并返回list[dict]供row_data使用单元格编辑通过cell_value_changed事件回写数据库session.mergesession.commit。此场景下列定义同样只是普通字典列表与后端存储方式完全解耦。编辑、选择与更多列级能力列定义中的editable、cell_editor、cell_editor_params组合起来即可开启单元格编辑。AG Grid 内置 7 种编辑器对应rxe.ag_grid.editors下的text、large_text、select、rich_select、number、date、checkbox。例如给人口列配数字编辑器、给大洲列配下拉选择编辑器column_defs [ {field: country}, { field: pop, header_name: Population, editable: True, cell_editor: rxe.ag_grid.editors.number, }, { field: continent, editable: True, cell_editor: rxe.ag_grid.editors.select, cell_editor_params: { values: [Asia, Europe, Africa, Americas, Oceania] }, }, ]单元格数据发生变化时可通过on_cell_value_changed事件触发处理行选择则可用checkbox_selection开启多选框并配合row_selection{mode: multiple}。这些能力的具体用法分别见 cell-selection.md 与 index.md 的对应章节。安装前提与深入阅读本文所述功能属于reflex-enterprise包需要与reflex一起安装pip install reflex-enterprise并以后缀为rxe的方式导入使用如rxe.ag_grid、rxe.ag_grid.api(...)。免费应用同样可以使用这些企业组件只是会在应用右下角显示 Built with Reflex 徽标详见 docs/enterprise/overview.md。若要启用 AG Grid Enterprise 专有能力可设置环境变量AG_GRID_LICENSE_KEY。如果某个ag_grid属性没有自动导入所需模块可通过community_modules或enterprise_modules属性手动传入模块名set[str]浏览器控制台会给出缺失模块的警告。AG Grid 的官方 API如select_all()、export_data_as_csv()、get_data_as_csv(callback...)也可以通过rxe.ag_grid.api(id...)直接调用。想要继续深入列定义相关的主题推荐按顺序阅读仓库内的以下文档AG Grid 总览与全功能示例值变换value getter / formatter / cell renderer对齐网格与列组树形数据列配置透视模式与列变更主从网格的列定义网格主题与列样式单元格选择与列交互本文的核心结论可以概括为一句话在 Reflex 中AG Grid 的列就是一份普通的 Python 字典列表——字段、表头、排序、过滤、宽度、编辑器、值变换、分组乃至整个列的增删切换全部可以在纯 Python 侧完成无需编写任何 JavaScript。【免费下载链接】reflex️ Web apps in pure Python 项目地址: https://gitcode.com/GitHub_Trending/re/reflex创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考