跳转到主要内容

QWidget 函数与 TypeScript

Function 让你在组件里写 TypeScript 逻辑。脚本在隔离的 sandbox iframe 中执行,不能访问 DOM、网络、localStorage 或 import;可以读取传入的数据、返回纯对象,也可以通过 Host 读写当前组件的可视属性。

最小示例

调用:

结构

Function

Function.Interface

定义结构体:
字段类型:String / Number / Bool / DateTime / Json / Binary,或另一个 Struct 名称。

Function.Input

声明输入变量的类型:
标签文本是脚本里的变量名,默认 Input。

Function.Output

声明返回值必须包含的键和类型:
结果写入 {Results.<Function>.<Output>}。

Function.Script

TypeScript 代码,建议用 CDATA:
脚本只能返回可 JSON 序列化的值;Date 会被序列化为 ISO 字符串。脚本支持顶层 await,可直接等待 Host 的异步方法。

输入从哪里来

调用函数时按以下优先级构建 Input:
  1. CallFunction 的 Arguments JSON(支持绑定插值)。
  2. 没写 Arguments 时,按函数 Input Struct 的字段名从 Inputs 取值。

脚本可用变量

Host

所有 Host 方法都是异步的,返回 Promise;可以 await,也可以忽略返回值。

可读写属性

Target 指向的可视节点都支持修改其 XML 可视属性,例如:
  • Text:Value、Size、Weight、Color、Clamp、Align
  • Button / Link:Text、Variant、Size、Url
  • TextBox / CheckBox / Slider / Select / ColorPicker / FilePicker:Value、Checked、Options 等
  • List:Items(可直接传数组)、Gap、EmptyText
  • Container / Row / Column / Grid:Gap、Padding、Border、Background、Radius、Align、Justify
  • Image / Media:Src、Alt、Source、Volume、Muted 等
  • 所有可视节点:Visible,以及内容属性别名 Content(Text → Value,Button → Text,List → Items 等)
不能通过 Host.SetProperty 修改 Target、Name、OnClick、OnChange、Function、Arguments、Command、WorkingDirectory、Timeout、PluginId、Method 等结构/动作属性。

Invoke 方法

示例

Host.Invoke("RefreshButton", "Click") 会再次执行按钮动作;在按钮自己的脚本里调用自身会造成递归,请只调用其他按钮或加条件保护。 脚本仍然不能直接执行命令或调用插件 API;这两类能力通过按钮/触发器动作触发,或在确认风险后由动作执行。

触发器

  • Loaded:组件挂载后执行一次。
  • DataChanged:指定数据源完成拉取后执行。
  • Click:点击指定 Name 的按钮/链接时执行。
  • Timer:按 Interval 毫秒执行,最小 1000。
  • Resize:网格或像素尺寸变化后防抖 150ms 执行;首次尺寸请用 Loaded。
  • 触发频率上限 20 次/秒。

编辑器中的试运行

在「函数」页签选择函数,点击 试运行:
  • 使用当前 Inputs 和示例数据执行;
  • 返回 JSON 直接显示在编辑器下方;
  • 语法错误由 sucrase 转译结果标记在编辑器里;
  • 试运行只验证输入/输出;Host.SetProperty / Host.Invoke 对 UI 的修改在主页实际运行时生效,不会改动编辑器预览。

沙箱与安全

  • 脚本在 sandbox iframe 中执行,CSP 禁止网络、图片、媒体、子框架和 worker。
  • 无法访问 window、document、localStorage、fetch、XMLHttpRequest、import / require。
  • 超时后销毁 iframe 并重建;下一次调用不受影响。
  • 返回对象会按 Function.Output 做基础类型校验,缺失或类型不符会报错。
  • 远程组件可以包含脚本并静默更新;只使用你信任的组件。

调试建议

  1. 先用「试运行」确认输入/输出。
  2. 把中间结果放进 Output 或 Host.Log。
  3. 避免在脚本里写无限循环;超时后沙箱会被销毁。
  4. 需要外部数据时提前用 Data 拉取,脚本只处理已加载的数据。