我读到了 Angular 中的信号,有两种方法可以改变当前值:通过
set()
和 update()
。
Angular 已将 Signals 融入到框架中,并开始构建一组利用 Signals 作为基石的新功能。使用 update 允许我们访问信号的当前值,而 set 允许我们设置一个新值而不用关心当前值。
令我困惑的是,我不明白如何需要both(尽管我看到each可以使用)。 很明显我可以。但是为什么?
假设我们像这样定义一个实例。
siggy = signal(4);
然后,我们可以使用以下两种方式设置绝对值。
this.siggy.set(1337);
this.siggy.update((a) => 1337);
但是我们也可以使用这两者来设置相对的(改变当前)。
this.siggy.set(this.siggy() + 1);
this.siggy.update((a) => a + 1);
提供多种方法来达到相同的结果似乎是多余的。这种冗余是糟糕设计的标志(或者可能是用于 DX 目的的语法糖)。我不以任何方式建议 Angular 团队的伟大人们做出了糟糕的设计!我也没有看到平滑度有任何增加。 (事实上,甚至Angular博客也提到了
this.counter.set(this.counter()+1)
的用法...)
我的结论是,有些(边缘)情况我不知道。我错过了什么?
编辑
我继续研究并发现了更多令人困惑的事实。除了
set()
和update()
之外,还有mutate()
(完整指南就这么多,非常感谢)。这个可以如下使用(我凭直觉就这样做了)。
let siggy = signal([1,2,3]);
...
this.siggy.mutate(a => a.push(4));
它可以编译。问题是它不会做任何事情:没有改变,没有更新,什么也不做!显然,我必须这样做。
this.siggy.mutate(a => a = [...a, 4]);
但这对其他人来说是多余的!我可以理解(尽管我不同意)有人可能想使用
set()
来表示替换,同时保留 update()
来表示更改。但即便如此,mutate()
也没有带来额外的信息,因为它是更新(这也设置了它)。
好像只缺少
siggy.alter()
、siggy.change()
和siggy.modify()
。我闻起来有鱼腥味。我确信我没有明白为什么需要设置/更新/变异的真正原因。
技术原因是什么?其中每一个都不能做什么?
据我所知,
this.siggy.set(this.siggy() + 1);
和
this.siggy.update((a) => a + 1);
完全不同。它不会像你想象的那样工作。 由于这些方法是异步的,因此行为会有所不同。
set
方法将用旧值替换该值。
而 update
会改变/更新旧值。
例如:
this.siggy.update((a) => a + 1);
console.log(this.siggy()); // Here the value will not be latest one.
我在使用
useState
钩子时在 React.js 中遇到了同样的场景,这就是为什么有单独的方法 update
和 set
。