Как отображать асинхронные данные в React + Firestore?

Я учусь реагировать без redux, mobx или каких-либо других библиотек. Причина, по которой я не использую redux и так далее, заключается в том, что кто-то сказал мне, что важно научиться реагировать перед использованием библиотек. Я пытаюсь получить данные из firestore и визуализировать их, но из-за асинхронности я застрял на визуализации данных. Я не могу выполнить рендеринг, потому что не получаю данные при рендеринге.

Моя версия реакции - 16, и я тренируюсь реагировать с помощью firestore. Вот мой код.

Я буду признателен вам за любой ваш совет. Спасибо.


CategoryButtonSet.js

import React from 'react';
import CategoryButton from './CategoryButton';
import {test} from '../shared/Firebase';

export default class CategoryButtonSet extends React.Component {
categories = [];

componentDidMount() {
    test().then((querySnapshot) => {
        querySnapshot.forEach((doc) => {
            this.categories.push(doc.id).bind(this);
        });
    });
}

render() {
    if (this.categories.length !== 0) {
        console.info(this.categories);
        return (
            <div className = "category-block">
                This block is for the category button set.
                {
                    this.categories.map(category => <CategoryButton key = {category} name = {category}/>)
                }
            </div>
        );
    } else {
        return <div>Loading...</div>;
      }
    }  
}

CategoryButton.js

import React from 'react';

export default (props) => {
    return (
        <div className = "category-block__button">
            Here's the category button.
            <button>{props.name}</button>
        </div>
    );
}
Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
1 417
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы извлекаете данные, но не устанавливаете свое состояние, у вас вообще нет состояния. Вот почему ваш компонент не перерисовывается после получения данных. Может быть, один подход может быть таким (могут быть способы получше):

export default class CategoryButtonSet extends React.Component {

    state = {
        categories: [],
    };

componentDidMount() {
    test()
       .then( querySnapshot => querySnapshot.map( doc => doc.id ) )
       .then( data => this.setState( { categories: data } ));
}

render() {
    if (this.state.categories.length) {
        console.info(this.state.categories);
        return (
            <div className = "category-block">
                This block is for the category button set.
                {
                    this.state.categories.map(category => <CategoryButton key = {category} name = {category}/>)
                }
            </div>
        );
    } else {
        return <div>Loading...</div>;
      }
    }  
}

О, я думал, что использование «состояния» - это способ редукции, и думал иначе. Спасибо попробую

Mingyu Jeon 15.05.2018 02:13

О, тогда посмотрите документацию React еще раз и очень внимательно :) "State" занимает в React огромное место.

devserkan 15.05.2018 02:15

Взгляните на Firestorter, если он существует именно для этой цели, и вам не нужно создавать хранилище redux или что-то еще.

https://github.com/IjzerenHein/firestorter

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