React TransitionGroup dynamic CSSTransition

34 Views Asked by At
import { useState } from 'react';
import { BrowserRouter as Router, Routes, Route, Link, useLocation } from 'react-router-dom';
import { TransitionGroup, CSSTransition } from 'react-transition-group';

const Home = ({ setTransitionClass }) => {
    return (
        <div className="w-100 bg-success vh-100">
            <h1>Home</h1>
            <Link to="/picnic" onClick={() => setTransitionClass('fadeLeft')}>
                Picnic
            </Link>
        </div>
    );
};
const Picnic = ({ setTransitionClass }) => {
    return (
        <div className="w-100 bg-secondary vh-100">
            <h1>Picnic</h1>
            <Link to="/" onClick={() => setTransitionClass('fadeRight')}>
                Home
            </Link>
        </div>
    );
};
const routes = [
    { path: '/', name: 'home', component: Home },
    { path: '/picnic', name: 'picnic', component: Picnic },
];

function App() {
    const [transitionClass, setTransitionClass] = useState('');
    const location = useLocation();
    return (
        <>
            <div className="container-fluid p-0">
                <TransitionGroup>
                    <CSSTransition key={location.key} classNames={transitionClass} timeout={5000}>
                        <Routes location={location}>
                            {routes.map((route, index) => (
                                <Route
                                    key={index}
                                    path={route.path}
                                    element={<route.component setTransitionClass={setTransitionClass} />}
                                />
                            ))}
                        </Routes>
                    </CSSTransition>
                </TransitionGroup>
            </div>
        </>
    );
}

export default App;

Have problem on fade Left and Right animation, The CSSTransition will dynamic bind to transitionClass so I can pass animation from child, but the problem is when I call setTransitionClass('fadeLeft') , it will create new component with correct className, but the existing component won’t update the className.

0

There are 0 best solutions below