如何在功能组件中使用 PanResponder?

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)

Man*_*uck 8

在这里找到解决方案: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)

  • 这是错误的。通过使用备忘录,如果您再次创建 panResponder,您的 pan 处理程序将永远到达那里。然后他们将阻止 InteractionManager。 (2认同)