为什么 Angular 的信号中需要两个函数:update() 和 set()?

问题描述 投票:0回答:1

我读到了 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()
。我闻起来有鱼腥味。我确信我没有明白为什么需要设置/更新/变异的真正原因。

技术原因是什么?其中每一个都不能做什么?

angular signals
1个回答
0
投票

据我所知,

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

© www.soinside.com 2019 - 2024. All rights reserved.