【发布时间】:2021-02-09 05:59:19
【问题描述】:
我正在尝试实现react-transition-group,并且需要能够将fadeEffectVisible 的状态从false 更改为true,假设用户导航到的路径与当前路径不同小路。换句话说,如果用户从page-1 导航到page-2,它应该可以工作,但如果用户在page-1 上并单击指向page-1 的链接,则不会。我正在使用钩子和功能组件,这是我现在的AppLayout 组件。
import React, { ReactNode, useEffect, useState } from 'react';
import { Footer } from 'components/footer/Footer';
import { Header } from 'components/header/Header';
import { NavigationSkipLink } from 'components/navigation-skip-link/NavigationSkipLink';
import { AppContext } from 'contexts/app-context/AppContext';
import { graphql, StaticQuery } from 'gatsby';
import { TransitionGroup, CSSTransition } from 'react-transition-group';
import s from './AppLayout.scss';
interface AppLayoutProps {
children: ReactNode;
location: any;
}
export const MainContentId = 'maincontent';
const NavQuery = graphql`
query NavQuery {
prismic {
allNavigations {
edges {
node {
...NotificationBar
...NavigationItems
...FooterNavigationItems
...LegalNavigationItems
}
}
}
}
}
`;
// eslint-disable-next-line react/display-name
export default ({ children, location }: AppLayoutProps) => {
const prevPath = location.href;
const [fadeEffectVisible, setfadeEffectVisible] = useState(true);
const handleFadeEffectEntered = () => {
setTimeout(() => {
setfadeEffectVisible(false);
}, 50);
};
useEffect(() => {
if (prevPath !== path) {
setfadeEffectVisible(true);
} else {
setfadeEffectVisible(false);
}
}, [path]);
return (
<StaticQuery
query={`${NavQuery}`}
render={(data) => (
<>
<AppContext>
<NavigationSkipLink />
<Header navigationContent={data.prismic.allNavigations.edges[0].node} />
<CSSTransition
in={fadeEffectVisible}
timeout={150}
classNames={{
enter: s.fadeEffectEnter,
enterActive: s.fadeEffectEnterActive,
enterDone: s.fadeEffectEnterDone,
exit: s.fadeEffectExit,
exitActive: s.fadeEffectExitActive,
}}
onEntered={handleFadeEffectEntered}
>
<div className={s.fadeEffect} aria-hidden="true" />
</CSSTransition>
<TransitionGroup component={null}>
<CSSTransition
key={path}
timeout={150}
classNames={{
enter: s.pageEnter,
}}
>
<div id={MainContentId} className={s.layout}>
{children}
<Footer navigationItems={data.prismic.allNavigations.edges[0].node} />
</div>
</CSSTransition>
</TransitionGroup>
</AppContext>
</>
)}
/>
);
};
我是否已经接近正确的道路了?谢谢!
【问题讨论】:
-
path !== path将始终为假。您是否需要将当前路径值与之前的路径值进行比较? How to get the previous props or state? 还是您需要针对当前路径测试目标路径? -
我需要针对当前路径测试目标路径。
-
那么,像
targetPath !== path在导航之前检查一下?如果已经在 that 路径上,您可以完全阻止导航吗?我认为我们需要更多的代码上下文。能否提供更完整的组件代码示例? -
问题更新了更多代码。感谢您的观看。
-
我认为您可能很接近,但尚不清楚
path的定义位置和来源。如果path和prevPath以及效果依赖项都是正确的,则更简洁的实现将是setfadeEffectVisible(prevPath !== path)int he effect。不过,这会将fadeEffectVisible的值延迟一个渲染周期,我不确定这就是您所追求的。状态值似乎只是来自prevPath和path的派生值,所以也许只是计算in 当前渲染周期,即in={prevPath !== path}?
标签: reactjs react-hooks gatsby use-effect use-state