useState 在重新渲染时不断重置为 initialValue
useState keeps getting reset to initialValue on re render
所以我的屏幕代码看起来像这样。我有一个 useState amount
在重新渲染时不断重置为 initialValue。我有大约 3 个 useEffects。其中之一在此处的示例代码中,我从数据库中获取数量并使用 setAmount 进行设置。
const ConfirmPaymentDialog = props => {
const getInitialVal = () => {
console.log('Initial Amount: 0');
return conversions.numberToBigNumber(0);
};
const [amount, setAmount] = useState<BigNumber>(getInitialVal());
useEffect(() => {
getAmountToPay();
},[]);
const getAmountToPay = async () => {
const amount = await myDbModule.getAmount(customer.id);
console.log('DB Amount: ' + amount?.toString());
setAmount(amount || conversions.numberToBigNumber(0));
};
useEffect(() => {
...
}, [isInputTextFocused])
console.log('Rendering');
return (<View>...</View>);
}
当我打开这个 screen.I 得到以下控制台日志
LOG Initial Amount: 0
LOG Rendering
LOG DB Amount: 500
LOG Initial Amount: 0
LOG Rendering
LOG Initial Amount: 0
LOG Rendering
LOG Initial Amount: 0
LOG Rendering
LOG Initial Amount: 0
LOG Rendering
LOG Initial Amount: 0
LOG Rendering
如何阻止我的 useState 在重新渲染时重置回默认值
实际上并没有重置为初始值。您只需继续调用生成初始值的函数即可。不要调用它,而是将它作为回调(参见 lazy initial state)传递给 useState()
挂钩,它将被调用一次:
const [amount, setAmount] = useState<BigNumber>(getInitialVal); // getInitialVal instead of getInitialVal()
所以我的屏幕代码看起来像这样。我有一个 useState amount
在重新渲染时不断重置为 initialValue。我有大约 3 个 useEffects。其中之一在此处的示例代码中,我从数据库中获取数量并使用 setAmount 进行设置。
const ConfirmPaymentDialog = props => {
const getInitialVal = () => {
console.log('Initial Amount: 0');
return conversions.numberToBigNumber(0);
};
const [amount, setAmount] = useState<BigNumber>(getInitialVal());
useEffect(() => {
getAmountToPay();
},[]);
const getAmountToPay = async () => {
const amount = await myDbModule.getAmount(customer.id);
console.log('DB Amount: ' + amount?.toString());
setAmount(amount || conversions.numberToBigNumber(0));
};
useEffect(() => {
...
}, [isInputTextFocused])
console.log('Rendering');
return (<View>...</View>);
}
当我打开这个 screen.I 得到以下控制台日志
LOG Initial Amount: 0
LOG Rendering
LOG DB Amount: 500
LOG Initial Amount: 0
LOG Rendering
LOG Initial Amount: 0
LOG Rendering
LOG Initial Amount: 0
LOG Rendering
LOG Initial Amount: 0
LOG Rendering
LOG Initial Amount: 0
LOG Rendering
如何阻止我的 useState 在重新渲染时重置回默认值
实际上并没有重置为初始值。您只需继续调用生成初始值的函数即可。不要调用它,而是将它作为回调(参见 lazy initial state)传递给 useState()
挂钩,它将被调用一次:
const [amount, setAmount] = useState<BigNumber>(getInitialVal); // getInitialVal instead of getInitialVal()