logologo
开始
手册
开发
插件
API
English
简体中文
开始
手册
开发
插件
API
English
简体中文
logologo
概述

区块

概述

数据区块

表格
表单
详情
列表
网格卡片
图表

筛选区块

表单

其他区块

操作面板
Iframe
引用区块
Markdown
JS Block

区块设置项

数据范围
布局
区块联动规则
字段联动规则
排序规则
区块删除
区块标题

字段

概述

通用配置项

表格字段
详情字段
筛选表单字段
表单字段

特有配置项

日期
文件管理器
子表单
下拉选择器
数据选择器
子表格
子详情
标题
JS Field
JS Item
JS Column

字段配置项

默认值
字段标签
显示标签
字段提示信息
数据范围
字段组件
数值格式化
模式
必填
标题字段
验证规则
关系字段组件

操作

概述

操作配置项

编辑按钮
二次确认
字段赋值
绑定工作流
编辑弹窗
操作联动规则

操作类型

新增
查看
删除
编辑
导入
导入Pro
导出
导出pro
导出附件
筛选
链接
打开弹窗
刷新
提交数据
触发工作流
更新记录
批量更新
JS Action
操作权限

进阶

联动规则
事件流
变量
RunJS
Previous PageMarkdown
Next Page数据范围

#JS Block 区块

#介绍

JS Block 是一个高度灵活的“自定义渲染区块”,支持直接编写 JavaScript 脚本来生成界面、绑定事件、调用数据接口或集成第三方库。适用于内置区块难以覆盖的个性化可视化、临时试验与轻量扩展场景。

#运行时上下文 API

JS Block 的运行时上下文已注入常用能力,可直接使用:

  • ctx.element:区块的 DOM 容器(已做安全封装,ElementProxy),支持 innerHTML、querySelector、addEventListener 等;
  • ctx.requireAsync(url):按 URL 异步加载 AMD/UMD 库;
  • ctx.importAsync(url):按 URL 动态导入 ESM 模块;
  • ctx.openView:打开已配置视图(弹窗/抽屉/页面);
  • ctx.useResource(...) + ctx.resource:以资源方式访问数据;
  • ctx.i18n.t() / ctx.t():内置国际化能力;
  • ctx.onRefReady(ctx.ref, cb):容器就绪后再渲染,避免时序问题;
  • ctx.React / ctx.ReactDOM / ctx.antd:支持 JSX,直接在编辑器里书写 JSX 即可由 ctx.ReactDOM 渲染。
  • ctx.render(vnode):将 React 元素、HTML 字符串或 DOM 节点渲染到默认容器 ctx.element;多次调用会复用同一 React Root,并覆盖容器现有内容。

#添加区块

  • 可在页面或弹窗中添加 JS Block。 jsblock-add-20251029

#编辑器与片段

JS Block 的脚本编辑器支持语法高亮、错误提示与内置代码片段(Snippets),可快速插入常见示例,如:渲染图表、绑定按钮事件、加载外部库、渲染 React/Vue 组件、时间轴、信息卡片等。

  • Snippets:打开内置代码片段列表,可搜索并一键将选中片段插入到代码编辑区的当前光标位置。
  • Run:直接运行当前编辑器中的代码,并将运行日志输出到底部 Logs 面板。支持显示 console.log/info/warn/error,错误会高亮并可定位到具体行列。

jsblock-toolbars-20251029

并且,编辑器右上角可直接唤起 AI 员工“前端工程师 · Nathan”,让他基于当前上下文帮你编写或修改脚本,一键“Apply to editor”应用到编辑器后再运行查看效果。详见:

  • AI 员工 · Nathan:前端工程师

#运行环境与安全

  • 容器:系统为脚本提供安全的 DOM 容器 ctx.element(ElementProxy),仅影响当前区块,不干扰页面其它区域。
  • 沙箱:脚本在受控环境中运行,window/document/navigator 采用安全代理对象,常见 API 可用、风险行为受限。
  • 重渲染:区块被隐藏后再显示会自动重渲染(避免初次挂载重复执行)。

#常见用法(精简示例)

#1) 渲染 React(JSX)

const { Button } = ctx.antd;
ctx.render(
  <div style={{ padding: 12 }}>
    <Button type="primary" onClick={() => ctx.message.success(ctx.t('Clicked!'))}>
      {ctx.t('Click')}
    </Button>
  </div>
);

#2) API 请求模板

const resp = await ctx.api.request({ url: 'users:list', method: 'get', params: { pageSize: 10 } });
ctx.message.success(ctx.t('Request finished'));
console.log(ctx.t('Response data:'), resp?.data);

#3) 加载 ECharts 并渲染

const container = document.createElement('div');
container.style.height = '360px';
container.style.width = '100%';
ctx.element.replaceChildren(container);
const echarts = await ctx.requireAsync('https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js');
if (!echarts) throw new Error('ECharts not loaded');
const chart = echarts.init(container);
chart.setOption({ title: { text: ctx.t('ECharts') }, xAxis: {}, yAxis: {}, series: [{ type: 'bar', data: [5, 12, 9] }] });
chart.resize();

#4) 打开视图(抽屉)

const popupUid = ctx.model.uid + '-1';
await ctx.openView(popupUid, { mode: 'drawer', title: ctx.t('Sample drawer'), size: 'large' });

#5) 资源读取并渲染 JSON

const resource = ctx.createResource('SingleRecordResource');
resource.setDataSourceKey('main');
resource.setResourceName('users');
await resource.refresh();
ctx.render(`<pre style="padding:12px;background:#f5f5f5;border-radius:6px;">${JSON.stringify(resource.getData(), null, 2)}</pre>`);

#注意事项

  • 外部库加载建议使用可信 CDN。
  • 选择器使用建议:优先使用 class 或 [name=...] 属性选择器;避免使用固定 id,以免在多个区块/弹窗中出现重复 id 导致样式或事件冲突。
  • 事件清理:区块可能多次重渲染,绑定事件前应清理或去重,避免重复触发。可采用“先 remove 再 add”的方式,或一次性监听器,或加标记防重复。

#相关文档

  • 变量与上下文
  • 联动规则
  • 视图与弹窗