[英]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.