news 2026/9/9 23:20:10

ToolJet App-Builder 右侧边栏(Right Sidebar)完全指南:组件库、属性面板与配置检查器实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ToolJet App-Builder 右侧边栏(Right Sidebar)完全指南:组件库、属性面板与配置检查器实战

ToolJet App-Builder 右侧边栏(Right Sidebar)完全指南:组件库、属性面板与配置检查器实战

【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 🚀项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet

ToolJet 的可视化应用编辑器中,右侧边栏是构建界面时使用频率最高的区域之一:它既承载着用于搭建 UI 的组件库(Components Library),也承载着用于精细化控制选中组件的属性面板(Properties Panel)。本文以 right-sidebar.md 为主体,结合 ToolJet 前端源码逐层拆解右侧边栏的组成结构、组件分区的真实映射关系、搜索匹配机制,以及属性面板如何打开、如何分区组织属性并支持事件处理。读完本文,你将能够熟练完成"从右侧组件库取组件拖入画布 → 点击组件手柄打开属性面板 → 设置值、改名、绑定数据并创建事件处理器"的完整工作流,并理解其背后对应的前端实现。

说明:文中出现的源码路径均以仓库根目录为起点,读者可按路径深入阅读;图片位于 docs/static/img/v2-beta/app-builder/rightsidebar/ 目录,为 App-Builder 右侧边栏的真实截图。

一、右侧边栏的整体定位

ToolJet App-Builder 将编辑器划分为若干区域:中央是 Canvas 画布(组件实际摆放的位置),左侧是文件/页面管理边栏,右侧就是本篇文章的主角——Right Sidebar。官方对 right-sidebar.md 的定义非常明确:

右侧边栏上的Components Library(组件库)包含所有可用的组件。你可以用它把组件从库中拖拽(drag-and-drop)到画布上。组件库将组件按分区(sections)组织,你还可以输入搜索词快速定位所需组件。

从前端实现看,右侧边栏并非单一视图,而是由 zustand store 中的状态activeRightSideBarTab驱动的多 Tab 容器。在 RightSideBar.jsx 中可以看到三种视图分支:

  • PAGES:页面设置(Pages / Page Settings);
  • COMPONENTS:组件库(Components Library,本文第二节);
  • CONFIGURATION:组件配置面板(Properties Panel / Config Inspector,本文第三节)。

Tab 枚举定义在 rightSidebarConstants.js:

export const RIGHT_SIDE_BAR_TAB = { COMPONENTS: 'components', CONFIGURATION: 'configuration', PAGES: 'pages', };

其中COMPONENTS(组件库)CONFIGURATION(属性面板)正是官方文档重点讲解的两个能力,对应源码目录 frontend/src/AppBuilder/RightSideBar/ComponentManagerTab/ 与 frontend/src/AppBuilder/RightSideBar/Inspector/。当画布中未选中任何组件、且当前 Tab 不是 PAGES 时,配置面板会展示"未选中组件"的空状态提示(见 ComponentConfigurationTab.jsx),并引导用户"点击画布上的组件以查看并编辑其属性"。

二、组件库:按区组织的拖拽面板

2.1 核心交互:拖放即生成组件

组件库的职责非常单一且高效:将组件从右侧拖拽到中央画布。ToolJet 的组件全部是可复用构件,官方组件目录文档将其归纳为"用于构建应用程序 UI 的构建块"(见 docs/docs/widgets/overview.md),支持拖放、选中、复制粘贴、批量框选等操作。

在画布侧,拖放由 AppCanvas/Hooks/useCanvasDropHandler.js 等 Hook 承接;在右侧组件库侧,DragLayer.jsx 为每个组件卡片提供可拖拽层。因此鼠标按住某一组件卡片拖到画布上方松开,ToolJet 便会基于该组件的定义(componentTypeDefinitionMap)在画布落点实例化一个真实组件。

2.2 分组结构:官方"分区"背后是 sectionConfig

文档强调组件库"将组件组织进多个分区(sections)"。这套分区的真实配置位于 sectionConfig.js,ComponentsManagerTab.jsx 会遍历它并用 Accordion(手风琴折叠面板)渲染每个分区。各分区与其包含的组件对应关系如下:

