【问题标题】:Understanding React.JS JSON feed and how to parse了解 React.JS JSON 提要以及如何解析
【发布时间】:2019-01-09 02:12:35
【问题描述】:

我有以下代码,它从 API 循环访问 JSON 文件并循环访问一些帖子。

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
//https://alligator.io/react/axios-react/
import axios from 'axios';

export default class PostList extends React.Component {
  state = {
    posts: []
  }

  componentDidMount() {
    axios.get(`https://jsonplaceholder.typicode.com/users`)
      .then(res => {
        const posts = res.data;
        this.setState({ posts });
      })
  }

  render() {
    return (
      <div className="App">
          <header className="App-header">
            <img src={logo} className="App-logo" alt="logo" />
            <h1 className="App-title">Welcome to React</h1>
          </header>
          <p className="App-intro">
           Pulls in post slugs from Domain
          </p>

          <ul>
            { this.state.posts.map(post => <li>{post.name} - {post.username} </li>)}
          </ul>
      </div>
    )
  }
}

这工作正常,并获得所需的信息。

现在,在我的测试 JSON 文件中,格式如下: https://jsonplaceholder.typicode.com/users

但在我来自 WordPress Rest API 的实际 JSON 文件中,我们还有另一个项目,名为 core_layout: JSON image

我的问题是,尝试使用相同的代码(例如 {post.name})无法获得所需的信息,例如 core_layout->image->name。

有没有简单的方法解决这个问题?

谢谢大家!

编辑:

尝试了下面的答案,但仍然没有运气,得到错误 TypeError: Cannot read property 'map' of undefined:

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
//https://alligator.io/react/axios-react/
import axios from 'axios';

export default class PostList extends React.Component {
  state = {
    posts: [],
    coreLayout: {}
  }

  componentDidMount() {
    axios.get(`https://jsonplaceholder.typicode.com/users`)
      .then(res => {
        // const posts = res.data;
        //this.setState({ posts });
        const { posts, core_layout: coreLayout } = res.data;
        this.setState({ posts, coreLayout });
      })
  }

  render() {
    return (
      <div className="App">
          <header className="App-header">
            <img src={logo} className="App-logo" alt="logo" />
            <h1 className="App-title">Welcome to React</h1>
          </header>
          <p className="App-intro">
           Pulls in post slugs from domain
          </p>

          <ul>
            { this.state.posts.map(post => <li>{post.name} - {post.core_layout.image.name}</li>)}
          </ul>
      </div>
    )
  }
}

编辑 2: 尝试了以下方法:这得到了标题,但又不是我需要的实际核心布局。

import React, { Component } from 'react';
class App extends Component {
  constructor() {
    super();
    this.state = {
      movies: []
    }
  }
componentDidMount() {
    let dataURL = "http://zinsseruk.com/wp-json/wp/v2/posts?per_page=1";
    fetch(dataURL)
      .then(res => res.json())
      .then(res => {
        this.setState({
          movies: res
        })
      })
  }
render() {
    let movies = this.state.movies.map((movie, index) => {
      return <div key={index}>
      <p><strong>Title:</strong> {movie.title.rendered}</p>
      <p><strong>Title:</strong> {movie.core_layout.acf_fc_layout}</p>
      </div>
    });
return (
      <div>
        <h2>Star Wars Movies</h2>
        {movies}
      </div>
    )
  }
}
export default App;

【问题讨论】:

  • 您想实现什么?使用其他 WP JSON api?
  • 目前,我正在获取帖子名称和用户名。我还希望能够从所附图片中获取信息

标签: json reactjs api loops


【解决方案1】:

const posts = res.data; 替换为const posts = res.data.core_layout;。然后你会得到一个类似于你在测试文件中的数组。

【讨论】:

  • 如果 core_layout 是该 API 端点的根属性,那么这似乎是正确的方法。
  • 那么在这种情况下,我会使用 {post.acf_fc_layout} 来获得这个吗?
  • const 帖子 = res.data.core_layout;和 { this.state.posts.map(post =>
  • {post.acf_fc_layout}
  • )} 给出:TypeError: Cannot read property 'map' of undefined
  • 您应该可以使用{ this.state.posts.map(post =&gt; &lt;li&gt;{post.name} - {post.username} &lt;/li&gt;)}。如果这不起作用,请在设置 const 帖子后执行 console.log(posts),并查看它是否与您的测试 json 相同。它需要是一个对象数组,其中每个对象都是一个帖子。
  • 但是我如何从 core_layout 获取信息?我会在这个前面加上前缀吗?
  • 【解决方案2】:

    我认为您需要了解从 API 收到的 JSON 结构。 core_layout 物业位于何处?在每个 post 属性中作为孩子?

    所以在帖子循环中您可以使用post.core_layout.image.name 作为图像名称,例如(以及其他属性)。

    如果core_property 位于您收到的数据的根目录,您可以将其加载到您的状态中,如下所示:

      state = {
        posts: [],
        coreLayout: {}
      }
    
      componentDidMount() {
        axios.get(`https://jsonplaceholder.typicode.com/users`)
          .then(res => {
            // This is equivalent of doing
            // const posts = res.data.posts
            // const coreLayout = res.data.core_layout
            const { posts, core_layout: coreLayout } = res.data;
            this.setState({ posts, coreLayout });
          })
      }
    

    然后通过使用本地组件状态在您的代码中使用它:

    render() {
      ...
      // For example image name:
      console.log('image name', this.state.coreLayout.image.name)
      ...
    }
    

    【讨论】:

    • TypeError: 无法读取未定义 PostList.render src/App.js:35 32 的属性“地图” 33 | 34 |
        > 35 | { this.state.posts.map(post =>
      • {post.title.rendered} - {post.slug}
      • )} 36 |
      37 |
      38 | )
  • 这是我添加时遇到的错误。我已经添加了您提供的确切代码,但似乎无法理解:(
  • 您分享的代码是请求“jsonplaceholder”,而不是 wordpress API。你能发布你的wordpress API返回的完整数据吗(真实API上的res.data对象,不是占位符,只是删除私人信息)。否则很难猜测:)
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签