我尝试在我的react钩子中使用useEffect()来在我的道具改变时更新状态。但是有一个延迟,只有在我再次单击钩子中的一个元素后,useEffect才会触发。我是使用钩子的新手,如果有任何帮助,我将不胜感激。谢谢
function ImageOrderSelect (props) {
const [clicked, setClicked] = useState(false)
const [options, setOptions] = useState(props.options)
const [current, setCurrent] = useState(props.current)
useEffect(() => {
setCurrent(props.current)
}, [props.current])
if(!clicked){
return (
<div className="image-order-select-icon" onClick={() => setClicked(!clicked)}>
<FontAwesomeIcon size="lg" icon={faCircle} />
<p>{current}</p>
</div>
)
} else if(clicked){
return (
<div className="image-order-select">
{optionsList}
</div>
)
}
}发布于 2020-01-07 12:18:50
useEffect(() => {
setTimeout(()=>{
setCurrent(props.current)
}, 1000)
}, [props.current])您只需在显示当前...之前添加超时/延迟...
或最佳方法添加回调函数
useEffect(() => {
setCurrent(() => props.current)
}, [props.current])发布于 2020-07-03 14:18:05
我不太确定你想要的效果是什么,但这里是你的一些小清理代码。也许这会对你有进一步的帮助。
function ImageOrderSelect ({ current, options ) { // deconstruct here to save code
const [clicked, setClicked] = useState(false);
// you dont have to keep additional state since props is a state.
useEffect(() => {
setTimeout(() => {
// do something here 1 sec after current has changed
}, 1000);
}, [current]);
useEffect(() => {
setTimeout(() => {
// do something 1 sec after clicked has changed
}, 1000);
}, [clicked]);
if(!clicked){
return (
<div className="image-order-select-icon" onClick={() => setClicked(!clicked)}>
<FontAwesomeIcon size="lg" icon={faCircle} />
<p>{current}</p>
</div>
)
} else if(clicked){
return (
<div className="image-order-select">
{optionsList}
</div>
)
}
}如果你想在最后一次点击你的图片后1秒触发一个效果,你必须重新设置每次点击的超时时间,直到它过期。这是对用户交互的任何延迟影响的常见做法:
let timeout;
useEffect(() => {
clearTimeout(timeout);
timeout = setTimeout(() => {
// do something 1 sec after a click is done
// but dont do anything if another click happened before 1sec of the previous
// click has expired
}, 1000);
}, [clicked]);如果你能给出一个更详细的代码示例,更深入地解释你想要的UI效果,我可以肯定地帮助你。
发布于 2019-09-04 21:01:12
let optionsList = options.map((option, index) => {
return (
<div key={index} onClick={() => {
props.handleImageSort(option, props.index)
setTimeout(() => {
setClicked(!clicked)
}, .500)
}}>
<p>{option}</p>
</div>
)})
问题是,我试图同时调用setClicked,但由于某种原因,它无法调用。setTimeout让它工作,尽管不是很理想。如果有人有更好的解决方案,我会很感兴趣的。
https://stackoverflow.com/questions/57788721
复制相似问题