关闭从其他自定义模态导入的 React 模态

Close React modal that was imported from other custom modal

首先我定义了这个组件以重用模态windows

模板 1:

...
import Modal from 'react-native-modal';
class CustomModal extends Component {

constructor(props){
    super(props);
}

componentWillReceiveProps(nextProps){
    this.setState({
        visible: nextProps.isVisible
    })
}

state = {
    visible: false
}


render() {
    return (
        <TouchableWithoutFeedback
        onPress={()=>{
            this.setState({
                visible: false
            });
        }}
        >
        <Modal
            isVisible={this.state.visible}
        >
            <TouchableWithoutFeedback onPress={() => {}}>
                <View>
                    {this.props.content}
                </View>
            </TouchableWithoutFeedback>
        </Modal>
        </TouchableWithoutFeedback>
    );
}
}

现在在第二个组件中我称之为:

import Modal from './common/modal';
return (<Modal
        isVisible={this.state.showModal}
        content={this.renderMyContent()}
        />
    )

点击一个按钮我设置状态 showModal : true,我的模态是打开的,我可以在模态外点击,实际上模态消失了,但我的 state.showModal 仍然是 : true,我如何更新状态这个观点?

同样在 React 中调用 this.setState({showModal: false}) 我们将这些称为组件而不是 "templates"

您可以通过回调传递给 react-native-modalonModalHide 道具。

在您的 CustomModal 中: <Modal onModalHide={this.props.onModalHide} ... />

在你的"second template"

<Modal onModalHide={() => this.setState({ showModal: false })} ... />.

另请注意,无需跟踪 CustomModal 状态 中的可见性,因为它已经在 prop 中具有可见性。直接将 prop 传递给内部 Modal 即可:<Modal isVisible={this.props.isVisible} .../>

在您调用 <Modal /> 的 class 中创建函数 hideModal,如下所示:

hideModal = () => {
    this.setState({showModal: false})
}

并将其作为道具传递给 <Modal /> 如下:

    import Modal from './common/modal';
    return (<Modal
        isVisible={this.state.showModal}
        content={this.renderMyContent()}
        hideModal={this.hideModal}
        />
    )

并且为了结束调用 hideModal prop 上面从你的 CustomModal 组件传递如下:

...
import Modal from 'react-native-modal';
class CustomModal extends Component {

constructor(props){
    super(props);
}

componentWillReceiveProps(nextProps){
    this.setState({
        visible: nextProps.isVisible
    })
}

state = {
    visible: false
}


render() {
    return (
        <TouchableWithoutFeedback
        onPress={()=>{
            this.props.hideModal()
        }}
        >
        <Modal
            isVisible={this.state.visible}
        >
            <TouchableWithoutFeedback onPress={() => {}}>
                <View>
                    {this.props.content}
                </View>
            </TouchableWithoutFeedback>
        </Modal>
        </TouchableWithoutFeedback>
    );
}
}