导航到另一个屏幕时关闭模态

时间:2018-09-18 17:04:29

标签: react-native react-navigation react-modal

我有一个带有主屏幕的应用,在此屏幕中,我呈现了一个模块,该模块在button press的{​​{1}}内部打开我有一个按钮,该按钮可以将我导航到另一个屏幕,它可以正确导航,但是当我导航到另一个屏幕时,模式不会消失,我该如何隐藏它?

添加代码进行演示

首页:

Modal

模式:

import React, { Component } from 'react';
import Modal from './Modal';

class Home extends Component {
  state = {
    isModalVisible: false
  };

  toggleModal = () =>
    this.setState({ isModalVisible: !this.state.isModalVisible });

  render() {
    const { navigate } = this.props.navigation;

    <Modal
    visible={this.state.isModalVisible}
    navigation={this.props.navigation}
    />
    );
  }
}

export default Home;

3 个答案:

答案 0 :(得分:2)

理想情况下,您应该等待setState在回调内完成,然后导航至屏幕,因为方法是 async ,并且如果navigate是在setState完成之前调用。

父母应该控制孩子的状态。

首页

onNavigate = () => {
  this.setState({isModalVisible: false}, () => this.props.navigation.navigate('Main')
}

<Modal
    visible={this.state.isModalVisible}
    onNavigate={this.onNavigate}
 />

模态

<Modal
  isVisible={this.props.visible}>
    <Button onPress={this.props.onNavigate}>
      <Text>Button</Text>
    </Button>
</Modal>

答案 1 :(得分:0)

您应该提供对定义模态组件可见性状态的变量的引用。您需要定义一个函数,以隐藏模式,并将函数引用传递给模式组件,并在按下按钮的同时执行导航操作。

-

您的主屏幕应具有-

之类的功能
onModalClose = () => {this.setState({isModalVisible: false})}

然后将其作为对-

之类的模式组件的引用
  <Modal
visible={this.state.isModalVisible}
navigation={this.props.navigation}
onModalClose={this.onModalClose}
/>

并在onPress()组件的<Button/>方法上调用它,如-

          <Button onPress={() => {this.props.onModalClose(); navigate('Main')}}>

编辑

请注意,由于您已经具有切换模态可见性的功能,因此无需定义新功能。您可以将该函数引用传递给模态组件本身。

  <Modal
visible={this.state.isModalVisible}
navigation={this.props.navigation}
onModalClose={this.toggleModal}
/>

答案 2 :(得分:0)

我回答了Pritish Vaidya,并使其可用于任何屏幕。

首页

import React, { Component } from 'react';
import Modal from './Modal';

class Home extends Component {
  state = {
    isModalVisible: false
  };

  toggleModal(screenName) {
    this.setState({isModalVisible: !this.state.isModalVisible });
    if (screenName && screenName != '') {
       this.props.navigation.navigate(screenName);
    }
  }

  render() {
    <Modal
      visible={this.state.isModalVisible}
      onDismiss={(screenName) => { this.toggleModal(screenName); }}
    />
    );
  }
}

export default Home;

模式:

class Modal extends Component {

    dismissScreen(screenName) {
        const dismissAction = this.props.onDismiss;
        dismissAction(screenName);
    }

    render() {
      return(
        <View style={{ flex: 1, padding: 20 }}>
            <Button
            title="Dismiss Modal"
            onPress={() => {this.dismissScreen();}}
            />
            <Button
            title="Navigate to Other Screen"
            onPress={() => {this.dismissScreen('ScreenName');}}
            />
        </View>
      );
    }
}