分区(Section)包含组件(valueSet)
Commonly used(常用)Table、Button、Text、TextInput、DatetimePickerV2、Form
Buttons(按钮)Button、ButtonGroupV2、PopoverMenu、FileButton
Data(数据)Table、Chart、KeyValuePair
Layouts(布局)Form、ModalV2、Container、Accordion、Tabs、Listview、Kanban、Calendar
Text inputs(文本输入)TextInput、TextArea、EmailInput、PasswordInput、RichTextEditor
Number inputs(数字输入)NumberInput、PhoneInput、CurrencyInput、RangeSliderV2、StarRating
Select inputs(选择输入)TagsInput、DropdownV2、MultiselectV2、ToggleSwitchV2、RadioButtonV2、Checkbox、TreeSelect、Cascader
Date and time inputs(日期与时间输入)DaterangePicker、DatePickerV2、TimePicker、DatetimePickerV2
Navigation(导航)Navigation、Link、Pagination、Steps
Media(媒体)Icon、Image、SvgImage、PDF、Map、AudioRecorder、Camera
Presentation(展示)Text、Tags、CircularProgressBar、ProgressBar、Timeline、Divider、VerticalDivider、Spinner、Statistics、Timer、JSONExplorer
Custom(自定义)CustomComponent、Html、IFrame
Miscellaneous(杂项)FilePicker、CodeEditor、ColorPicker、BoundedBox、QrScanner、Chat、ReorderableList、JSONEditor
Legacy(旧版)Modal、Datepicker、RadioButton、ToggleSwitch、DropDown、Multiselect、RangeSlider、ButtonGroup

源码中数组componentListcomponentTypes.map((component) => component.component)派生并过滤掉IGNORED_ITEMS得到(见 ComponentsManagerTab.jsx),而每个组件的名称与displayName均来自 WidgetManager 的组件类型定义。也就是说:UI 上"分区折叠面板"与"组件元信息"是解耦的,添加新组件只需要向componentTypes注册,并把该组件名放进某个分区的valueSet即可。

2.3 搜索:基于 displayName 的模糊匹配

文档提到"可以输入搜索词快速找到组件",其实现并非简单的字符串 includes,而是引入了fuse.js对组件的displayName做模糊搜索(fuzzy search)。相关逻辑见 ComponentsManagerTab.jsx:

const fuse = new Fuse(searchList, { keys: ['displayName'], shouldSort: true, threshold: 0.4, }); const results = fuse.search(value);

几点实践细节值得注意:

  • 搜索针对displayName(如 "Text Input")而非内部组件名(如TextInput),与用户的直觉输入习惯对齐;
  • 输入使用125ms 防抖debounce,见同文件handleSearchQueryChange),避免高频键入触发无谓搜索;
  • 命中后仍会调整列表中ToggleSwitchLegacyToggleSwitch的展示顺序,保持新旧组件位置的稳定;
  • 无结果时会展示空状态("No results found")并提供"clear query"按钮一键清空搜索词(见 ComponentsManagerTab.jsx);
  • 在非 CE 且具备模块访问权限时,组件库顶部还会出现Components / Modules两个 Tab,可切换到模块管理(ModuleManager),模块可像组件一样被拖入画布复用。

💡 想知道某一具体组件的每个属性、事件与使用样例?官方建议直接查阅Components Catalog / 组件目录,其中包含 Text、Table、Button、Chart、Form 等各组件专文,以及通用概念(如事件处理器、绑定、组件属性)的完整讲解。

三、属性面板(Properties Panel / Config Inspector)

3.1 属性面板是什么

官方文档对属性面板的定义是:

Properties Panel(属性面板)包含选中组件的全部可用设置,你可以在这里设置值(set values)更新组件名(update component names)、以及创建事件处理器(create event handlers)。属性面板将设置组织为不同的分区(sections),例如PropertiesStyles

换句话说,属性面板是"无代码配置选中组件"的中央控制台:数据字段、禁用开关、可见性、事件动作、外观样式等都在此完成。工具链上它由 Inspector 目录实现,不同组件会渲染各自的专用配置界面(Table、Chart、Form、Modal、Tabs、Steps 等均有独立组件,见 Inspector/Components),通用组件则回退到DefaultComponent的默认表单。源码还维护了一份NEW_REVAMPED_COMPONENTS清单(见 Inspector.jsx),用于区分新一代组件与旧版组件在检查器中的呈现方式。

