【问题标题】:How to connect react component in react navigation?如何在反应导航中连接反应组件?
【发布时间】:2018-11-19 09:44:11
【问题描述】:

我在 react native 中创建了模态。我现在在右上角添加了过滤器选项图标,当用户点击它应该打开模式。我怎样才能做到这一点 ?我在 navigation.js 中添加了选项图标,但现在如何将它与模态组件连接?

setModalVisible 下面的代码在 filteroptions.js 中可用,而在 navigation.js 中不可用

代码:

navigation.js:

Updates: {
            screen: UpdatesScreen,

            navigationOptions: ({ navigation }) => ({
                headerTitle: 'Myapp',
                headerRight:<TouchableOpacity onPress={() => {this.setModalVisible(true);}}>
                                <MenuIcon style={{paddingLeft: 10, paddingRight: 15}} name="md-options" size={25} color="white"/>
                            </TouchableOpacity>,

            })
        }, 

filteroptions.js:

import React, {Component} from 'react';
import {Modal, Text, TouchableHighlight, View, Alert} from 'react-native';

export default class FilteroptionsModel extends Component {
  state = {
    modalVisible: false,
  };

  setModalVisible(visible) {
    this.setState({modalVisible: visible});
  }

  render() {
    return (
      <View style={{marginTop: 22}}>
        <Modal
          animationType="slide"
          transparent={false}
          visible={this.state.modalVisible}
          onRequestClose={() => {
            Alert.alert('Modal has been closed.');
          }}>
          <View style={{marginTop: 22}}>
            <View>

              <TouchableHighlight
                onPress={() => {
                  this.setModalVisible(!this.state.modalVisible);
                }}>
                <Text>Hide Modal</Text>
              </TouchableHighlight>
            </View>
          </View>
        </Modal>
      </View>
    );
  }
}

当用户点击右上角的过滤器按钮时(见截图),他应该能够在屏幕上看到框模式:

【问题讨论】:

    标签: javascript reactjs react-native


    【解决方案1】:

    由于它是一种模式,您不一定需要将其添加到导航中。您可以将其包含在您的页面中并最初使其不可见,然后当用户单击您的按钮时,您可以使模式可见。但是,如果您想将它添加到导航中,为什么不像任何其他组件一样添加。但是,当您导航到组件时,将其添加到导航将带您到另一个页面。当然,您可以添加一个嵌套导航器来解决这个问题,但我认为这会增加不必要的复杂性。

    更新 您将首先声明一个Header 组件。

    export default class MyHeader extends React.PureComponent {
    
      render() {
        <View>
          <View>...Your left Icon here</View>
          <View>...Your Title here</View>
          <View>...Your right Icon Here</View>
        </View>
      }
    }
    

    然后在您的页面中,您将首先渲染此组件,将您的处理程序作为道具传递,然后渲染页面的其余部分。

    export default class MyPage extends React.PureComponent {
    
      yourRigthHandler = () => {
         this.setState({modaVisible: true});
      }
    
      yourLeftHandler = () => {....}
    
      render() {
        <View>
          <MyHeader 
             LeftHandler={yourLeftHandler}
             LeftHandler={yourRigthHandler}>
               ....
          </MyHeader>
        </View>
      }
    }
    

    在处理程序中,您可以调用导航函数导航到另一个页面或更改组件状态以使模式可见。处理程序将作为道具传递给您的标题,您将它们作为onPress 处理程序添加到您的按钮。

    【讨论】:

    • 但是我已经在 navigation.js 中添加了图标,即headerRight: Icon 现在 onclick 框模式应该打开我该怎么做?框模式在另一个文件中。所以我不能在navigation.js中实现box modal 那我应该怎么连接呢?
    • 由于按钮位于导航器中,因此您需要添加一个处理程序,以便用户单击按钮时通知您模态变为可见。他们不能直接通信,所以我想你可以通过你的全局状态来做到这一点。虽然它可以工作,但我认为这不是最好的解决方案。这个github.com/react-navigation/react-navigation/issues/… 提供了一种不同的方法。
    • 所以你是说我应该为框模式创建单独的屏幕,然后我必须使用 stacknavigator 连接它是否正确?
    • 这是 GitHub 上建议的选项。但是我要做的是当用户按下导航器上的按钮时让模态变为可见/不可见。
    • 那么如果我按照您的方法,那么我将如何在标题导航中添加该图标?是否可以从两个不同的文件添加连接图标和模式?
    猜你喜欢
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2019-06-13
    • 2021-08-28
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多