Arhn - архитектура программирования

Компонент React не будет отображать новое состояние даже после повторной визуализации

В основном у меня проблема, когда реагирующий компонент не отображает массив, исходящий из его состояния. Состояние действительно содержит массив, который я хочу, и метод рендеринга вызывается снова, когда массив var заполнен, но ничего не отображается.

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

import React, { Component } from 'react';
import { withAuthorization } from '../Session';
import { withFirebase } from '../Firebase'; //
import 'firebase/firestore';

const Home = () => (
  <div>
    <h1>Home Page</h1>
    <p>Signed in users only</p>
    <hr />

    <h1>Available Scopes</h1>
    <ScopeRender />

  </div>
);


class ScopeRenderBase extends Component {

    constructor(props) {
        super(props);
        this.state = {
            scopes: []
        }
        //this.componentDidMount = this.componentDidMount.bind(this);
    }

    async componentDidMount() {
        await this.getScopes();
        //console.log(this.state.scopes);
    }

    componentDidUpdate() {
        //console.log(this.state.scopes);
    }

    getScopes() {
        let tempScopes = [];
        this.props.firebase.db.collection("scopes").where("status", "==", 1).get()
            .then( (querySnapshot) => {
                querySnapshot.forEach(function(doc) {
                    tempScopes.push(doc.data().address);
                })
            })
            .catch(function(error) {
                console.log("Error getting documents: ", error);
            });

        //console.log(tempScopes);
        this.setState({ 
            scopes: tempScopes
        });
    }

    render() {
        const displayPosts = this.state.scopes.map((scope, index) =>
            <li key={index}>{scope}</li>
        );
        console.log(this.state.scopes);
        return(
            <div>
                <div>{this.state.scopes}</div>
                <ul>{displayPosts}</ul>
            </div>
        );
    }

}

const ScopeRender = withFirebase(ScopeRenderBase);

const condition = authUser => !!authUser;

export default withAuthorization(condition)(Home);
export { ScopeRender };

С помощью этого кода состояние содержит данные (области), которые я хочу получить после вызова функции getScopes (), но метод рендеринга не отображает данные.

Если я предварительно заполню данные фиктивными символами и закомментирую getScopes () в componentDidMount (), как показано ниже, и сохраню все остальное без изменений, фиктивные символы будут отображаться нормально.

class ScopeRenderBase extends Component {

    constructor(props) {
        super(props);
        this.state = {
            scopes: ['a','b','c']
        }
        //this.componentDidMount = this.componentDidMount.bind(this);
    }

    async componentDidMount() {
        //await this.getScopes();
        //console.log(this.state.scopes);
    }

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

21.10.2019

Ответы:


1

Внутри getScopes вы заполняете tempScopes then обещания, которое выполняется асинхронно. Но под ним вы также немедленно вызываете setState, что означает, что в то время, когда вы вызываете setState, массив tempScopes все еще пуст. Вы должны переместить вызов в setState также внутри then. Что-то вроде этого:

       .then((querySnapshot) => {
            querySnapshot.forEach(function(doc) {
                tempScopes.push(doc.data().address);
            })
            this.setState({scopes:tempScopes});
        })
21.10.2019

2

Как обычно, ответ пришел ко мне сразу после публикации. Я думаю, что проблемы возникли из-за привязки this к функции getScopes. Этот код устранил проблему.

getScopes() {
    let tempScopes = [];
    this.props.firebase.db.collection("scopes").where("status", "==", 1).get()
        .then( (querySnapshot) => (
            querySnapshot.forEach( (doc) => (
                this.setState((prevState) => ({
                    scopes: [ ...this.state.scopes, doc.data().address ]
                }))
            ))
        ))
        .catch(function(error) {
            console.log("Error getting documents: ", error);
        });
}
21.10.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..