React Native / Javascript - не удается обновить представление после функции асинхронной выборки. Неверный порядок исполнения

приведенный ниже код вызовет fetch () для получения некоторых данных, и только после получения он отобразит один вывод. Но при этом всегда не удается обновить представление после асинхронного вызова. Я новичок в этом реагировании на родные асинхронные вызовы, поэтому я хотел бы получить некоторую помощь в этом. Вот необходимые части кода.

import React from 'react'
import {StyleSheet, View, ScrollView, Alert} from 'react-native';
import {Card, Button, Text} from 'react-native-elements';
import {TextField} from 'react-native-material-textfield';

class MyScreen extends React.Component {
    static navigationOptions = ({navigation}) => ({
        title: 'Title'
    });

    constructor(props) {
        super(props);

        const {navigation} = this.props;

        this.state = {
            loaded: false
        };
    }

    async componentWillMount() {
        let responseJson = await this.fetchData().done();
        console.info(responseJson);

        console.info('componentWillMount finished');
    }

    fetchData = async () => {
        const response = await fetch('myurl/' + GLOBAL.account_data.account.emp_number, {
            method: 'GET',
            headers: new Headers({
                'Authorization': 'Bearer ' + GLOBAL.access_token,
                'Content-Type': 'application/json'
            })
        });

        return await response.json();
    };

    render() {
        let view;
        console.info('in render');


        if (this.state.loaded) {
            view = <Text>Vikasitha</Text>
        } else {
            view = <Text>Buddhi</Text>
        }

        return (
            view
        )
    }
}

const styles = StyleSheet.create({
    card_info: {
        flex: 1,
        height: 10
    },
    card_leave: {
        flex: 2,
        height: 30
    }
});

export default MyInfoPersonalDetailsScreen;

Журнал консоли печатается в следующем порядке.

console.info('in render')
console.info(responseJson) //prints undefined
console.info('componentWillMount finished')

Но если функции await и async синхронизируются правильно, это должно быть в порядке,

console.info(responseJson)
console.info('componentWillMount finished')
console.info('in render')
  • Это? (это из моего понимания.)
  • Правильное использование componentWillMount? (используется componentWillMount, потому что он должен выполняться перед рендерингом. В отличие от componentDidMount)

Я просто хочу, чтобы поток был в правильном порядке. Речь идет о порядке выполнения, когда используются конструктор, componentWillMount и render. Не беспокойтесь о неиспользуемых переменных и недостающих частях.

Любая помощь приветствуется !!

прочтите базовое руководство по fetch / setState

xadm 20.08.2018 10:56

Я пытался добавить, что прошел через них, используя такое событие, как нажатие кнопки, поведение может быть достигнуто, но проблема в том, что при использовании с componentWillMount порядок выполнения неясен.

buddhiv 20.08.2018 11:00

где ты нашел async componentWillMount ??

xadm 20.08.2018 11:02

Не помню, но таких как medium.com/front-end-hacking/… много. Я также не знаю, является ли это лучшей практикой, пока я не пойму это правильно.

buddhiv 20.08.2018 11:07

ИМХО это выглядит немного странно, не популярно ... попробуйте версию из комментариев с initialize = async () - это более стандартный способ ... но я бы не стал использовать await asyncSetState - он ничего не делает - setState уже асинхронен, netActivity можно установить с помощью o ожидание тоже (данные получены / декодированы). только: const {ip} = await res.json() setState({ipAddress: ip}) StatusBar.setNetworkActivityIndicatorVisible(false)

xadm 20.08.2018 11:28

Не понял. Как это помогает правильно оформить порядок исполнения? Я уже жду ответа. Json ()

buddhiv 20.08.2018 11:35

не возвращайте его, setState

xadm 20.08.2018 11:37

изучить стандартный поток fetch() / .then / setState

xadm 20.08.2018 11:45

Я понял это. Я рассматривал это состояние реакции угловатым образом. Похоже, что функция рендеринга снова запускается после каждого вызова this.setState. вызов this.state.variable_name так не работает. Спасибо xadm.

buddhiv 20.08.2018 12:08

обучающие программы для этих знаний;)

xadm 20.08.2018 12:12
Поведение ключевого слова "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) для оценки ваших знаний,...
0
10
425
1

Ответы 1

  componentDidMount() {
    // just call async function in didMount
      this.fetchData();
    }

    fetchData = async () => {
        const response = await fetch('myurl/' + GLOBAL.account_data.account.emp_number, {
            method: 'GET',
            headers: new Headers({
                'Authorization': 'Bearer ' + GLOBAL.access_token,
                'Content-Type': 'application/json'
            })
        });

        let result =  await response.json();
        console.info(result);
        console.info(responseJson);
        console.info('componentWillMount finished');
        // update your state here
         this.setState({result});
    };

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