Функция React Native call из навигации

Я использую нативную навигацию 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: undefined не является объектом (оценка '_class.login.bind')"

Когда я использую onPress = {this.login} никакой реакции.

Когда я использую onPress = {this.login()} получаю ошибку

TypeError: TypeError: _class.login не является функцией.

Но

Я использую onPress = {() => alert('test')} работает.

Попробуйте удалить static

Maheer Ali 15.03.2019 07:08

Тогда navigationOptions не работает.

Gündoğdu Yakıcı 15.03.2019 07:10

у вас никогда не будет контекста this внутри функции static, если вы не передадите его явно

warl0ck 15.03.2019 07:12

Это ошибка или ошибка реактивной нативной навигации.

Gündoğdu Yakıcı 15.03.2019 07:13

кстати куда ты звонишь navigationOptions

Maheer Ali 15.03.2019 07:14

вот как работает любое статическое ключевое слово на любом языке, если вы можете сказать, где именно вы вызываете эту функцию, возможно, я смогу чем-то помочь

warl0ck 15.03.2019 07:14

Как мне найти здесь функцию? Это необходимо.

Gündoğdu Yakıcı 15.03.2019 07:15

@ warl0ck Это говорит код выше.

Gündoğdu Yakıcı 15.03.2019 07:16

Я имел в виду, где вы вызываете эту функцию navigationOptions?

warl0ck 15.03.2019 07:16

Нет, я не могу вызвать

Gündoğdu Yakıcı 15.03.2019 07:16

что вы хотите сделать в этой функции? @Dodiş, если вы хотите перенаправить на любой экран, вы можете напрямую использовать параметры навигации.

Patel Dhara 15.03.2019 07:17

В чем польза и назначение navigationOptions куда вы его называете и расскажите почему без него нельзя static

Maheer Ali 15.03.2019 07:17

@PatelDhara Нет. Я проверю токен. Затем процесс выхода.

Gündoğdu Yakıcı 15.03.2019 07:18

Я думаю, вы используете «реагирующую навигацию», а не «реагирующую нативную навигацию». И если это так, то здесь уже есть ответ на этот тип вопроса: stackoverflow.com/questions/54058740/…

Ankit Makwana 15.03.2019 07:20

Вы правы Спасибо. @АнкитМаквана

Gündoğdu Yakıcı 15.03.2019 07:33

@Dodiş На самом деле это очень хорошо задокументировано на reactnavigation.org/docs/en/….

Ankit Makwana 15.03.2019 07:39

@AnkitMakwana Да, мне нужно читать внимательнее. Ты прав. Спасибо.

Gündoğdu Yakıcı 15.03.2019 07:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
17
8 968
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

navigationOptions должен быть статическим, потому что это один экземпляр для всего компонента, и вы пытаетесь получить доступ к «методу экземпляра» ((this.login)) из статического поля... и это не сработает...

насколько я понимаю, вы пытаетесь создать «CustomHeader», поэтому я предлагаю:

  • вы создаете отдельный компонент для своего пользовательского заголовка и передаете этот метод входа в качестве реквизита.
  • Отключите заголовок по умолчанию, добавив заголовок: null в navigationOptions.
  • Визуализируйте этот пользовательский компонент заголовка вручную.

  • Чтобы отключить заголовок по умолчанию:

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

    createStackNavigator(RouteConfigs, NavigatorConfig);

  • создать собственный заголовок:

    const MyCustomHeader = ({навигация, вход в систему}) => { вернуть (); };

    • Визуализируйте этот настраиваемый заголовок вручную на всех экранах, на которых он должен быть.

Нет, у меня есть собственный заголовок. Я пытаюсь вызвать функции в пользовательском заголовке.

Gündoğdu Yakıcı 15.03.2019 07:20
Ответ принят как подходящий

вы можете добиться этого, используя 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(
          .....
        )
    }
}

вы можете рассмотреть эту тему stackoverflow.com/questions/57725635/… и сказать мне, что я делаю неправильно!

Ali Yar Khan 02.09.2019 10:09

Другие вопросы по теме