logologo
开始
手册
开发
插件
API
首页
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
开始
手册
开发
插件
API
首页
logologo
RunJS 概述
导入模块
容器内渲染

全局变量

window
document
navigator

ctx

ctx.blockModel
ctx.collection
ctx.collectionField
ctx.dataSource
ctx.dataSourceManager
ctx.element
ctx.exit()
ctx.exitAll()
ctx.filterManager
ctx.form
ctx.getModel()
ctx.getValue()
ctx.getVar()
ctx.i18n
ctx.importAsync()
ctx.initResource()
ctx.libs
ctx.location
ctx.logger
ctx.makeResource()
ctx.message
ctx.modal
ctx.model
ctx.notification
ctx.off()
ctx.on()
ctx.openView()
ctx.render()
ctx.request()
ctx.requireAsync()
ctx.resource
ctx.route
ctx.router
ctx.setValue()
ctx.sql
ctx.t()
ctx.view
Previous Pagectx.dataSourceManager
Next Pagectx.exit()

#ctx.element

指向沙箱 DOM 容器的 ElementProxy 实例。

#类型定义

element: ElementProxy

#说明

ctx.element 是指向沙箱 DOM 容器的 ElementProxy。出于安全考虑,不要直接使用 ctx.element 的 API(如 innerHTML、appendChild、querySelector 等)。

NocoBase 的 JS 区块会指定一个 element,该 element 是 Element 对象的代理 ElementProxy,对外只暴露安全可用的属性和方法。

#安全要求

禁止直接使用 ctx.element 的 API。 所有 DOM 操作应通过 ctx.render() 完成。

#❌ 错误用法

// ❌ 不允许:直接使用 ctx.element 的 API
ctx.element.innerHTML = '<div>内容</div>';
ctx.element.appendChild(node);
ctx.element.querySelector('.class');

#✅ 正确用法:使用 ctx.render()

所有渲染应使用 ctx.render():

// ✅ 正确:用 ctx.render() 渲染 React 组件
const { Button, Card } = ctx.libs.antd;

ctx.render(
  <Card title={ctx.t('欢迎')}>
    <Button type="primary">点击</Button>
  </Card>
);
// ✅ 正确:用 ctx.render() 渲染 HTML 字符串
ctx.render('<div style="padding:16px;">' + ctx.t('内容') + '</div>');
// ✅ 正确:用 ctx.render() 渲染 DOM 节点
const div = document.createElement('div');
div.textContent = ctx.t('你好');
ctx.render(div);

#为何必须使用 ctx.render()

使用 ctx.render() 的好处:

  • 安全:集中安全控制,避免直接操作 DOM 带来的风险
  • React 支持:完整支持 React 与 JSX
  • 上下文继承:自动继承应用上下文
  • 生命周期:更好的组件生命周期管理
  • 冲突处理:自动管理 React 根的创建/卸载,避免冲突

#注意

  • ctx.element 仅作为 ctx.render() 的内部容器使用
  • 不要直接访问或修改 ctx.element 的任何属性或方法
  • 所有渲染必须通过 ctx.render() 进行