将数据用Signals包裹起来,只要像正常写逻辑一样就具备完备的响应能力,没有任何的中间环节。
这里提供一些集成的思路,并没有固定式,Signals是一个嵌入式工具,可以轻度使用,也可以深度使用,当然集成程度越高,用起来也越爽,但是轻度集成也是完全没有问题的。
简单的集成
function useEditString(edit: EditBox) {
const value = createSignal(edit.string);
function fn() {
value.set(edit.string);
}
edit.node.on("text-changed", fn);
onCleanup(() => {
edit.node.off("text-changed", fn)
})
return value;
}
@cccclass()
export class BaseView extends Component {
lb: Label;
edit: EditBox;
root;
onEnable() {
root = createRoot();
tracked(root, this.run.bind(this));
}
onDisable() {
root.dispose();
}
run() {
const editString = useEditString(this.edit);
createWatch(() => {
this.lb.string = editString()
})
}
}
不仅限于 Component ,任何满足这个结构的都是没问题的。
Manager 中保存响应式变量
class Manager {
props: Map<number, Signal> = new Map();
GetPropValue(key) {
let s = props.get(key);
// 这里一定要创建一个空的对象用于捕捉,Watch不可能捕捉一个不存在的变化
if (!s) {
props.set(resp.key, s = createSignal(defaultValue));
}
return s();
}
SetPropValue(key, value) {
let s = props.get(key);
if (!s) {
props.set(key, s = createSignal(value));
}
else {
s.set(value);
}
}
}
但是有一点注意的是Signals 更推荐带有副作用的Watch只创建一遍,不推荐频繁的创建,如战斗内如果每个实体创建的太频繁,比如塔防,会有GC的问题,就不推荐使用signals了