事件处理
本节将介绍在 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` 状态下被执行。