【发布时间】:2021-09-12 06:08:00
【问题描述】:
我有一个动画,可以很好地从右侧和左侧移动项目。当点击后退按钮时,我想做相反的事情,类似于从移动应用程序的导航堆栈中弹出一个视图。我的代码在下面,单击按钮时如何使动画向后运行?我正在使用 React 17.0.2 和 react-spring 9.2.3 。
import React, { useState, useCallback, CSSProperties, useEffect } from "react";
import {
useTransition,
animated,
AnimatedProps,
useSpringRef,
} from "react-spring";
import styles from "../styles/components/carousel.module.css";
const Carousel: React.FC = () => {
const [index, set] = useState(0);
const onClick = useCallback(() => set((state) => (state + 1) % 6), []);
const transRef = useSpringRef();
const transitions = useTransition(index, {
ref: transRef,
keys: null,
from: { opacity: 0, transform: "translate3d(100%,0,0)" },
enter: { opacity: 1, transform: "translate3d(0%,0,0)" },
leave: { opacity: 0, transform: "translate3d(-50%,0,0)" },
});
useEffect(() => {
transRef.start();
}, [index, transRef]);
const pageContent: { text: string; color: string }[] = [
{ text: "one", color: "lightpink" },
{ text: "two", color: "lightblue" },
{ text: "three", color: "lightgreen" },
];
const pages: ((
props: AnimatedProps<{ style: CSSProperties }>
) => React.ReactElement)[] = pageContent.map((obj) => {
return function createAnimatedDiv({ style }) {
return (
<animated.div style={{ ...style, background: obj.color }}>
{obj.text}
</animated.div>
);
};
});
const onBackClicked = useCallback(() => set((state) => (state - 1) % 6), []);
return (
<>
<button onClick={onBackClicked}>Back</button>
<div className={`flex fill ${styles.container}`} onClick={onClick}>
{transitions((style, i) => {
const Page = pages[i];
return <Page style={style} />;
})}
</div>
</>
);
};
export default Carousel;
【问题讨论】:
-
为此类问题准备codesandbox 会很高兴。
标签: reactjs typescript react-spring