我再尝试解释最后一遍,你要是再看不懂我也真没辙了,vue 的实例代码在这里:
https://epuxm.csb.app/
setup(props) {
const propP = toRef(props, "p");
const dataD = ref(1);
const computedC = computed(() => Number(propP.value));
watch(propP, (newP, oldP) => {
console.debug("w1", { D: dataD.value, newP, oldP });
dataD.value += Number(newP);
});
watch(computedC, async (newC, oldC) => {
console.debug("w2", { D: dataD.value, newC, oldC });
dataD.value = await remoteCall(dataD.value, newC);
});
return { D: dataD };
},
w2 是 async 操作,如果你想写成 useEffect 的形式的话
setD(async (upToDateD) => {
const newD = await remoteCall(upToDateD, p);
return newD;
});
并不是一个合法的操作。
同理在 react 里面
const Foo = ({ p }) => {
const [d, setD] = useState(...);
const c = useMemo(() => bar(p), [p]);
// e1
useEffect(() => {
const newD = f(d, p);
setD(newD);
}, [p])
// e2
useEffect(async () => {
const newD = await remoteCall(d, p);
setD(newD);
}, [c]);
}
如果想用 vue 来实现 e2 的话,就会变的非常复杂。但 e2 的操作可能会产生 bug,更合理的写法是
const [d, dispatch] = useReducer(reducer, ...)
useEffect(() => {
const newD = ...;
dispatch({ type: 'e1', payload: { newD } })
}, ...);
useEffect(async () => {
const newD = await ...;
dispatch({ type: 'e2', payload: { newD, oldD: d } })
}, ...);
【 在 beep (菜M.喵星耗子) 的大作中提到: 】
: 再贴一下我之前实验的结果:
: watch(aRef, (v) => aRef.value = v+1) // 触发时候aRef的值固定在了v参数中
: useEffect(() => setA(a+1)) // 触发时候a的值通过闭包被固定
: ...................
--
FROM 122.57.163.*