Nano Hash - криптовалюты, майнинг, программирование

React-redux: перебор реквизитов и заполнение компонентов

У меня есть подключенный компонент React под названием Dashboard, который должен быть заполнен компонентами Plot. Эти компоненты должны создаваться путем сопоставления массива объектов JSON, извлекаться и помещаться в состояние с помощью вызова API, а затем сопоставляться с реквизитами с помощью функции mapStateToProps().

Вызов API работает. mapStateToProps также работает. Однако моя попытка сопоставить массив объектов Plot JSON в реквизитах и ​​создать компонент Plot из каждого из них не удалась со следующей ошибкой: Не удается прочитать карту свойства undefined

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

Мой компонент сюжета:

import React from 'react';

const Plot = ({ props }) => {
    return (
        <div className="media">
            <div className="media-left">
                <a href="#">
                    <img className="media-object" src="http://placehold.it/200/550" alt="Placehold" />
                </a>
            </div>
            <div className="media-body">
                <h4 className="media-heading">{props.name}</h4>
                <ul>
                    <li><strong>Grower: </strong> {props.grower}</li>
                    <li><strong>Region: </strong> {props.region}</li>
                    <li><strong>Current State: </strong> {props.currentState}</li>
                    <li><strong>Next State: </strong> {props.nextState}</li>
                    <li><strong>Days To Next State: </strong> {props.daysToNext}</li>
                    <br />
                    <span class="pull-right">
                        <i id="like1" class="glyphicon glyphicon-thumbs-up"></i> <div id="like1-bs3"></div>
                        <i id="dislike1" class="glyphicon glyphicon-thumbs-down"></i> <div id="dislike1-bs3"></div>
                    </span>
                </ul>
            </div>
        </div>
    );
};

export default Plot;

Компонент «Моя панель инструментов»:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import * as actions from '../actions';
import Plot from './plot';

class Dashboard extends Component {
    componentWillMount() {
        this.props.fetchMessage();
        this.props.fetchPlots();
    }

    render() {
        const plots = this.props.plots;
        return (
            <div>
                <span>{this.props.message}</span>
                <div className='container'>
                    {plots.map((plot) => <Plot name={plot.name} grower={plot.grower} region={plot.region} currentState={plot.currentState} nextState={plot.nextState} daysToNext={plot.daysToNext}/>)}
                </div>
            </div>
        );
    }
}

function mapStateToProps(state)
{
    return {
        message: state.auth.message,
        plots: state.auth.plots
    }
}

export default connect(mapStateToProps, actions)(Dashboard);

Ответы:


1
{plots && plots.map((plot) => 
    <Plot 
        name={plot.name} 
        grower={plot.grower} 
        region={plot.region} 
        currentState={plot.currentState} 
        nextState={plot.nextState} 
        daysToNext={plot.daysToNext}
    />
)}

Просто добавьте нулевую проверку перед функцией карты, чтобы она выполнялась, только если у нее есть данные.

26.09.2017
  • Работает отлично. К сожалению, с моим компонентом Plot что-то не так - я получаю следующее: Uncaught (in promise) TypeError: Cannot read property 'name' of undefined. Что бы это могло быть? Обычно эта ошибка возникает, когда вы импортируете класс с помощью фигурных скобок, который был экспортирован по умолчанию, но здесь это не так. Любые идеи? 26.09.2017
  • проверьте свои данные один раз. эта ошибка возникает из-за того, что {plot.name} проверяет, существует ли имя в сюжете 26.09.2017
  • Это действительно так. 26.09.2017
  • дважды проверьте, являются ли графики массивом, затем выполните его итерацию, а затем проверьте, существует ли имя. 26.09.2017
  • Plots — это массивоподобный объект. Когда я использую Array.from(plots) и выполняю итерацию, я вижу, что у каждого компонента есть свойство имени. Но когда я пытаюсь сопоставить этот массив, я все равно получаю ту же ошибку. 26.09.2017
  • можете ли вы поделиться массивом объекта один раз 26.09.2017
  • Давайте продолжим обсуждение в чате. 26.09.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

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