【问题标题】:React Native responding to child press eventsReact Native 响应儿童新闻事件
【发布时间】:2020-02-12 10:19:52
【问题描述】:

我正在寻找一种解决方案,让我能够从父组件响应所有子组件的新闻事件(包括嵌套在其他组件中的子组件)。特别是,我对新闻稿事件(例如 onPressOut for TouchableOpacity 等)感兴趣。

我不想打断孩子对该事件的反应,我只想对该事件做出进一步反应以执行其他任务。出于这个原因,我不能在父组件上使用捕获阶段,因为它会停止在链中进一步传播事件。

我也不想手动为父级的每个子级添加新闻响应功能,因为会有很多子级,这会成为一项繁琐的任务,尤其是在重构或重新实现时。

父 TouchableOpacity 组件允许我在冒泡事件阶段捕获所有没有子响应的按下事件。但是,如果一个孩子对它们做出响应,则事件不会在链中进一步向上传播,因此,它永远不会到达父 TouchableOpacity。

在代码中:

<TouchableOpacity onPressOut={ this.doSomethingInParentWhenAChildIsPressed >
    <TouchableOpacity onPressOut={()=>{
        /* doing something in child, parent should react in addition to this */
    } />
    <View>
        <TouchableOpacity onPressOut={()=>{
            /* doing something in nested child, parent should react in addition to this */
        } />
    </View>
    <View>
        <Text>When this text is pressed, the parent TouchableOpacity responds</Text>
        <View>
            <TouchableOpacity onPressOut={()=>{
                /* doing something in other nested child, parent should react in addition to this */
            } />
        </View>
        <View>
            <Text>The parent TouchableOpacity also responds on this text being pressed</Text>
        </View>
    </View>
</TouchableOpacity>

你知道有什么方法可以实现吗?

是否有可能以某种方式从父级捕获触摸开始事件,同时仍允许事件在链中进一步传播?我一直在寻找任何可以让我创建合成事件并在 React Native 中发出它的东西,但我找不到任何解决方案。

【问题讨论】:

    标签: javascript react-native events


    【解决方案1】:

    你可以定义一个函数,当父被按下时调用,当子被按下时调用相同的函数

    class App extends React.Component {
      onPress = () => {
        console.log('Parent Pressed');
      };
      render() {
        return (
          <View style={styles.container}>
            <TouchableHighlight onPress={this.onPress}>
              <View style={styles.button}>
                <Text>Parent</Text>
                <TouchableHighlight onPress={() => {
                  console.log('Child Pressed')
                  this.onPress()
                }} style={styles.child}>
                  <Text>Child</Text>
                </TouchableHighlight>
              </View>
            </TouchableHighlight>
          </View>
        );
      }
    }
    

    查看此小吃示例https://snack.expo.io/@ashwith00/4ddff3

    【讨论】:

    • 感谢您的建议,但是,我的问题是能够做到这一点,而无需将父函数添加到孩子的新闻事件处理程序。原因是我有使用自定义 PanResponder 事件的自定义子组件,由于捕获开始和移动事件的工作方式,这些事件很难开始工作。在这些 PanResponder 事件期间捕获并调用父按下事件会干扰 PanResponder 处理程序的逻辑并破坏某些功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多