3.2 如何打开:点击组件手柄(Component Handle)

在 ToolJet 中,画布上的每一个组件顶部都悬浮着一个组件手柄(component handle),其形态是⚙️(齿轮图标)+ 组件名称单击该手柄即可在右侧打开当前组件的属性面板。此处涉及两篇文档联动:

  • 手柄本身属于画布交互,官方在 canvas.md 的 "Arrange Components" 小节说明:编辑态下所有组件都是可交互的,若要移动组件需按住组件手柄拖拽;同理,手柄也是打开配置检查器(config inspector)的入口;
  • 组件手柄的核心实现位于 AppCanvas/ConfigHandle/ConfigHandle.jsx,画布选中与右侧面板的联动状态由 rightSideBarSlice.js 管理。

例如官方文档演示:当我们需要"勾选某个复选框后禁用某个按钮"时,只需点击按钮的手柄打开属性面板,在按钮的Disable属性中写入表达式{{components.checkbox1.value}}——该表达式在复选框勾选时求值为true、取消勾选时求值为false,从而实现组件间的动态联动。这正是"属性既可以手工设置,也可以用Bindings(绑定/JS 表达式)动态求值"的体现(机制详见 widgets/overview.md 的 "Bindings" 小节)。

3.3 属性面板的顶栏操作与通用结构

从前端实现 Inspector.jsx 的INSPECTOR_HEADER_OPTIONS常量可以看出,打开属性面板后其顶栏为选中组件提供五个快捷操作:

