【发布时间】:2022-01-17 20:24:51
【问题描述】:
我的 App.js 如下
export const App = () => {
const [toggled, setToggled] = useState(false);
const [ordering, setOrdering] = useState(false);
const handleColorModeClick = () => {
setToggled((s) => !s);
};
const handleOrdering = () => {
setOrdering((s) => !s);
};
return (
<Ordering.Provider value={{ ordering: ordering }}>
<div className={`app ${toggled ? "theme-dark" : "theme-light"}`}>
<Switch>
<Route path="/" exact>
<HeaderComponent toggled={toggled} onClick={handleColorModeClick} />
<div>components2</div>
<EateryInfo toggled={toggled} />
{/* <CategoryItems toggled={toggled} /> */}
<MenuButton toggled={toggled} />
</Route>
<Route path="/menu">
<HeaderComponent toggled={toggled} onClick={handleColorModeClick} />
<CategoryItems toggled={toggled} />
<CheckBox
text="Start Ordering"
standAlone={true}
handleOrdering={handleOrdering}
/>
<MenuButton toggled={toggled} />
</Route>
</Switch>
</div>
</Ordering.Provider>
);
};
我使用复选框设置ordering 变量的状态
然后我用它来有条件地渲染QuantityChange 组件,像这样
export const MenuEntry = ({ mealData, toggled }: MenuEntryProps) => {
const orderingEnabled = useContext(Ordering);
return (
<div className="menu-entry">
<MenuItem oneMenuItem={mealData} toggled={toggled} />
{orderingEnabled.ordering ? <QuantityChange toggled={toggled} /> : ""}
</div>
);
};
所有这些都可以正常工作,并且组件可以根据需要进行渲染。
我希望这个组件的进入和退出平滑过渡。进入动画效果很好,但我无法弄清楚如何让退出动画工作。
视频是现在正在发生的事情,可以在视频中找到https://youtu.be/5kl1wCBwR_U(复选框位于右下角)
我查看了几个在线论坛以找到答案,但我无法弄清楚。
我也尝试过使用react-transition-group,但没有成功
export const QuantityChange = ({ toggled }: QuantityChangeProps) => {
const orderingEnabled = useContext(Ordering);
const duration = 500;
return (
<Transition in={orderingEnabled.ordering} timeout={duration} appear>
{(status) => (
<div
className={`quantity-change flex ${
toggled ? "theme-dark" : "theme-light"
} fade-${status}`}
>
<span className="add-quantity">+</span>
<span className="quantity">0</span>
<span className="subtract-quantity">-</span>
</div>
)}
</Transition>
);
};
我查看了onAnimationEnd,但无法弄清楚。
【问题讨论】:
-
您可以尝试拥有一个执行动画的 css 类,然后添加带有清理部分 (
return () => doStuff()) 的 useEffect,该部分将在组件卸载之前触发,您可以在此清理函数中使用 setTimeout这将设置这个 css 类 -
@JSEvgeny 我想你指的是这个问题stackoverflow.com/questions/61428958/… 我试过了,但它不起作用。原因是
checkBox上发生的状态变化和动画必须发生在单独的组件上。
标签: javascript reactjs css-animations conditional-rendering