Я работаю над рецептом приложения. Я использую 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);
Вам нужно использовать данные для каждого рецепта внутри некоторого 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);
this.props.recipes.matches
является первым массивом. Из приведенных вами примеров данных я предположил, что они будут существовать всегда. Вам нужно будет обработать изгибы ваших данных, но вы можете использовать этот подход для визуализации массива объектов.
recipeData.matches
?<td>{JSON.stringify(recipeData.matches)}</td>
.