从导航反应本机调用功能

时间:2019-03-15 06:02:04

标签: javascript react-native react-native-navigation

我正在使用React本机导航。 (堆栈导航)。 但是我不能在navigationOptions中调用函数。无法正常工作。

import React, { Component } from 'react';
import { StyleSheet, View, Text, TouchableHighlight, AsyncStorage, Alert } from 'react-native';
import { Button } from 'react-native-elements';
import Icon from 'react-native-vector-icons/FontAwesome';
import HandleBack from '../../HandleBack';

export default class Dashboard extends Component {
    constructor(props) {
        super(props);
    }

    static navigationOptions = ({ navigation }) => {
        return {
            title: 'Dasboard',
            headerLeft: null,
            headerRight: (
                <TouchableHighlight underlayColor='transparent' onPress={this.login.bind(this)} style={{marginRight: 10}}>
                    <Icon
                        name="power-off"
                        size={25}
                        color="white"
                    />
                </TouchableHighlight>
            )
        };
    };

    login() {
        alert('Button clicked!');
    }

    onBack = () => {
        this.props.navigation.navigate('Screen3');
    };    

    render() {        
        return(
            <HandleBack onBack={ this.onBack }>
                <View>
                    <Text> This is screen 2 </Text>
                    <TouchableHighlight onPress={() => this.props.navigation.navigate('Screen3')}> 
                        <Text> Go to Screen 3 </Text>
                    </TouchableHighlight>
                </View>
            </HandleBack>
        )
    }
}

当我使用onPress={this.login.bind(this)}时出现错误

“ TypeError:TypeError:未定义不是对象(评估'_class.login.bind')”“

当我使用onPress={this.login}时没有反应。

当我使用onPress={this.login()}时遇到错误

TypeError:TypeError:_class.login不是函数。

但是

我正在使用onPress={() => alert('test')}

2 个答案:

答案 0 :(得分:2)

您可以使用setParams或getParams进行反应导航来实现它。

export default class Dashboard extends Component {


    static navigationOptions = ({ navigation }) => {
        return {
            title: 'Dasboard',
            headerLeft: null,
            headerRight: (
                <TouchableHighlight underlayColor='transparent' 
                 onPress={navigation.getParam('login')} //call that function in onPress using getParam which we already set in componentDidMount
                   style={{marginRight: 10}}>
                    <Icon
                        name="power-off"
                        size={25}
                        color="white"
                    />
                </TouchableHighlight>
            )
        };
    };
   login() {
        alert('login click')
    }
    onBack = () => {
        this.props.navigation.navigate('Screen3');
    };    

componentDidMount() {
        this.props.navigation.setParams({ login: this.login }); //initialize your function
    }
    render() {        
        return(
          .....
        )
    }
}

答案 1 :(得分:0)

navigationOptions必须是静态的,因为它是每个整个组件一个实例,并且您试图从静态字段中访问“实例方法”((this.login))...这将无法工作...

据我了解,您正在尝试创建“ CustomHeader”,所以我建议:

  • 您为自定义标头创建一个单独的组件,并将此“ login”方法作为道具传递。
  • 通过填充标头禁用默认标头:navigationOptions为null。
  • 手动呈现此自定义Header组件。

  • 要禁用默认标题,请执行以下操作:

     const NavigatorConfig = {
      navigationOptions: {
        header: null,
      },
    };
    

    createStackNavigator(RouteConfigs,NavigatorConfig);

  • 创建自定义标题:

    const MyCustomHeader =({导航,登录})=> {       return();    };

    • 在所有应具有此自定义标题的屏幕中手动呈现它。