操作说明
Inspect查看组件当前状态(含运行期可访问属性、值等)
Rename重命名组件,组件名会用于表达式引用(如components.xxx.value
Duplicate复制选中组件到画布
Component permission配置组件级权限(Enterprise 能力,带皇冠标识)
Delete删除组件(红色E54D2E删除图标)

在内容区,属性面板按组件类型自动组织成多个可折叠分区。文档明确提到了Properties(属性)Styles(样式)两类典型分区:

  • Properties 分区:控制组件的"数据与行为",例如 Table 的数据源、按钮的文本、TextInput 的默认值、是否 Disabled / 是否可见(Visibility)等。这些字段支持手填与绑定表达式两种赋值方式;
  • Styles 分区:控制组件的"外观",例如背景色、文字颜色、边框、内边距、圆角等。多数样式字段同样可接入表达式以做到运行时动态样式。

补充提示:需要为整个应用页面级别定制 CSS(例如.app-inspector等作用域类)时,可以查看 customcss.md。而工具栏(toolbar)上还提供编辑器设置、页面切换、全局设置入口等能力,可参考 toolbar.md 与 left-sidebar.md。

3.4 在属性面板中创建事件处理器

除了设置静态属性,属性面板还是**事件处理器(Event Handlers)**的创建入口。ToolJet 允许你为组件的关键事件绑定动作:例如按钮的On click、文本输入的On change、表格的On row selected等。每个事件处理器在触发时执行预定义的Action(动作),如:

  • 运行某个查询(Run Query);
  • 打开/关闭弹窗、控制其他组件;
  • 触发 Alert / 生成下载 / 打开链接等。

在面板中创建事件处理器的典型步骤为:点击组件手柄打开属性面板 → 找到目标事件的onClick / onChange设置区域 → 添加事件处理器 → 选择动作类型并配置参数。关于事件处理器与全部可用动作的权威参考,见组件目录文档的 "Component Event Handlers" 小节(docs/docs/widgets/overview.md)以及 Actions Reference 分类文档(docs/docs/actions/)。

四、右侧边栏与画布/其他面板的协作闭环

从官方系列文档的结构可以还原出右侧边栏在 App-Builder 完整工作流中的位置:

  1. 从右侧组件库拖出组件—— 本文第二节(来源:right-sidebar.md);
  2. 在画布上摆布、嵌套、缩放组件—— 参见 canvas.md:组件可嵌套进 Container/Form 形成分组;可通过cmd/ctrl + d快速克隆;可用方向键精确微调位置;按住组件手柄拖动可改变位置而不触发组件自身的交互行为;
  3. 用右侧属性面板配置选中组件—— 本文第三节:设置值、重命名、配置 Properties/Styles、添加事件处理器;
  4. 用查询面板处理数据—— 数据源与查询逻辑在底部/独立的 query-panel.md 中配置,查询结果可通过{{queries.xxx.data}}绑定回组件属性;
  5. 预览、分享与发布—— 完成布局与逻辑后,使用编辑器右上角的 Preview 预览 查看运行效果,并通过 share.md 进行应用分发。

值得强调的是:右侧边栏的状态(是否展开、激活哪个 Tab、选中哪个组件)都由全局 store 统一管理,因此画布选中组件 → 右侧自动切换到 CONFIGURATION 视图、关闭面板后画布自动归还操作权等交互,都能保持严格同步;读者若需自定义编辑器行为,可从 frontend/src/AppBuilder/_stores/slices/rightSideBarSlice.js 与 rightSidebarToggle.jsx 切入阅读。

五、小结

右侧边栏是 ToolJet App-Builder "所见即所得"构建体验的枢纽:

  • 组件库(COMPONENTS):把 100+ 组件按Commonly used / Buttons / Data / Layouts / Text inputs / Number inputs / Select inputs / Date and time inputs / Navigation / Media / Presentation / Custom / Miscellaneous / Legacy等分区组织(映射源:sectionConfig.js),支持拖放到画布,并可通过 displayName 模糊搜索快速定位(ComponentsManagerTab.jsx);
  • 属性面板(CONFIGURATION):点击画布组件顶部⚙️ + 组件名手柄打开,承载设置值、重命名、事件处理器、Properties/Styles 分区等全部配置能力,底层由 Inspector 按组件类型渲染(ComponentConfigurationTab.jsx)。

掌握了右侧边栏,再配合左侧页面管理、底部查询面板与顶部工具栏,就构成了完整的 ToolJet 应用搭建闭环。若要在某一具体组件(Table、Form、Chart、Kanban……)上继续深挖,直接进入 组件目录(Components Catalog) 按图索骥即可。

【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 🚀项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet

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

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

TVBoxOSC电视盒子播放器完整配置教程:5步装好跑起来

TVBoxOSC电视盒子播放器完整配置教程:5步装好跑起来 【免费下载链接】TVBoxOSC TVBoxOSC - 一个基于第三方项目的代码库,用于电视盒子的控制和管理。 项目地址: https://gitcode.com/GitHub_Trending/tv/TVBoxOSC TVBoxOSC是面向电视盒子与智能电…

作者头像 李华
网站建设 2026/9/9 23:16:44

推客系统化运营:从人工记账到数据驱动的团队管理

做了这么多年推客,我发现一个特别扎心的现象:同样是从零开始的一批人,有人每天忙到半夜,朋友圈刷屏、群里发广告、挨个私聊,月底一看佣金还是那三五千;另一拨人看着也没多拼命,但单子就是不停出…

作者头像 李华
网站建设 2026/9/9 23:12:27

大数据架构选型指南:从批处理到实时计算的关键决策

1. 为什么"先选型、后开发"在大数据架构里是生死问题我见过太多团队把大数据项目做砸,原因几乎都不是写代码的能力不行,而是从一开始就把架构选型这件事当成了"技术调研报告"来应付。开会时大家对着几张对比表格点头,最后…

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

基于Java的大学生创新成果信息管理系统设计与实现

做毕业设计选题目,最怕的就是“大而空”或者“旧而泛”。如果你拿到了“基于Java的大学生创新成果信息管理系统”这个题,或者正在这个方向里选型,我想先给你吃颗定心丸:这是一个非常典型的、能拿高分、也能锻炼完整Java后端能力的…

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

动态过多导致发布视频卡顿?一文教你优化加载性能

动态太多导致发布视频时加载很慢,这个场景我见过很多次。尤其当一个人的主页连续更新了几个月,动态数量超过几千条之后,发布按钮点下去,页面会明显顿住,状态栏一直转圈,选视频素材那一刻更明显。“我的朋友…

作者头像 李华