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:Date 会被序列化为 ISO 字符串。脚本支持顶层 await,可直接等待 Host 的异步方法。
输入从哪里来
调用函数时按以下优先级构建Input:
CallFunction的ArgumentsJSON(支持绑定插值)。- 没写
Arguments时,按函数InputStruct 的字段名从Inputs取值。
脚本可用变量
Host
所有Host 方法都是异步的,返回 Promise;可以 await,也可以忽略返回值。
可读写属性
Target 指向的可视节点都支持修改其 XML 可视属性,例如:
Text:Value、Size、Weight、Color、Clamp、AlignButton/Link:Text、Variant、Size、UrlTextBox/CheckBox/Slider/Select/ColorPicker/FilePicker:Value、Checked、Options等List:Items(可直接传数组)、Gap、EmptyTextContainer/Row/Column/Grid:Gap、Padding、Border、Background、Radius、Align、JustifyImage/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 的修改在主页实际运行时生效,不会改动编辑器预览。
沙箱与安全
- 脚本在
sandboxiframe 中执行,CSP 禁止网络、图片、媒体、子框架和 worker。 - 无法访问
window、document、localStorage、fetch、XMLHttpRequest、import/require。 - 超时后销毁 iframe 并重建;下一次调用不受影响。
- 返回对象会按
Function.Output做基础类型校验,缺失或类型不符会报错。 - 远程组件可以包含脚本并静默更新;只使用你信任的组件。
调试建议
- 先用「试运行」确认输入/输出。
- 把中间结果放进
Output或Host.Log。 - 避免在脚本里写无限循环;超时后沙箱会被销毁。
- 需要外部数据时提前用
Data拉取,脚本只处理已加载的数据。