【发布时间】:2021-01-28 18:31:00
【问题描述】:
我有这样的带有 onClick 功能的按钮:
<button className="btn" onClick={(e) => handleClick(user._id, e)} >Edit</button>
const [show, setShow] = useState(false)
const handleClick = (id, e) => {
e.preventDefault()
setShow(!show)
dispatch(getUser(id))}
/* And here rendering based on State */
{
show ? renderUserData() : null
}
所以,问题在于 handleClick 函数中的 setShow(!show) 不起作用,并且 show 的状态仍然是假的,不可变的。如果 handleClick 函数仅包含 setShow(!show),则此函数工作并切换 renderUserData(),但当它同时包含 dispatch(getUser(id)) 和 setShow(!show) 时,显示状态始终为 false,请帮助
【问题讨论】:
-
如果在
const [show, setShow] = useState(false)下方添加console.log("mounting"),点击按钮后会再次打印吗? -
是的,它正在打印@NadiaChibrikova
-
这意味着您的
dispatch以某种方式触发了一个卸载组件并安装全新组件的过程。并不是说状态是不可变的,它只是不同组件的完全不同的状态。您需要查看组件的父级以找出它这样做的原因。 (另外preventDefault确实可以删除,但对您的问题没有任何影响) -
对象 { 类型:“GET_USER_REQUEST”} 安装,对象 { 类型:“GET_USER_SUCCESS”,有效负载:{…} } 安装。控制台显示挂载 2 次,我同意你的观点,即调度以某种方式触发了一个卸载组件的进程。我非常感谢您的帮助需要尽快解决。 @NadiaChibrikova
-
哦,实际上日志必须在
useEffect内(对此感到抱歉)。如果你添加useEffect就像在这个例子中jsfiddle.net/931wtLm0 并且你的组件确实被卸载了,你可以在那里添加一个断点并希望看到是什么触发它
标签: reactjs react-redux