动画值超过 0.8 后如何触发函数并将当前状态传递给该函数(不是旧状态)

Posted

技术标签:

【中文标题】动画值超过 0.8 后如何触发函数并将当前状态传递给该函数(不是旧状态)【英文标题】:How to trigger a function once the animated value is over .8 and pass in the current state to that function(not old state) 【发布时间】:2021-12-24 03:13:03 【问题描述】:

一旦 reactAnimated 值超过 .8,我正试图触发这个名为 moveNow() 的函数。我目前正在使用 addListner() 执行此操作,并且每次我的 useContext 中名为 DATA_LAYER.names 的列表发生更改时,我都会添加一个侦听器。问题是,当值超过 0.8 时,过去使用旧版本 DATA_LAYER.names 的侦听器仍然会被触发。基本上,当 reactAnimated 值超过 0.8 时,我不想进入下一个屏幕,但如果名称列表不为空,我也只想进入另一个屏幕。 但是,如果我添加一个名称,然后删除并使 reactAnimated 值超过 0.8,它仍然会转到另一个屏幕,因为名称有名称时的旧侦听器仍然存在。

const DATA_LAYER = React.useContext(DataLayerContext);
const reactAnimated = React.useRef(new Animated.Value(0)).current;
/*
  Some simple functions to move the reactAnimated value
*/
const moveNow = () =>
    if (DATA_LAYER.names.length!==0)
      props.navigation.navigate("loadingscreen");
    



React.useEffect(()=>
    // Animated values
    reactAnimated.addListener(val=>
       if (val["value"]>.8)
          moveNow() // move to next page
       
    );


  ,[DATA_LAYER.names])

【问题讨论】:

【参考方案1】:

您可以在useEffect 返回函数中清理监听器。

React.useEffect(()=>
    // Animated values
    reactAnimated.addListener(val=>
       if (val["value"]>.8)
          moveNow() // move to next page
       
    );

   return () => reactAnimated.removeAllListeners()
  ,[DATA_LAYER.names])

【讨论】:

非常感谢解决了我的问题

以上是关于动画值超过 0.8 后如何触发函数并将当前状态传递给该函数(不是旧状态)的主要内容,如果未能解决你的问题,请参考以下文章

如何平滑地将 CSS 动画恢复到当前状态?

在Vue中使用GSAP完成动画(四)播放组件

映射和传递 onClick 函数作为道具后如何定位特定元素

如何将组件的状态传递给父级?

如何在函数中传递值并将函数放入线程中?

如何将函数从父级传递给深层嵌套的子级并将@input 值用于Angular 8中传递的函数?