点击模态外部以关闭模态(react-native-modal)

时间:2017-10-16 17:05:50

标签: reactjs react-native react-modal

任何人都有实施react-native-modal的经验吗? 当我使用它时,当我在模态之外点击时,模态不会关闭。

以下是我尝试的内容

  • 添加onBackdropPress(()=> {this.props.hideModal()})
  • 在组件内外添加TouchableWithoutFeedback
  • 和许多其他方法......

这是我想要显示模态的屏幕。

render() {
    return (
        <View style={{flex: 1}}>
            <ScrollView>
               // CONTENT HERE
               {this._renderModal()} //rendering modal here
               <FABs onFABsPress={this._showModal} /> // I open Modal when I press the FABs button
            </ScrollView>
        </View>
    )
);

_renderModal = () => {
    return (
      <CameraImageSelectModal
        hideModal={this._hideModal}
        isModalVisible={this.state.isModalVisible}
        navigation={this.props.navigation}
      />
    )
}

这是模态组件:CameraImageSelectModal.js

render() {
    let { isModalVisible } = this.props;
    return (
      <View>
        <Modal
          isVisible={isModalVisible}
          onBackdropPress={() => {console.log('hey')}}>
          transparent={true}>
          <View style={styles.modalContainer}>
            <View style={styles.modalTitleTextContainer}>
              <Text style={styles.modalTitleText}>Hello World</Text>
            </View>
            <View style={styles.modalContentTextContainer}>
              <Text style={styles.modalContentText}></Text>
            </View>
            <View style={styles.modalButtonContainer}>
              <Button transparent onPress={this._handleCameraPress}>
                <Text style={[styles.modalText, styles.black]}>Camera</Text>
              </Button>
              <Button transparent onPress={this._handleAlbumPress}>
                <Text style={styles.modalText}>Album</Text>
              </Button>
            </View>
          </View>
        </Modal>
      </View>

谢谢!

2 个答案:

答案 0 :(得分:2)

我不认为模态具有内置功能,但您可以创建自己的组件。这是一个快速实现。你可能不得不乱用填充和边距来得到它你喜欢的方式,但这将允许在外面按下时模态被解除。

import React, { Component } from "react"
import { Modal, StyleSheet, View, TouchableHighlight } from "react-native"

const styles = StyleSheet.create({
  container: {
    zIndex: 1,
    margin: 25,
    backgroundColor: "white"
  },
  background: {
    flex: 1
  },
  outerContainer: {
    position: "absolute", 
    top: 0, 
    left: 0, 
    right: 0, 
    bottom: 0, 
    justifyContent: "center"
  }
})

const MyModal = props => (
  <Modal transparent={true} animationType={"slide"} visible={props.visible} onRequestClose={() => props.onRequestClose()}>
    <TouchableHighlight style={styles.background} onPress={() => props.onRequestClose()} underlayColor={"transparent"}>
      <View />
    </TouchableHighlight>
    <View style={ styles.outerContainer }>
      <View style={styles.container}>
        {props.children}
      </View>
    </View>
  </Modal>
)

export { MyModal }

答案 1 :(得分:2)

我只知道为什么onBackdropPress = {() => console.log("Pressed")}没有工作...... !!! onBackdropPress属性自版本3.xx以来被添加,我使用的是2.5.0版本。

所以yarn update react-native-modal解决了这个问题。

如果有人遇到库/组件没有按照您在文档中看到的那样工作的问题,请尝试检查您的软件包版本号!

干杯!