【发布时间】:2020-05-08 22:13:30
【问题描述】:
我实现了这个 React Spring 组件,点击它后会得到一张不同的幻灯片。我想通过使用setInterval 方法使其每隔 X 秒自动更改一次。
我尝试使用 setInterval,但没有得到想要的结果,因为 setInterval 函数被多次调用,随着时间的增加,幻灯片开始疯狂地变化,直到浏览器冻结。
这里是codeandbox原始项目https://codesandbox.io/embed/1y3yyqpq7q
这是我目前正在运行的代码
import { useTransition, animated } from 'react-spring'
import clientStyles from '../../styles/modules_scss/clients.module.scss'
const pages = [
({ style }) => <animated.div style={{ ...style, background: 'lightpink' }}>Andres Mejias</animated.div>,
({ style }) => <animated.div style={{ ...style, background: 'lightblue' }}>Andres Urdaneta</animated.div>,
({ style }) => <animated.div style={{ ...style, background: 'lightgreen' }}>Gustavo Abdelnour</animated.div>,
]
export default function SlideTransition() {
const [index, set] = useState(0)
const onClick = useCallback(() => set(state => (state + 1) % 3), [])
const transitions = useTransition(index, p => p, {
from: { opacity: 0, transform: 'translate3d(100%,0,0)' },
enter: { opacity: 1, transform: 'translate3d(0%,0,0)' },
leave: { opacity: 0, transform: 'translate3d(-50%,0,0)' },
})
return (
<div className={clientStyles.simpleTransMain} onClick={setInterval(onClick, 3000)}> //Here's my approach
{transitions.map(({ item, props, key }) => {
const Page = pages[item]
return <Page key={key} style={props} />
})}
</div>
)
}
我得到的最好结果是将setInterval 包装在一个匿名函数中,然后单击第一张幻灯片后,我每3000ms 都会得到一张新幻灯片。我希望在页面加载后无需单击幻灯片就可以做到这一点。
onClick={() => { setInterval(onClick, 3000) }}
【问题讨论】:
标签: javascript reactjs settimeout setinterval react-spring