【 在 eGust (十年) 的大作中提到: 】
: // w1
: watch(P, () => {
: D = f1(P, D); // D: d1 -> d2
: })
:
: // w2
: watch(C, () => {
: D = await f2(D, ...);
: })
:
: 在 w1 里面,D 的值发生了变化 d1 -> d2,而在 w2 触发时,由于 D 的值已经变化了,想取得原始值 d1 是非常困难的。而取得 d1 的值是完全合理的选择,因为在 C 的状态发生变化的时候,D 的值还是 d1。
还是没特别明白。。你这个例子里面computed很关键吗?await很关键吗?我不觉得这个例子里面“取得的d1的值是完全合理的选择”,因为就这个例子的逻辑而言,如果取得的是d1,那相当于w2把w1的效果给覆盖掉了,一般来说会是一个bug,和你下面react那里说的那个bug是一个道理呀。如果是需求奇葩,非要在w2里拿到d1值,也可以,可以大概构造成这样:
let prevD
watch([C,D], ([c2,d2], [c1,d1]) => { // 同时 watch c 和 d
if (d1!=d2 || prevD == null) prevD = d1 // d 变化时,把d的旧值存到 preD
if (c1!=c2) D = await f2(prevD, ...) // c 变化时,用 prevD 更新c
})
:
: 换成等价的 react 操作
: // e1
: useEffect(() => {
: setD(f1(D, P)) // D: d1 -> d2
: }, [P])
:
: // e2
: useEffect(async () => {
: setD(await f2(D, P))
: }, [P, ...]) // 相当于 C = computed(P, ...)
:
: 在 e2 发生的时候,D 的值仍然是 d1,进行 setD(async (d2) => f2(d2, P)) 这种操作是非法的。而对于
: d3 = await f2(D, P) // D === d1
: setD((d2) => d3)
: 这种操作,是在用基于 D === d1 的状态求出来的结果 d3,去更新 D === d2 的状态,很可能并不是想要的结果,而是引入了一个 bug。那么解决的办法就是 reducer
: D = reduce({ D: d2 }: State, { P, D: d3, oldD: d1 }: Action)
:
这一段没看懂,业务逻辑上到底是要达到怎样的目的~到底是希望用d1去算d3,还是d2去算d3?
: 【 在 beep (菜M.喵星耗子) 的大作中提到: 】
: : 明白你的意思了,你是说,前面例子中,如果用户需要从当前的外部counter取值,也应该能做到?vue也可以啊,watch(someRef, (v, oldV) => ... ) 这里就可以取到someRef的当前值。(顺便还附赠可以一起取到旧值。react hooks下useEffect里是取不到旧值的,官方也没有相关a
: : watch(aRef, (v) => aRef.value = v+1)
: : useEffect(() => setA(a+1))
: : ...................
:
: --
:
: ※ 修改:·eGust 于 Jul 1 10:01:42 2021 修改本文·[FROM: 101.98.83.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 101.98.83.*]
--
修改:eGust FROM 101.98.83.*
FROM 123.120.180.*