React / Redux: Нужна помощь в отображении ответа API

2

Я работаю над рецептом приложения. Я использую Yummly API. Я получаю ответ, но я смущен тем, как отображать данные, возвращаемые из API, потому что ответ представляет собой объект с массивом рецептов. Когда я пытаюсь отобразить массив, я получаю эту ошибку:

Неисправность (в обещании) Ошибка: объекты недействительны в качестве дочернего элемента React (найдены: объект с ключами {imageUrlsBySize, sourceDisplayName, ингредиенты, id, smallImageUrls, recipeName, totalTimeInSeconds, атрибуты, вкусы, рейтинг}). Если вы хотите отобразить коллекцию детей, используйте вместо этого массив.

Ссылка на образ того, как выглядит ответ API:

Объект из API "Матчи" - это часть, которую я хочу отобразить в моем компоненте

Action.js

import Axios from 'axios';
import {LOOK_UP_RECIPE'enter code here'} from './types';

 const API_ID = '########';
 const API_KEY = '######';
 const ROOT_LOOK_UP_URL = 'http://api.yummly.com/v1/api/recipes? 
 _app_id=${API_ID}&_app_key=${API_KEY}'


export function lookuprecipesYummly(ingredients) {
 const yummlyurl ='${ROOT_LOOK_UP_URL}&q=${ingredients}'; 
 const request = Axios.get(yummlyurl);

return {
    type: LOOK_UP_RECIPE,
    payload: request
};
}

Reducer.js

import { LOOK_UP_RECIPE } from '../actions/types'
export default function(state = [], action) {
 console.log(action)
 switch (action.type){
    case LOOK_UP_RECIPE:
        return [ action.payload.data, ...state ];
 default:
    return state;
 }
}

Компонент:

    import _ from "lodash";
    import React, {Component} from 'react';
    import { connect } from 'react-redux';

class RecipeList extends Component {

 renderRecipe(recipeData) {
    return (
        <tr key={0}>
            <td key={1}>{recipeData.matches}</td>
        </tr>
    )
}

render() {

    return(
        <table>
            <thead>
                <tr key={1}>
                    <th>Recipe</th>
                </tr>
            </thead>
            <tbody>
                {this.props.recipes.map(this.renderRecipe)}
            </tbody>
        </table>
    )
}
}


function mapStateToProps({recipes}) {
   return {
       recipes
      }
};


export default connect(mapStateToProps)(RecipeList);

Изображение 26672

  • 0
    Вам нужно сделать несколько JSX. Прямо сейчас вы просто возвращаете массив объектов. Реакт не знает, что с этим делать. Можете ли вы опубликовать то, что находится внутри одного из объектов recipeData.matches ?
  • 0
    Чтобы просто выложить данные в виде строки, вы можете выполнить <td>{JSON.stringify(recipeData.matches)}</td> .
Показать ещё 4 комментария
Теги:
redux

1 ответ

0
Лучший ответ

Вам нужно использовать данные для каждого рецепта внутри некоторого JSX. Вот пример того, как заполнить строку таблицы:

import _ from "lodash";
import React, {Component} from 'react';
import { connect } from 'react-redux';

class RecipeList extends Component {

    renderRecipe(recipe) {
        return (
            <tr key={recipe.id}>
                <td>{recipe.recipeName}</td>
                <td>{recipe.rating}</td>
                <td>{recipe.attributes.course[0]}</td>
                <td>{recipe.ingredients.join(', ')}</td>
            </tr>
        )
    }

    render() {

        return(
            <table>
                <thead>
                    <tr>
                        <th>Recipe</th>
                        <th>Rating</th>
                        <th>Course</th>
                        <th>Ingredients</th>
                    </tr>
                </thead>
                <tbody>
                    {this.props.recipes.matches.map(this.renderRecipe)}
                </tbody>
            </table>
        )
    }
}


function mapStateToProps({recipes}) {
    return { recipes }
};


export default connect(mapStateToProps)(RecipeList);
  • 0
    Спасибо за помощь, действительно ценю это. Но когда я попробовал это, я получаю ошибку: TypeError: Невозможно прочитать свойство 'map' из неопределенного. Я не понимаю почему, я новичок в React
  • 0
    Вам необходимо добавить проверку, чтобы убедиться, что this.props.recipes.matches является первым массивом. Из приведенных вами примеров данных я предположил, что они будут существовать всегда. Вам нужно будет обработать изгибы ваших данных, но вы можете использовать этот подход для визуализации массива объектов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню