简体   繁体   English

React hooks:设置状态“ModalVisible”但状态不会立即更新

[英]React hooks: Set state 'ModalVisible' but state does not update immediately

I use setModalConfirmVisible(true) but the state modalConfirmVisible does not update immediately.我使用 setModalConfirmVisible(true) 但状态 modalConfirmVisible 不会立即更新。 So, Modal does not display.所以,Modal 不显示。

How can I update this state immediately?如何立即更新此状态?

看到发生了 When I click Remove button.当我单击“删除”按钮时。 The console will show only false from控制台将只显示 false

console.log(modalConfirmVisible) console.log(modalConfirmVisible)

  useEffect(() => {
    (async () => {
      try {
        setFetchLoading(true)
        setTransactions(await fetchTransactions())
        setFetchLoading(false)
      } catch (err) {
        console.error(err)
      }
    })()
  }, [modalConfirmVisible])

  async function handleRemoveTransaction(id) {
    setRemoveLoading(true)
    setModalConfirmVisible(true)
    console.log(modalConfirmVisible)
    await handleConfirmRemoveTransaction(true, id)
  }


  return (
    {modalConfirmVisible && (
      <ModalConfirm
        onConfirmRemove={handleConfirmRemoveTransaction}
        onCancel={() => setModalConfirmVisible(false)}
        visible={true} 
      />
    )}
  )


// ModalConfirm.js
const ModalConfirm = ({ onConfirmRemove, visible }) => {
  return (
    <Modal
      visible={visible}
      title="Do you want to delete these items?"
      icon={<ExclamationCircleOutlined />}
      content="When clicked the OK button, this dialog will be closed after 1 second"
      onOk={() => onConfirmRemove(true)}
      onCancel={() => onConfirmRemove(false)}
    />
  )
}

You should try to split out the logic of opening your modal from handling the confirmation.您应该尝试将打开模态的逻辑与处理确认分开。 This allows the state update to set modalConfirmVisible and then on the next render cycle the confirmModal can open.这允许状态更新设置modalConfirmVisible然后在下一个渲染周期中confirmModal可以打开。

// from component in screen cap click remove, just open the modal
function openRemoveConfirmation() {
  setRemoveLoading(true)
  setModalConfirmVisible(true)
}

// handle confirmation separately
function handleRemoveTransaction(id) {
  handleConfirmRemoveTransaction(true, id)
}

return (
  {modalConfirmVisible && (
    <ModalConfirm
      onConfirmRemove={handleConfirmRemoveTransaction}
      onCancel={() => setModalConfirmVisible(false)}
      visible={true} 
    />
  )}
)

Because you are using react-hooks, so you change any state immediately.因为您使用的是 react-hooks,所以您可以立即更改任何state

The right way is to check the value of modalConfirmVisible in the next cycle .正确的方法是在下一个cycle检查 modalConfirmVisible 的值。 And because you setState and the state is changed, the function will execute again:并且因为你setState并且状态改变了,函数会再次执行:

const [modalConfirmVisible, setModalConfirmVisible] = useState(false);

async function handleRemoveTransaction(id) {
  setRemoveLoading(true)
  setModalConfirmVisible(true)
  await handleConfirmRemoveTransaction(true, id)
}
console.log(modalConfirmVisible)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM