【问题标题】:Rendering json data with axios使用 axios 渲染 json 数据
【发布时间】:2017-05-14 01:56:14
【问题描述】:

我正在尝试从 .json 文件中获取数据。页面上不显示任何内容。也许有人知道为什么?谢谢! 这是文件上的链接 https://s3-us-west-2.amazonaws.com/digicode-interview/Q1.json

import React from 'react';
import createReactClass from 'create-react-class';
import ReactDOM from 'react-dom';
import axios from 'axios';


class Data extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      array: []
    };
  }

  componentDidMount(){
    axios
      .get('https://crossorigin.me/https://s3-us-west-2.amazonaws.com/digicode-interview/Q1.json')
      .then(({ data })=> {
        this.setState({ 
          array: data.recipes.Ingredients
        });
      })
      .catch((err)=> {})
  }

  render() {
    const child = this.state.array.map((element, index) => {
      return <div key={index}>
        <p>{ element.data.name }</p>
      </div>
    });

    return <div><div>{ child }</div></div>;
  }
}

export default Data;

【问题讨论】:

  • dataresponse 属性允许您访问所需的内容。在您的情况下,您使用了data,因此它将显示为data.data.recipes.Ingredients。我建议使用({ response }),这样可以更准确地表示您要返回的内容。把它变成response.data.recipes.Ingredients
  • recipes 是数组,因此您无法访问像 data.recipes.Ingredients 这样的成分。应该是data.recipes[index].Ingredients
  • 谢谢大家。但屏幕仍然是空的。也许你有其他想法?

标签: json reactjs axios


【解决方案1】:

这是我对给出的练习的答案。我想分享这个,因为你已经试过了。可能有不同的方法来做到这一点。走自己的路。以下是我的做法。

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import axios from 'axios';
import _ from 'lodash';

class Data extends Component {
  constructor(props) {
   super(props);

   this.state = {
     array: []
   };

   this.renderRecipes = this.renderRecipes.bind(this);
 }

 componentDidMount(){
   axios
     .get('https://s3-us-west-2.amazonaws.com/digicode-interview/Q1.json')
     .then(({ data })=> {
       console.log(data);
       this.setState(
         { array: data.recipes }
       );
     })
     .catch((err)=> {})
 }

 render() {
   console.log(this.state.array);
   return(
     <div>
       <h3>Recipes</h3>
       <ul className="list-group">
          {this.renderRecipes()}
       </ul>
     </div>
   );
 }

 renderRecipes() {
   console.log(this.state.array);
   return _.map(this.state.array, recipe => {
     return (
       <li className="list-group-item" key={recipe.name}>
           {recipe.name}
           <ul className="list-group">
              Ingredients:
              {this.renderIngredients(recipe)}
           </ul>
       </li>
     );
   });
 }

 renderIngredients(recipe) {
    return _.map(recipe.Ingredients, ingredient => {
        return (
          <li className="list-group-item" key={ingredient.name}>
              <p>Name: {ingredient.name}, Amount: {ingredient.amount}</p>
          </li>
        );
    });
 }
}

export default Data;

【讨论】:

  • 非常感谢!
  • 你可以走得更远。只需使用一些链接组件列出收件人名称即可。单击后,您可以将用户带到一个详细页面,该页面包含所有配方信息,包括成分。你可以使用 React 路由器和 Link 来完成这件事。对这些主题进行一些研究并尝试一下。
  • 我会试试的!我从你身上学到了很多!再次感谢您!
  • 太棒了!保持学习。如果你真的热衷于学习 React 和 Redux,我想向你推荐这门课程。这是非常全面的初级课程,涵盖了大部分概念并很好地解释了它们。 udemy.com/react-redux/learn/v4
【解决方案2】:

这里我已经修好了。您已经更新了代码,所以我现在不记得最初的代码了。我认为问题出在您的渲染方法中。使用此代码,您可以在浏览器中列出所有配方名称。

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import axios from 'axios';
import _ from 'lodash';

class Data extends Component {
  constructor(props) {
   super(props);

   this.state = {
     array: []
   };

   this.renderRecipes = this.renderRecipes.bind(this);
 }

 componentDidMount(){
   axios
     .get('https://crossorigin.me/https://s3-us-west-2.amazonaws.com/digicode-interview/Q1.json')
     .then(({ data })=> {
       console.log(data);
       this.setState(
         { array: data.recipes }
       );
     })
     .catch((err)=> {})
 }

 render() {
   console.log(this.state.array);
   return(
     <div>
       <h3>Recipes</h3>
       <ul className="list-group">
          {this.renderRecipes()}
       </ul>
     </div>
   );
 }

 renderRecipes() {
   console.log(this.state.array);
   return _.map(this.state.array, recipe => {
     return (
       <li className="list-group-item" key={recipe.name}>
           {recipe.name}
       </li>
     );
   });
 }
}

export default Data;

我想给你留一个练习。

锻炼 更改此代码,以便您可以列出每个食谱的所有成分。在这里,我列出了所有的食谱名称。您只需为每个食谱添加成分并将它们放在一起。这将帮助您提高您在 React 领域的知识。

希望这会有所帮助。快乐编码!

【讨论】:

  • 非常感谢!那很完美!我希望我能完成你的练习!
  • 如果它解决了您的上述问题,您能否将其标记为答案。这可能对稍后阅读此主题的人有所帮助。确保您将来也对您在堆栈溢出中发布的问题执行相同的操作。您可以投票、反对或将其标记为答案,具体取决于它对解决您最初的问题的帮助程度。无论如何,我很高兴你在练习中工作。让我了解进度。
  • 当然!我添加了另一个数组对象 - 数组:data.recipes[0].Ingredients 并写了这个:renderRecipes() { return _.map(this.state.array, index => { return (
  • {index.name}

    {index.amount}

  • ); }); } 我认为应该是更简单的方法。
猜你喜欢
相关资源
最近更新 更多
热门标签