开发者问题收集

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

2018-09-18
14768

我有一个带有 主屏幕 的应用程序,在这个屏幕上,我正在渲染一个 模态 ,它在按下 按钮 时打开,在 模态 里面我有一个按钮,它应该 导航到另一个屏幕 ,它可以正确导航,但是当我导航到另一个屏幕时, 模态不会消失 ,我该如何隐藏它?

添加代码进行演示

主页:

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;

模态:

import React, { Component } from "react";
import Modal from "react-native-modal";

class Modal extends Component {

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

    return (
        <Modal
        isVisible={this.props.visible}>
          <Button onPress={() => {navigate('Main')}}>
            >Button</Text>
          </Button>
        </Modal>
    );
  }
}

export default Modal;
3个回答

理想情况下,您应该等待 setState 在回调中完成,然后导航到屏幕,因为这些方法是 异步的 ,如果在 setState 完成之前调用 navigate ,可能会破坏状态。

此外, parent 应该控制 child 的状态。

主页

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>
Pritish Vaidya
2018-09-18

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

类似这样的内容 -

您的主屏幕应该有一个类似 -

onModalClose = () => {this.setState({isModalVisible: false})}

然后将其作为引用传递给模态组件,如 -

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

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

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

编辑

刚刚注意到,由于您已经有一个切换模态可见性的函数,因此您不需要定义新函数。您可以将该函数引用传递给模态组件本身。

  <Modal
visible={this.state.isModalVisible}
navigation={this.props.navigation}
onModalClose={this.toggleModal}
/>
Aseem Upadhyay
2018-09-18

我采用了 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>
      );
    }
}
MontiRabbit
2019-09-11