【问题标题】:useState keeps getting reset to initialValue on re renderuseState 在重新渲染时不断重置为 initialValue
【发布时间】:2020-03-28 16:39:50
【问题描述】:

所以我的屏幕代码看起来像这样。我有一个 useState amount 在重新渲染时不断重置为 initialValue。我有大约 3 个 useEffects。其中之一是在这里的示例代码中,我从 db 获取金额并使用 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>);
}

当我打开这个屏幕时。我得到以下控制台日志

 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 在重新渲染时重置回默认值

【问题讨论】:

    标签: react-native react-native-android react-hooks


    【解决方案1】:

    实际上并没有重置为初始值。您只需继续调用生成初始值的函数。不要调用它,而是将它作为回调(参见lazy initial state)传递给useState() 钩子,它会被调用一次:

    const [amount, setAmount] = useState<BigNumber>(getInitialVal); // getInitialVal instead of getInitialVal()
    

    【讨论】:

    • 我其实是加了这个功能来添加控制台日志的。但即使我使用useState(conversions.numberToBigNumber(0))。行为是一样的。
    • 初始状态下不要直接调用函数——使用useState(() =&gt; conversions.numberToBigNumber(0))
    • 好吧,那我调试错了。这清除了很多东西。谢谢
    猜你喜欢
    • 2020-01-13
    • 2021-03-24
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2022-01-25
    • 2021-11-18
    相关资源
    最近更新 更多