【发布时间】:2021-05-24 11:32:20
【问题描述】:
React Native PanResponder 可拖动被 setState 中断
我有一个状态变量来跟踪秒数
const [seconds, setSeconds] = useState(0)
useEffect(() => {
const interval = setInterval(() => {
if (seconds > 59) {
setSeconds(0)
} else {
setSeconds((seconds) => seconds + 1)
}
}, 1000)
return () => clearInterval(interval)
}, [seconds])
我也在使用可拖动的平移响应器
import React, { useState, useRef, ReactNode } from 'react'
import {
StyleSheet,
Animated,
PanResponder,
PanResponderGestureState,
Text
} from 'react-native'
const Draggable = (props) => {
const { draggable, isDropZone, moveToDropArea } = props
const [showDraggable, setshowDraggable] = useState(true)
const pan = useRef<Animated.AnimatedValueXY>(new Animated.ValueXY()).current
const panResponder = PanResponder.create({
onStartShouldSetPanResponder: () => true,
onPanResponderMove: Animated.event([
null,
{
dx: pan.x,
dy: pan.y,
},
]),
onPanResponderRelease: (e, gesture) => {
if (isDropZone(gesture)) {
setshowDraggable(false)
moveToDropArea()
} else {
Animated.spring(pan, {
toValue: { x: 0, y: 0 },
useNativeDriver: false,
}).start()
}
pan.flattenOffset()
},
})
return (
<Animated.View {...panResponder.panHandlers} style={[pan.getLayout()]}>
<Text>{seconds}</Text>
</Animated.View>
)
}
当我尝试拖动 draggable 时,它会移动,但是当状态更新时,组件会重新渲染,并且 Draggable 项会回到原来的位置。
如何预防?
提前致谢。
【问题讨论】:
-
从依赖项中删除秒数。因为当第二个变量发生变化时,它会触发 useEffect 钩子。
-
你检查过this吗?
-
@R.CanserYanbakan 如果我从依赖项列表中删除秒,UI 将不会更新秒
-
问题是您每次第二次更改时都重新定义间隔。将间隔排除在效果之外。
标签: javascript reactjs react-native react-hooks