React Hooks 函数内部的陈旧状态
React Hooks stale state inside function
我有这样的东西
const [state, setState] = useState({
num: 0
});
const validateBiggerThan0 = () => {
return state.num > 0;
};
const [validation, setValidation] = useState({
val: validateBiggerThan0
});
问题是当我调用validation.validateBiggerThan0
时,这个函数没有当前的state
。
在这个简单的示例中,我可以将值 sate.num
作为参数传递给 validateBiggerThan0
,但在我的实际应用程序中这是不可行的,因为我有多个验证,有些可以使用来自状态。除了这个还有其他选择吗?
有问题的沙箱:
https://codesandbox.io/s/heuristic-mountain-2poz7?fontsize=14&hidenavigation=1&theme=dark
您的问题的解决方案是不对函数对象使用 useState
。
const validation = {
val: validateBiggerThan0
};
或者在每次状态更改时更新对象:
useEffect(() => {
setValidation({
val: validateBiggerThan0
});
}, [ state, setValidation, validateBiggerThan0 ]);
// Don't remove "state" from the dependency array.
不要忘记将验证函数包装在 useCallback
挂钩中,以防您使用 useEffect
方法。
const validateBiggerThan0 = useCallback(() => {
return state.num > 0;
}, [state]);
我有这样的东西
const [state, setState] = useState({
num: 0
});
const validateBiggerThan0 = () => {
return state.num > 0;
};
const [validation, setValidation] = useState({
val: validateBiggerThan0
});
问题是当我调用validation.validateBiggerThan0
时,这个函数没有当前的state
。
在这个简单的示例中,我可以将值 sate.num
作为参数传递给 validateBiggerThan0
,但在我的实际应用程序中这是不可行的,因为我有多个验证,有些可以使用来自状态。除了这个还有其他选择吗?
有问题的沙箱: https://codesandbox.io/s/heuristic-mountain-2poz7?fontsize=14&hidenavigation=1&theme=dark
您的问题的解决方案是不对函数对象使用 useState
。
const validation = {
val: validateBiggerThan0
};
或者在每次状态更改时更新对象:
useEffect(() => {
setValidation({
val: validateBiggerThan0
});
}, [ state, setValidation, validateBiggerThan0 ]);
// Don't remove "state" from the dependency array.
不要忘记将验证函数包装在 useCallback
挂钩中,以防您使用 useEffect
方法。
const validateBiggerThan0 = useCallback(() => {
return state.num > 0;
}, [state]);