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()