【问题标题】:React Native: How to pass params to parent component from child component propReact Native:如何将参数从子组件道具传递给父组件
【发布时间】:2020-04-23 23:39:39
【问题描述】:

我想创建一个在按下某个键时具有事件触发器的 HOC。当这个键被按下时,它应该向父组件提供一个事件。在这种情况下,键是“@”。

儿童 HOC

import React, { Component } from 'react';

const withMention = WrappedComponent => {
  return class extends Component {
    state = {
      mentionStart: false,
      textInput: '',
      selection: 0,
    };
    handleOnKeyPress = key => {
      if (key === '@') {
        this.setState({ mentionStart: true });
      }
    };

    render() {
      const { onMentionStart } = this.state;
      return (
        <WrappedComponent
          onChangeText={text => {
            this.setState({ textInput: text });
          }}
          onKeyPress={event => this.handleOnKeyPress(event.nativeEvent.key)}
          onSelectionChange={event =>
            this.setState({ selection: event.nativeEvent.selection })
          }
          onMentionStart={onMentionStart}
          {...this.props}
        />
      );
    }
  };
};

export default withMention;

父组件

const UserComment = withMention(TextInput);

<UserComment onMentionStart={(event) => console.log(event)}       />

我知道实现是错误的,因为每当我为父组件的 onMentionStart 属性分配一个函数时,子组件的函数就会被父组件覆盖。在这种情况下,如何从子组件创建自定义事件触发器并将事件传递给它,以便父组件可以相应地使用它?

【问题讨论】:

    标签: javascript react-native event-handling


    【解决方案1】:

    我实际上是通过从 HOC 中删除 onMentionStart 属性并将 onMentionStart 函数作为回调从父级传递给子级来解决的,在 onKeyPress 处理函数中处理它。

    import React, { Component } from 'react';
    
    const withMention = WrappedComponent => {
      return class extends Component {
        state = {
          mentionStart: false,
          textInput: '',
          selection: 0,
        };
        handleOnKeyPress = key => {
          if (key === '@') {
            this.setState({ mentionStart: true }, () =>
              this.props.onMentionStart(this.state.mentionStart),
            );
          }
        };
    
        render() {
          return (
            <WrappedComponent
              onChangeText={text => {
                this.setState({ textInput: text });
              }}
              onKeyPress={event => this.handleOnKeyPress(event.nativeEvent.key)}
              onSelectionChange={event =>
                this.setState({ selection: event.nativeEvent.selection })
              }
              {...this.props}
            />
          );
        }
      };
    };
    
    export default withMention;
    

    【讨论】:

    • React 遵循冯诺依曼架构,其中数据流是单向的。我强烈建议您尝试以这种方式设计您的应用程序。如果设计得当,它会使调试更容易,代码更易于维护。
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多