# Cols **用途**:`Cols` 是一个用于展示分页滚动数据列表的容器控件,适用于移动端或响应式布局中以卡片形式展示多条记录(如新闻、商品、消息等)。它支持无限滚动加载前一页和后一页数据,具备自动触发加载机制,并可通过点击选中某一条记录。 **类型**:容器控件,继承自 `bricks.VBox` --- ## 主要方法 | 方法名 | 说明 | |--------|------| | `load_first_page(params)` | 首次加载数据,可传入额外参数 `params` 合并到请求中。若配置了 `data_url`,则从服务器拉取数据;否则使用本地数据 `this.data`。 | | `load_previous_page()` | 加载上一页数据,当用户滚动到顶部时自动触发(绑定在 `min_threshold` 事件上)。 | | `load_next_page()` | 加载下一页数据,当用户滚动到底部时自动触发(绑定在 `max_threshold` 事件上)。 | | `dataHandle(d)` | 处理返回的数据 `d`,将每条记录渲染为一个子控件并插入主容器 `main` 中,支持逆序插入(用于上翻页)。 | | `delete_page(page)` | 删除指定页码的所有 DOM 元素及其对应的控件实例,用于清理不再需要的页面内容。 | | `create_main_widget()` | 创建内部显示区域的主控件 `DynamicColumn`,用于管理列数和响应式布局。 | | `show_with_data(data)` | 直接传入静态数据进行展示,不依赖远程 URL,适合临时数据显示。 | | `command_handle(event)` | 工具栏命令处理函数,派发工具栏按钮对应的事件名称。 | --- ## 主要事件 | 事件名 | 触发条件 | 携带数据 | |--------|----------|---------| | `record_click` | 用户点击某一条记录项时触发 | 当前记录的数据对象(`rw.user_data`) | | `command` | 工具栏按钮被点击时(由 `Toolbar` 控件发出),通过 `command_handle` 转发为同名事件 | 按钮定义中的 `name` 参数 | > 注:`min_threshold` 和 `max_threshold` 是 `VScrollPanel` 提供的滚动边界事件,分别表示滚动到顶部和底部,用于驱动分页加载。 --- ## 源码例子 ```json { "id": "cols_example", "widgettype": "Cols", "options": { // 数据源地址,返回符合 PageDataLoader 格式的 JSON "data_url": "/api/news/list", // 请求参数 "data_params": { "category": "tech", "page_size": 10 }, // HTTP 方法,默认 GET "data_method": "GET", // 每页显示行数 "page_rows": 10, // 缓存页数限制 "cache_limit": 5, // 列宽设置(百分比) "col_cwidth": "48%", // 移动端列数 "mobile_cols": 1, // 标题文本(支持国际化) "title": "最新资讯", "i18n": true, // 描述信息(Markdown 支持) "description": "这里是科技类新闻列表", // 工具栏定义 "toolbar": { "items": [ { "type": "button", "text": "刷新", "name": "refresh" }, { "type": "button", "text": "新增", "name": "add_new" } ] }, // 每条记录的视图模板 "record_view": { "widgettype": "CardWidget", "options": { "title": "{title}", // 动态字段替换 "subtitle": "发布时间: {ctime}", "content": "{summary}", "thumbnail": "{image_url}" } } }, // 绑定事件 "binds": [ { "actiontype": "event", "wid": "cols_example", "event": "record_click", "target": "detail_panel", "rtdata": { "action": "show_detail" }, "dataparams": { "source_event": "record_click" } }, { "actiontype": "method", "wid": "cols_example", "event": "refresh", "target": "cols_example", "method": "load_first_page", "params": {} }, { "actiontype": "urlwidget", "wid": "cols_example", "event": "add_new", "target": "Popup", "mode": "replace", "options": { "url": "/forms/news_edit.ui", "method": "GET", "params": {} } } ] } ``` ### ✅ 注释说明: - `"data_url"`:服务端接口路径,返回格式需包含 `rows`, `page`, `pos_rate` 等字段。 - `"record_view"`:定义每个数据项如何渲染成 UI 控件,支持字段插值 `{field}`。 - `"binds"`: - 当用户点击某条记录时,派发 `record_click` 事件,通知 `detail_panel` 显示详情。 - 工具栏“刷新”按钮重新加载第一页数据。 - “新增”按钮打开弹窗(Popup),加载 `/forms/news_edit.ui` 表单界面。 - `VScrollPanel` 自动监听滚动位置,在接近边界时调用 `load_previous_page` / `load_next_page` 实现懒加载。 --- > 💡 **提示**:`Cols` 特别适合构建类似微博、朋友圈、电商商品列表等需要长列表无限滚动的场景,结合 `PageDataLoader` 实现高效内存管理和数据缓存。