首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React Hook延迟了useEffect触发?

React Hook延迟了useEffect触发?
EN

Stack Overflow用户
提问于 2019-09-04 20:46:33
回答 3查看 14.3K关注 0票数 7

我尝试在我的react钩子中使用useEffect()来在我的道具改变时更新状态。但是有一个延迟,只有在我再次单击钩子中的一个元素后,useEffect才会触发。我是使用钩子的新手,如果有任何帮助,我将不胜感激。谢谢

代码语言:javascript
复制
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>
      )
  }


}
EN

回答 3

Stack Overflow用户

发布于 2020-01-07 12:18:50

代码语言:javascript
复制
    useEffect(() => {

      setTimeout(()=>{
       setCurrent(props.current)
      }, 1000)
  
    }, [props.current])

您只需在显示当前...之前添加超时/延迟...

或最佳方法添加回调函数

代码语言:javascript
复制
useEffect(() => {

 
   setCurrent(() => props.current)
  

}, [props.current])
票数 9
EN

Stack Overflow用户

发布于 2020-07-03 14:18:05

我不太确定你想要的效果是什么,但这里是你的一些小清理代码。也许这会对你有进一步的帮助。

代码语言:javascript
复制
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秒触发一个效果,你必须重新设置每次点击的超时时间,直到它过期。这是对用户交互的任何延迟影响的常见做法:

代码语言:javascript
复制
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效果,我可以肯定地帮助你。

票数 1
EN

Stack Overflow用户

发布于 2019-09-04 21:01:12

代码语言:javascript
复制
  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让它工作,尽管不是很理想。如果有人有更好的解决方案,我会很感兴趣的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57788721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档