如何使 Modal 在 react-native 中显示为不同的组件

Posted

技术标签:

【中文标题】如何使 Modal 在 react-native 中显示为不同的组件【英文标题】:How to make Modal to show up as a different Component in react-native 【发布时间】:2017-05-06 17:13:20 【问题描述】:

我正在使用 react-nativenative-basereact-native-modal 依赖项。 我有一个 Home 活动,其中有一个带有可以打开模式的按钮的标题。

但我仍然不知道如何使它工作。使用 Native-Base Button 组件,每当我将 onPress 事件绑定到我的 showModal() 函数时,它都会说“变量 showModal 不存在”,如果我添加 this.showModal() 作为代替,它会引发 stack limit exceeded 红色背景错误在 ios 模拟器中。

这是我的父组件:

import React,  Component  from 'react';
import 
    AppRegistry,
    StyleSheet,
    Text,
    ScrollView,
    View
 from 'react-native';
import AddEntryModal from './src/add-entry-modal';
import Flag from 'react-native-flags';
import 
    Header,
    Container,
    Left,
    Button,
    Icon,
    Body,
    Title,
    Right,
    Item,
    Input
 from 'native-base';

var MyApp = React.createClass(

    getInitialState: function() 
        return 
            modalVisible: true
        
    ,

    render: function() 
        return (
            <Container>
                <Header style= backgroundColor: '#333333' >
                    <Left>
                        <Button transparent>
                            <Icon name='ios-settings' />
                        </Button>
                    </Left>
                    <Body>
                        <Item rounded>
                            <Icon active name='ios-search' />
                            <Input placeholder='Search' />
                        </Item>
                    </Body>
                    <Right>
                        <Button onPress= showModal()  transparent>
                            <Icon name='ios-contact' />
                            <Icon name='ios-add' />
                        </Button>
                    </Right>
                </Header>

                <ScrollView>
                    ... <-- have some irrelevant stuff here
                </ScrollView>
            </Container>
        );
    ,

    showModal: function() 
        this.setState(
        
            modalVisible: true
        )
    
);

AppRegistry.registerComponent('myapp', () => MyApp);

然后,在一个单独的文件中,我想要我的模态组件。

import React,  Component  from 'react';
import Modal from 'react-native-modal';
import  Text, TouchableOpacity, View  from 'react-native';


var AddEntryModal = React.createClass(

    // _showModal: () => this.setState( modalVisible: true ),

    // _hideModal: () => this.setState( modalVisible: false ),

    render: function() 
      return (
        <View style= flex: 1 >
          <Modal isVisible= this.props.modalVisible >
            <View style= flex: 1 >
              <Text>Hello World!</Text>
            </View>
          </Modal>
        </View>
      )
    
);

module.exports = AddEntryModal;

但由于某种原因无法正常工作,我是新来的原生反应。 如果我在父类中的某处添加&lt;AddEntryModal&gt;&lt;/AddEntryModal&gt; 组件,即使它没有显示,它也会占用空间。

有什么办法可以解决这个问题吗?

【问题讨论】:

【参考方案1】:

你应该在你的父类中使用 &lt;AddEntryModal /&gt; 来渲染 modal ,你还需要将可见性值作为道具传递。 &lt;AddEntryModal modalVisible=this.state.modalVIsible /&gt;。 您可能需要为您的模态类使用position: 'absolute' 样式以将其呈现在另一个屏幕的顶部。

【讨论】:

天啊!!!我是如此接近!哈哈,非常感谢你,Hariks!它奏效了,你是一个救生员:) 我有一个简单的问题,如果我在模态组件(子组件)中,我可以更改其中的变量状态吗?通过执行 setState( modalVisible: false) ?还是我必须做其他事情?因为不工作,不让我通过按钮关闭它。

以上是关于如何使 Modal 在 react-native 中显示为不同的组件的主要内容,如果未能解决你的问题,请参考以下文章

react-native modal 不占用设备的全屏

bootstrap modal 如何设置使其点击对话框外的灰色背景不退出!!

模态打开时使抽屉可见。反应原生

vuejs中input还没输入完就触发了v-modal,如何使input输入完后触发v-modal

删除行时如何使多行TextInput缩小(React-Native)?

如何在 react-native 中使文本的某些部分可点击并且某些部分具有不同的文本颜色