Skip to main content
页面代码决定模板的固定结构、排版和样式,也把当前帧的数据变成玩家看到的文字、图片和按钮。模板中间区域可以在“预览”和“代码”之间切换。 “剧情页”的 TSX 页面代码编辑区
101 提供可以整段复制的页面代码。只有需要自定义布局或交互时,才需要自己修改代码。

页面代码处在作品的哪一层

页面代码只负责“根据当前数据渲染什么”。修改变量、切换帧、跳转界面和触发 AI 回复仍由触发器规则负责。

运行时提供的三个对象

页面组件默认导出一个函数。运行时会把三个只读对象交给它: 它们不是字符串模板,也不需要额外请求。页面代码直接读取对象属性。

普通数据:直接读取变量

文字、数字、布尔值、对象和数组都使用普通的 JavaScript 属性访问:
在 JSX 中同样直接使用:
不要把普通变量写成字符串:
变量可能尚未写入,因此要提供默认值,并在遍历前确认它确实是数组。

动态素材:使用 media_url

Frame 或 State 媒体变量保存的是素材 ID,不是浏览器可以直接加载的 URL。编辑器界面把这种可读 ID 显示为“素材名称”。完成素材绑定后,使用 media_url() 取得地址:
media_url 是页面代码编译器识别的特殊函数,不需要导入。保存或预览时,编译器会把它改写成对应 Frame / State 媒体绑定的 URL 解析调用。它有三个限制:
  1. 只传一个直接来自 frame 或 state 的字段;
  2. 该字段要先在“变量配置”中联动素材库;
  3. 传入的是变量本身,不是素材名字符串或拼接后的表达式。
如果素材固定不随 Frame 或 State 改变,可以使用已经确认存在的素材 ID:
固定素材和动态素材不要混用。动态背景、立绘、头像和音频通常应经过变量与素材绑定。

数组数据:把一帧中的多项内容渲染出来

触发器规则可以用 append 把多条“选项”指令加入 frame.choices。页面代码需要遍历这个数组:
显示文案可以变化,交互值应保持稳定。规则可以匹配 .story-choice[data-value=letter],不要匹配按钮上会变化的中文句子。

玩家操作:页面提供元素,规则执行作品行为

需要切换帧、更新 State、跳转页面或触发 AI 时,页面代码只提供原生元素和稳定选择器:
触发器规则再配置:
不要在 React 的 onClick 中直接修改 frame / state,也不要自行实现跳转、切换帧或 AI 请求。页面内临时展开一个说明面板、切换标签等不改变作品事实的纯界面操作,才适合使用组件自己的 useState。 输入框同样使用原生元素。规则可以用 #message-input::value 采集值:

playback:只读取,不自行修改

playback.cursor 是从 0 开始的当前帧下标,playback.frameCount 是本批内容的总帧数。它们适合显示进度或决定是否显示按钮:
页面代码不能修改 cursor。前进或后退仍由“切换帧”动作完成。cursor === 0 只表示当前在第一帧,不代表组件刚刚打开或 AI 刚返回新内容。

页面尺寸与样式边界

编辑器和玩家侧会把页面放入一个可变化的渲染窗口。平台已经管理 html、body 和 #root;页面代码只需要设置自己的最外层容器:
继续遵守以下约束:
  • 长内容放进页面自己的滚动区域;
  • 图片设置尺寸边界和 object-fit;
  • 使用 flex、grid、百分比、媒体查询或容器查询适配窄而矮的窗口;
  • 不给页面根容器设置会反向撑大窗口的固定 min-width / min-height;
  • 不用 100vh 猜测 iframe 高度,也不改写 html、body 和 #root。
需要按模板窗口而不是浏览器窗口设置断点时,可以使用平台提供的容器名:

编译、保存与运行预览

从“代码”切回“预览”时,编辑器会编译当前草稿并刷新作品实时预览。编译失败后:
  • 编辑器回到代码页;
  • 底部显示可滚动的错误详情;
  • 当前代码仍会保留;
  • 继续编辑会清除旧错误提示。
作品实时预览只检查当前模板。跨页面跳转和真实 AI 生成需要保存作品后,在运行预览中检查。 点击顶部“保存作品”或关闭模板标签时选择“保存并关闭”,编辑器会编译页面代码、保存模板和规则组,并生成模板预览图。任一步失败时,先保留当前标签并查看提示。

页面没有按预期显示时

按数据流从前往后检查:
  1. 在调试面板确认目标 frame.x 或 state.x 已有正确值;
  2. 如果是媒体,确认该变量已经联动素材库;
  3. 确认普通数据直接读取,媒体才调用 media_url();
  4. 确认按钮的类名或 data-* 与 Element Selector 一致;
  5. 确认根容器没有固定尺寸或错误滚动导致内容被裁掉。
MoMo:图片不显示时,先看变量里的素材 ID,再看素材绑定,最后看 media_url()。按这个顺序排查。