Gun*_*kar 8 reactjs react-native
我发现的官方文档和所有教程都使用 PanResponder 作为 React Classes 的一部分,但是有没有办法将它与功能组件和钩子一起使用?我尝试按如下方式进行,但似乎不起作用:-
const App = props => {
const position = useRef(new Animated.ValueXY()).current;
const panResponder = useRef(
PanResponder.create({
onStartShouldSetPanResponder: (evt, gestureState) => true,
onPanResponderMove: (evt, gestureState) => {
position.setValue({x: gestureState.dx, y: gestureState.dy});
},
onPanResponderRelease: (evt, gestureState) => {},
}),
).current;
...
<Animated.View
{...panResponder.panHandlers}
style={[
{transform: position.getTranslateTransform()},
styles.appStyles,
]}>
...
</Animated.View>
Run Code Online (Sandbox Code Playgroud)
在这里找到解决方案:https : //github.com/facebook/react-native/issues/25360#issuecomment-505241400
useMemo 避免在每次重新渲染时重新创建 PanResponder
那么你的代码应该是这样的
const App = props => {
const position = useRef(new Animated.ValueXY()).current;
const panResponder = React.useMemo(() => PanResponder.create({
onStartShouldSetPanResponder: (evt, gestureState) => true,
onPanResponderMove: (evt, gestureState) => {
position.setValue({x: gestureState.dx, y: gestureState.dy});
},
onPanResponderRelease: (evt, gestureState) => {},
}), []);
...
<Animated.View
{...panResponder.panHandlers}
style={[
{transform: position.getTranslateTransform()},
styles.appStyles,
]}>
...
</Animated.View>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2802 次 |
| 最近记录: |