[英]How to ensure state is not stale in React hook
我在下面创建的按钮似乎滞后于selectedButtonIdx
值。
调用getClass
, toggleSelected
是否未完成?
function ButtonGroup(props) {
const [selectedButtonIdx,setIdx]=useState(props.loadCurrentAsIndex);
const toggleSelected = (e) => {
setIdx(parseInt(e.target.dataset.index));
props.onclick(e);
};
const getClass = (index) => {
return (selectedButtonIdx === index) ? classnames('current', props.btnClass)
: classnames(props.btnClass)
};
let buttons = props.buttons.map((b, idx) => <Button key={idx} value={b.value} index={idx} text={b.text}
onclick={e => toggleSelected(e)}
btnClass={getClass(idx)}/>);
return (
<div>
{buttons}
</div>
);
}
每次点击都希望通过更改其类来向用户显示组中的哪个按钮被点击。
通过看这个,
<Button
key={idx}
value={b.value}
index={idx}
text={b.text}
onclick={e => toggleSelected(e)}
btnClass={getClass(idx)}
/>
Button
是您的自定义组件,
这里要注意两点,
onclick
( c
很小)道具,在您的实际组件中它应该是onClick={props.onclick}
e.target.dataset.index
,要处理dataset
我们应该具有带有data-
前缀的属性。 所以你的index
应该是你实际组件中的data-index
。 所以最后你的Button
组件应该是,
const Button = (props) => {
return <button text={props.text} data-index={props.index} onClick={props.onclick} className={props.btnClass}>{props.value}</button>
}
从 useState 返回的函数 setIdx 是异步的,这意味着它可能在您运行下一个函数时尚未完成(如您所料)。
看看useEffect它允许你指定一个函数,一旦你状态中的一个项目发生变化,这个方法将确保你的函数以正确的顺序被调用。
到现在为止,我没有发现这里有任何问题。
这个怎么运作:
onClick
事件侦听器已绑定setIdx
触发新渲染selectedButtonIdx
用于渲染(以及getClass
调用) 看,没有理由担心setIdx
是同步函数还是异步函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.