如何避免使用 react-swipe 库和 useState 重新渲染
How to avoid re-rendering with react-swipe library and useState
我正在使用反应库进行滑动:https://github.com/voronianski/react-swipe
让它工作很简单:
import React, {useEffect, useState} from 'react';
import ReactDOM from 'react-dom';
import ReactSwipe from 'react-swipe'
import styled from 'styled-components'
const StyledBox = styled.div`
height: 50px;
width: 100%;
background-color: orange;
`
const Carousel = () => {
let reactSwipeEl;
const [position, setPosition] = useState(0)
console.log('position', position)
const swipeOptions = {
continuous: false,
transitionEnd() {
setPosition(reactSwipeEl.getPos())
}
}
return (
<div>
<ReactSwipe
className="carousel"
swipeOptions={swipeOptions}
ref={el => (reactSwipeEl = el)}
>
<StyledBox>PANE 1</StyledBox>
<StyledBox>PANE 2</StyledBox>
<StyledBox>PANE 3</StyledBox>
</ReactSwipe>
<Circles>
<Circle isActive={0 === position} />
<Circle isActive={1 === position}/>
</Circles>
</div>
);
};
export default Carousel
我添加的代码是与useState相关的代码。该库工作正常,但每次滑动时,我都会使用回调 transitionEnd 来更新位置状态。它已更新,但由于状态变量发生变化,整个 Carousel 组件都会更新,自动设置初始值,即 0。
我不明白如何避免这个问题,即在不重新渲染整个组件的情况下更新状态。我应该将它分成两个部分并使用提供商吗?
我试过了,但是当提供者的状态改变时,两个组件也都重新渲染
swipeOptions
会在每次渲染时重新创建,这也会导致 ReactSwipe
重新渲染。用 useMemo()
(sandbox);
包裹 swipeOptions
const swipeOptions = useMemo(() => ({
continuous: false,
transitionEnd() {
setPosition(reactSwipeEl.current.getPos())
}
}), []);
我正在使用反应库进行滑动:https://github.com/voronianski/react-swipe 让它工作很简单:
import React, {useEffect, useState} from 'react';
import ReactDOM from 'react-dom';
import ReactSwipe from 'react-swipe'
import styled from 'styled-components'
const StyledBox = styled.div`
height: 50px;
width: 100%;
background-color: orange;
`
const Carousel = () => {
let reactSwipeEl;
const [position, setPosition] = useState(0)
console.log('position', position)
const swipeOptions = {
continuous: false,
transitionEnd() {
setPosition(reactSwipeEl.getPos())
}
}
return (
<div>
<ReactSwipe
className="carousel"
swipeOptions={swipeOptions}
ref={el => (reactSwipeEl = el)}
>
<StyledBox>PANE 1</StyledBox>
<StyledBox>PANE 2</StyledBox>
<StyledBox>PANE 3</StyledBox>
</ReactSwipe>
<Circles>
<Circle isActive={0 === position} />
<Circle isActive={1 === position}/>
</Circles>
</div>
);
};
export default Carousel
我添加的代码是与useState相关的代码。该库工作正常,但每次滑动时,我都会使用回调 transitionEnd 来更新位置状态。它已更新,但由于状态变量发生变化,整个 Carousel 组件都会更新,自动设置初始值,即 0。
我不明白如何避免这个问题,即在不重新渲染整个组件的情况下更新状态。我应该将它分成两个部分并使用提供商吗? 我试过了,但是当提供者的状态改变时,两个组件也都重新渲染
swipeOptions
会在每次渲染时重新创建,这也会导致 ReactSwipe
重新渲染。用 useMemo()
(sandbox);
swipeOptions
const swipeOptions = useMemo(() => ({
continuous: false,
transitionEnd() {
setPosition(reactSwipeEl.current.getPos())
}
}), []);