Android 将本机-模态作为错误组件进行反应(多次打开)

Android 将本机-模态作为错误组件进行反应(多次打开),android,ios,reactjs,react-native,Android,Ios,Reactjs,React Native,我创建了一个错误组件以在模式中显示。 我还使用PubSub来获取错误通知,因此我可以激活组件 但是,我有多个屏幕,比如登录,注册,任何形式,另一种形式 因此,每次我有一个组件时,它都会构建一个新组件。。。因此,根据您所处的屏幕,您最多可以看到5个模型以相同的消息打开 如果您正在登录,那么您只有一个模式—It self 如果你是在注册,你有两个-登录和它自己 如果你是以任何形式,你有三个:登录,注册(如果你进入该屏幕)和它自己 事情还在继续 所以这个类非常简单 export default

我创建了一个错误组件以在模式中显示。 我还使用PubSub来获取错误通知,因此我可以激活组件

但是,我有多个屏幕,比如登录,注册,任何形式,另一种形式

因此,每次我有一个组件时,它都会构建一个新组件。。。因此,根据您所处的屏幕,您最多可以看到5个模型以相同的消息打开

  • 如果您正在登录,那么您只有一个模式—It self
  • 如果你是在注册,你有两个-登录和它自己
  • 如果你是以任何形式,你有三个:登录,注册(如果你进入该屏幕)和它自己

事情还在继续

所以这个类非常简单

export default class Error extends Component {
  constructor(){
    super();

    this.state = {
      modalVisible: false,
      errors: []
    }

    this.setModalVisible = this.setModalVisible.bind(this);
  }

  setModalVisible(visible) {
    this.setState({modalVisible: visible});
  }

  // Using pubSub to get new error msgs...    
  componentDidMount() {
    PubSub.subscribe("error",function(topic,error){
          // Did this to try to stop to show twice
          if(this.state.modalVisible)
            return;

          //Irelevant code here    
          this.setState({errors: errors});

          this.setModalVisible(true);
      }.bind(this));
  }


  render() {
    return (    
      <Modal
        animationType={"slide"}
        transparent={false}
        visible={this.state.modalVisible}
        onRequestClose={() => this._setModalVisible(false)}
        >
       <View style={styles.container}>
          <View style={styles.header}>
              <View/>
              <Text style={styles.headerText}>
                An error has occured
              </Text>

               <Icon
                raised
                name='close'
                color='red'
                onPress={() => {
                  this.setModalVisible(!this.state.modalVisible)
                }} />
          </View>

          <View style={styles.errorContainer}>
            { this.state.errors.map((error, index) => <Text key={index} style={styles.error}>{error}</Text> ) }
          </View>

       </View>
      </Modal>
    );
  }
}
在Subscribe方法中,我检查是否应该根据屏幕名称使其可见。比如:

if(!this.state.screenName == error.screen)
  return;
不管怎么说,这看起来太夸张了。也许有更好的办法

编辑以使用组件:

    <Error />
    <Error screen='SignUp'/>

是的,就像我在问题上说的。。。我已经做了这个丑陋的解决方案:我仍然在寻找更好的选择

      // Checking if the screen is the same
      if(this.props.screen !== error.screen)
        return;
生成错误对象:

  var error = {
    screen: 'SignIn',
    errors: json.errors || ['Something went wrong.']
  }

  PubSub.publish("error", error);
并使用错误组件:

    <Error />
    <Error screen='SignUp'/>


因此,每次出现错误时,它都会弹出当前错误和以前的错误?另一方面,我认为您的onRequestClose中有一个输入错误。\u setModalVisible(false)。您还可以提供一些关于如何使用错误组件的代码吗?谢谢Matt,我更新了问题:)并且没有,它不会上载以前的错误。。。这是以前屏幕上安装的所有错误组件。因此,登录->注册->表单1->表单2->表单3如果您浏览所有这些视图,它将弹出5个具有相同错误的模式。(因为每个实例都会创建一个新实例……所有实例都会“监视”错误通道。
    <Error screen='SignUp'/>