reactjs - 如何禁用子组件上的 PanResponder - React Native

标签 reactjs react-native react-native-ios react-native-0.46

friend ,我将采用 parent 的一个 View ,在 View 内我采用一个 TouchableOpacity。我将在主视图上添加 panResponder,并且当触摸主视图时其工作正常。但 TouchableOpacity 不起作用,我想删除 TouchableOpacity 上的 panResponder 。这样 TouchableOpacity 就可以工作了。

代码:

    this._panResponder = PanResponder.create({
      // Ask to be the responder:
      onStartShouldSetPanResponder: (evt, gestureState) => true,
      onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
      onMoveShouldSetPanResponder: (evt, gestureState) => true,
      onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,


      onPanResponderGrant: (evt, gestureState) => {
        // The gesture has started. Show visual feedback so the user knows
        // what is happening!

        // gestureState.d{x,y} will be set to zero now

        // this.toggleModal()
      },
      onPanResponderMove: (evt, gestureState) => {
        // The most recent move distance is gestureState.move{X,Y}

        // The accumulated gesture distance since becoming responder is
        // gestureState.d{x,y}
        console.log('onPanResponderMove');
      },
      onPanResponderTerminationRequest: (evt, gestureState) => true,
      onPanResponderRelease: (evt, gestureState) => {
        // The user has released all touches while this view is the
        // responder. This typically means a gesture has succeeded
        console.log('onPanResponderRelease');

        this.toggleModal()
      },
      onPanResponderTerminate: (evt, gestureState) => {
        // Another component has become the responder, so this gesture
        // should be cancelled

        console.log('onPanResponderTerminate');

      },
      onShouldBlockNativeResponder: (evt, gestureState) => {
        // Returns whether this component should block native components from becoming the JS
        // responder. Returns true by default. Is currently only supported on android.

        console.log('onShouldBlockNativeResponder');

        return true;
      },
    });
 }

潘已添加到家长 View :

render() {
    return (
      <View {...this._panResponder.panHandlers}>
        <TouchableOpacity onPress={this._onPressButton}>
         <Image
          style={styles.button}
          source={require('./myButton.png')}
         />
       </TouchableOpacity>
      </View>
    );
  },

在 mainView 上添加平移时,按钮 OnPress 事件不起作用。

最佳答案

更改此行,然后内部 Touchables 将获取事件。

当返回 true 时,它​​将阻止子进程成为响应者。

  onStartShouldSetPanResponderCapture: (evt, gestureState) => false,

来自document :

So if a parent View wants to prevent the child from becoming responder on a touch start, it should have a onStartShouldSetResponderCapture handler which returns true.

关于reactjs - 如何禁用子组件上的 PanResponder - React Native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45810262/

相关文章:

html - CSS 置顶,然后滚动回到顶部

react-native - 使用 ref 回调方法的动态 refs

react-native - 在响应 native 中处理网络请求失败

javascript - react : Static method always returns undefined

javascript - 找不到入口模块 : Error: Can't resolve './src/index.js'

javascript - 如何在 React Native 中创建和保存 CSV 文件?

node.js - 安装 expo-cli 时出现 Node 依赖/权限错误

javascript - 获取 "Illegal callback invocation from native module. This callback type only permits a single invocation from native code"

ios - React Native iOS 卡在 LaunchScreen 上

javascript - 如何在 useEffect/useCallback-hook 中正确处理来自 React Context 的数据