事件处理
本节将介绍在 Refina 中如何处理事件。
ts
运行结果
接下来是上面代码的解释。
定义状态
在上面的例子中,我们定义了一个名为 count 状态来存储计数值。
作为一个类 ImGUI 的框架,Refina 不需要一个”响应式系统“来监听状态的变化。
因此你可以直接以最普通的方式定义状态,即使用 let 语句。 即,不需要通过 ref 或 reactive 或 useState 来创建状态。
WARNING
不能在主函数内部定义状态。
否则,每当主函数被调用,这些状态就会被重置。
事件处理
因为大部分组件或元素没有或仅有一个常用的事件,Refina 以返回值的形式体现事件是否被触发。
比如,_.button 的返回值是一给布尔值。当按钮被按下时,_.button 会返回一次 true,其余时刻,它将返回 false。 因此你可以使用 if 语句或 && 运算符来处理该事件。 因此你可以使用 if 语句或 && 运算符来处理该事件。
TIP
只有事件型组件,如 button 和 input 会返回表示事件是否发生的布尔值。
其他类型的组件可能返回具有其他含义的值。
INFO
正如你看见的那样,Refina 的事件处理的写法与 Dear ImGui 是否相似。
获取事件数据
事件所携带的数据被存放在上下文对象种。你可以通过 _.$ev 属性读取它。
TIP
Refina 为 _.$ev 标注了类型,所以当鼠标悬停在 _.$ev 上时,你可以看见事件数据的类型。
在事件处理部分外(即在判断事件是否发生的 if 语句或 && 运算符外),_.$ev 的类型是 never。
WARNING
不能在负责处理事件的代码中渲染组件。
这是因为,事件处理部分在 RECV状态下被执行,但是渲染的过程在UPDATE` 状态下被执行。