news 2026/9/14 23:12:09

amis Portlet 门户栏目怎么配置 tabs、工具栏与头部展示

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
amis Portlet 门户栏目怎么配置 tabs、工具栏与头部展示

amis Portlet 门户栏目怎么配置 tabs、工具栏与头部展示

【免费下载链接】amis前端低代码框架,通过 JSON 配置就能生成各种页面。项目地址: https://gitcode.com/GitHub_Trending/am/amis

在 amis 中搭建门户页或仪表盘时,常见需求是把多个内容块放进同一个卡片:卡片带 tab 页头,页头右侧有一段描述信息,页头附近放几个操作按钮,并且按钮要跟着 tab 切换或始终固定。amis 的 Portlet(门户栏目)组件就是为这个场景设计的,通过"type": "portlet"的 JSON 配置即可完成,无需写 React 代码。本文按 Portlet 组件文档 中的示例,讲清 tabs、工具栏和头部展示三类配置的写法与适用条件。

配置 tabs:内容块怎么组织

最简的 Portlet 由tabs数组驱动,每个 tab 用title指定页头名称,用tab指定内容区。内容区的类型是 SchemaNode,即纯模板字符串、组件 Schema 或 Schema 数组都可以。description是支持模板的字符串,显示在标题右侧,可以引用外层数据:

{ "type": "page", "data": { "text": "这是一段描述信息" }, "body": { "type": "portlet", "description": "${text}", "tabs": [ { "title": "标题", "tab": "Content 1" }, { "title": "标题2", "tab": "Content 2" } } ] }

两个文档明确给出的展示细节,配置前需要知道:

  • 默认 tabs 只有一项的时候没有选中状态,即只有一个 tab 时页头不显示高亮;
  • 给每个 tab 配置icon可以设置图标,可以是 fontawesome 或 URL 地址,例如"icon": "https://suda.cdn.bcebos.com/images%2F2021-01%2Fdiamond.svg"

用 source 动态生成 tabs

tab 数量固定时直接写数组即可;需要根据数据动态生成时,配置source属性关联数据。Portlet 文档指出具体用法参考 Tabs 选项卡组件,Tabs 文档给出的 source 写法如下(示例结果,其中${arr}指向数据中的数组):

{ "type": "page", "data": { "arr": [ {"a": "收入", "b": 199}, {"a": "支出", "b": 299} ] }, "body": [ { "type": "tabs", "source": "${arr}", "tabs": [ { "title": "${a}", "body": { "type": "tpl", "tpl": "金额:${b|number}元" } } ] } ] }

把这段里的tabs换成portlet即可,source指向的数据项会重复生成选项卡,title中可以用${字段名}取值。

内容较多时的懒加载与销毁(可选)

如果每个 tab 内容较重,文档给出两个开关:

  • mountOnEnter:只有在点击 tab 的时候才渲染,内容较多时可以提升性能,但第一次点击的时候会有卡顿;
  • unmountOnExit:配置"unmountOnExit": true后,切换 tab 时自动销毁隐藏的 tab。

另外单个 tab 上可以配置reload,设置以后内容每次都会重新渲染,对 CRUD 的重新拉取很有用;tabs[x].className用于调整 Tab 区域样式,默认值是"bg-white b-l b-r b-b wrapper-md"

配置工具栏:固定按钮与随 tab 切换的按钮

Portlet 有两个层级的toolbar,文档属性表中的区分很明确:

  • 顶层toolbar:tabs 中的工具栏,不随 tab 切换而变化
  • tabs[x].toolbar随 tab 切换而变化,每个 tab 各自带一组按钮。

按钮本身是普通按钮 Schema,actionType可以是ajaxdialogurl等;文档还展示了dropdown-button聚合多个按钮的写法。按文档示例完整配置如下:

{ "type": "portlet", "toolbar": [ { "label": "固定操作", "type": "button", "actionType": "ajax", "api": "https://3xsw4ap8wah59.cfc-execute.bj.baidubce.com/api/amis-mock/mock2/form/saveForm" } ], "tabs": [ { "title": "Tab 1", "tab": "Content 1", "toolbar": [ { "label": "ajax请求", "type": "button", "actionType": "ajax", "api": "https://3xsw4ap8wah59.cfc-execute.bj.baidubce.com/api/amis-mock/mock2/form/saveForm" }, { "type": "dropdown-button", "level": "link", "icon": "fa fa-ellipsis-h", "hideCaret": true, "buttons": [ { "type": "button", "label": "编辑", "actionType": "dialog", "dialog": {"title": "编辑", "body": "你正在编辑该卡片"} }, { "type": "button", "label": "删除", "actionType": "dialog", "dialog": {"title": "提示", "body": "你删掉了该卡片"} } ] } ] }, { "title": "Tab 2", "tab": "Content 2", "toolbar": [ { "type": "button", "level": "link", "url": "https://www.baidu.com", "actionType": "url", "size": "sm", "label": "跳转2" } ] } ] }

