2

我已经有这个问题一个多月了,一遍又一遍地用新的想法回到它,但我无法解决解决方案。必须有一个,这是微不足道的!

我的目标是通常从左滑入页面并向右滑出。当它反转时(用户单击后退按钮或历史记录通知已弹出路线),页面应向右退出,下一条路线应从左侧(相反)进入。

一切正常,但是当我 PUSH 一条路线然后 POP 一条路线时,下一页将向右退出并从右侧进入。进入页面在有时间更新之前使用旧姿势。如果我再弹出一次,它就会正常工作,新页面从左侧滑动,而旧页面从右侧退出。这只是我第一次使用 POP 进行更改。我非常依赖 const reverse 值。该组件仅在我更改路由时呈现一次,并且在我第一次单击 POP 时 reverse = true。

我有一个像这样的 AnimatedSwitch 组件

export const AnimatedSwitch = ({ location, children, ...rest }) => {
  const clickedBack = useSelector(state => state.interfaceReducer.clickedBack);
  const routePopped = useSelector(state => state.routeReducer.routePopped);
  const reverse = clickedBack || routePopped;
  const onRest = () => {
       clickedBack && dispatch(toggleClickedBackButton(false));
  }
    return (
        <PoseGroup
            animateOnMount={true}
            preEnterPose={reverse ? "leftSide" : "rightSide"}
            exitPose={reverse ? "rightSide" : "leftSide"}
            onRest={onRest}
            reverse={reverse}
        >
            <ContextRouteAnimation poseKey={`${reverse}-${location.pathname}`} key={location.pathname} reverse={reverse}>
                <Switch location={location} {...rest}>
                    {children}
                </Switch>
            </ContextRouteAnimation>
        </PoseGroup>
    )
}

这是 ContextRouteAnimation 姿势组件:

const ContextRouteAnimation = posed.div({
    enter: {
        opacity: 1,
        x: "0%",
        transition: {
            type: "tween",
            ease: "easeInOut",
            duration: TIMING.SLOW,
        },
    },
    leftSide: {
        x: "-100%",
        opacity: 0,
        transition: {
            type: "tween",
            ease: "easeInOut",
            duration: TIMING.SLOW,
        },
    },
    rightSide: {
        x: "100%",
        opacity: 0,
        transition: {
            type: "tween",
            ease: "easeInOut",
            duration: TIMING.SLOW,
        },
    },
});

我尝试了多种方法,例如

  • 将反向传递给 ContextRouteAnimation 并使用 preEnter + exit 姿势。
  • 直接在 ContextRouteAnimation 上设置姿势
  • 将组件存储为状态,仅在更新新姿势后更新它,然后触发另一个渲染
4

0 回答 0