示例中的apiurl是文档自带的 mock 演示地址,实际使用时替换为自己的接口地址。从实现代码 Portlet.tsx 可以看到,工具栏按钮渲染时会合并默认的level: 'link'size: 'sm',因此文档示例中的跳转按钮显式写levelsize只是覆盖默认值,不是必填项。

控制头部展示:描述、隐藏、分隔线

头部相关的属性在文档属性表中集中列出,各自用途如下:

属性类型说明
description模板标题右侧信息,支持${变量}模板
hideHeaderboolean隐藏头部,默认false
dividerboolean去掉分隔线
stylestringObject自定义样式
scrollableboolean是否导航支持内容溢出滚动,verticalchrome模式下不支持该属性;chrome模式默认压缩标签

隐藏头部时文档给出的完整示例:

{ "type": "portlet", "hideHeader": true, "tabs": [ { "title": "Tab 1", "tab": "Content 1" } ] }

注意文档对hideHeader的行为说明:去掉头部后,默认只展示内容 tab 第一项的内容,适合把 Portlet 退化成纯内容卡片的场景。

去掉头部与内容之间的分隔线,把divider设为false;用style做样式微调,文档示例是改边框颜色:

{ "type": "portlet", "style": { "borderColor": '#333' }, "tabs": [ { "title": "Tab 1", "tab": "Content 1" } ] }

默认选中的 tab 与切换事件

配置activeKey可以指定默认选中的选项卡,文档示例使用索引值(1表示第二个 tab);配置onSelect可以监听切换事件,回调会传递key参数和 props,示例中用alert(key)演示:

{ "type": "portlet", "activeKey": 1, "onSelect": "alert(key)", "tabs": [ { "title": "Tab 1", "tab": "Content 1" }, { "title": "Tab 2", "tab": "Content 2" } ] }

效果验证

上述每段配置都可以直接放进 Portlet 组件文档 对应章节的示例区查看渲染效果,这是文档给出的验证方式。要放到自己的项目里,Portlet 就是普通 Schema,跟随 快速开始 中 SDK 或 React 的任一接入方式渲染即可,判断标准是:页头显示配置的 tab 标题、description内容出现在标题右侧、工具栏按钮可点击并按actionType触发对应动作。

几个文档明确的限制,出现不符合预期时先核对:

  • tabs 只有一项时页头无选中状态,不是配置错误;
  • mountOnEnter开启后首次点击 tab 会有卡顿,这是懒加载的预期代价;
  • scrollableverticalchrome模式下不支持;
  • description配置后若模板解析结果为空,头部右侧不显示内容(模板语法见 模板概念文档)。

【免费下载链接】amis前端低代码框架,通过 JSON 配置就能生成各种页面。项目地址: https://gitcode.com/GitHub_Trending/am/amis

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 23:12:02

Nacos 3.2安全护栏:AI服务MCP协议防护实践

1. 项目背景与核心价值Nacos作为云原生时代的服务注册与配置中心,在传统微服务架构中已经证明了其价值。但随着AI应用的爆发式增长,特别是基于Model Context Protocol(MCP)构建的AI服务大量涌现,传统的安全防护机制面临…

作者头像 李华
网站建设 2026/9/14 23:11:59

Vibe Coding与规范驱动开发:AI时代的代码质量防线

1. Vibe Coding的本质与行业冲击波当Andrej Karpathy在2025年首次提出"Vibe Coding"这个概念时,整个硅谷的咖啡厅里突然多了许多拿着语音输入设备对着电脑喃喃自语的开发者。这种新型编程范式彻底颠覆了传统的键盘敲击模式——开发者只需要用自然语言描述…

作者头像 李华
网站建设 2026/9/14 23:10:20

HarmonyOS条形统计图动态生成器开发实践

1. 项目概述这个HarmonyOS条形统计图动态生成器项目,本质上是一个面向教育场景的数据可视化工具。我在实际开发中发现,它完美解决了传统统计图表教学中"数据修改就要重画"的痛点。通过ArkUI框架的响应式设计,实现了数据输入与图表呈…

作者头像 李华
网站建设 2026/9/14 23:10:01

LangGraph框架:大模型智能体开发实战指南

1. LangGraph框架概述:大模型智能体开发新范式LangGraph作为新一代智能体开发框架,正在重塑大模型应用的构建方式。这个由LangChain团队打造的开源工具,专为解决传统智能体开发中的状态管理、持久化执行和人机协作等痛点而生。与常规的LangCh…

作者头像 李华
网站建设 2026/9/14 23:09:20

CTF密码学入门:从密文特征识别到实战破解技巧

1. CTF密码学赛题入门:从"密码天书"到flag的实战解码技巧第一次参加CTF比赛时,我盯着那道Crypto题目整整半小时——屏幕上全是乱码般的字符,题目描述只有一句"find the flag"。当时完全不知道从何下手,直到一…

作者头像 李华