【问题标题】:Fetch API Console data on webpage using axios使用 axios 在网页上获取 API 控制台数据
【发布时间】:2021-11-14 16:43:22
【问题描述】:

我创建了一个简单的日期选择器 react js,然后我在控制台中调用 API 并从 API 获取一些数据,现在我想在网页上获取 API 数据。

这是我用来调用 API 函数的代码,我想要在网页上映射响应数据

import React, { Component } from 'react'
import axios from 'axios'

class PostForm extends Component {
    constructor(props) {
        super(props)

        this.state = {
            key: '',

            
        }
        console.log(this.state)
    }

    changeHandler = e => {
        this.setState({ [e.target.name]: e.target.value })
    }

    submitHandler = e => {
        e.preventDefault()
        
        axios
        .get(`http://127.0.0.1:8000/hvals_hash?key=${this.state.key}`)
        .then(response => {
            console.log(response.data)
        })
        .catch(error => {
            console.log(error)
        })
    }

    render() {
        const { key } = this.state
        
        return (
            <center><div>
                <form onSubmit={this.submitHandler}>
                    <div>
                        <h2> DATE PICKER</h2><br></br>
                        <input
                            type="text"
                            name="key"
                            value={key}
                            onChange={this.changeHandler}
                        />
                        
                    </div>
                    <br></br>
                    <button type="submit">Submit</button>
                </form>
        
            </div></center>
        )
    }
}
export default PostForm

【问题讨论】:

  • 您好,为了让社区更了解您的问题并帮助您,请同时提供您创建的代码。
  • 在 react js 中使用 axios 进行 API 调用

标签: javascript python reactjs date-range


【解决方案1】:

这里是这个问题的解释,你可以参考这里,

import React, { Component } from 'react'
import axios from 'axios'

class PostForm extends Component {
    constructor(props) {
        super(props)

        this.state = {
            key: '',
            // Where data will be saved.
            data: [],
        }
        console.log(this.state)
    }

    changeHandler = e => {
        this.setState({ [e.target.name]: e.target.value })
    }

    submitHandler = e => {
        e.preventDefault()
        
        axios
        .get(`http://127.0.0.1:8000/hvals_hash?key=${this.state.key}`)
        .then(response => {
                        // Updating the state to trigger a re-render       
            this.setState({data: response.data});
            console.log(response.data)
        })
        .catch(error => {
            console.log(error)
        })
    }

    render() {
        const { key } = this.state
        
        return (
            <center><div>
                <form onSubmit={this.submitHandler}>
                    <div>
                        <h2> DATE PICKER</h2><br></br>
                        <input
                            type="text"
                            name="key"
                            value={key}
                            onChange={this.changeHandler}
                        />
                        
                    </div>
                    <br></br>
                    <button type="submit">Submit</button>
                </form>
            <div>
{this.state.data.map((dataObjectToDisplay) => {
    return (
    <div>
        {
            <ol>{this.state.data}</ol>
        }
    </div>
    );
})}
</div>
    
            </div></center>
        )
    }
}
export default PostForm

添加状态(向this.state添加对象属性)并在提交处理程序内部,在Axios中获取响应后,使用setState({[状态名称]: response.data })。

它负责更新状态。至于在哪里展示,就看你自己了。

您可以在渲染方法内的任何位置复制代码。如果你想在表单下显示,请将其粘贴到表单后的 div 容器中。

为了更好地控制状态,您可以检查其中一种状态管理工具,例如 redux,或者简单地使用全局上下文并使用 react-router 实现路由 -

感谢@MrCeRaYA

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

首先,您必须将数据保存在应用内的某个位置。创建一个状态并使用 setState 来更新它。现在您有了最新的数据,您可以使用 JSX 的魔力使用 map 显示它们。 示例:

<div>
  {this.state.data.map((dataObjectToDisplay) => {
    return (
      <div>
        {/* Include your data in a way you want here, you can also replace the div with any other element (li) */}
      </div>
    );
  })}
</div>

【讨论】:

  • @HariprasathLakshmanan 添加状态(向this.state添加对象属性)并在submitHandler内部,在axios中获得响应后,使用setState({[name of state]: response.data })。这负责更新状态。至于在哪里显示它们,由您决定。您可以在渲染方法内的任何位置复制代码。如果您想在表单下显示它,请将其粘贴到div 容器中form 之后。为了更好地控制状态,您可以检查其中一种状态管理工具,例如 redux 或简单地使用全局上下文并使用 react-router 实现路由
  • @HariprasathLakshmanan 代码示例:jsfiddle.net/78oaybhv/1
  • @HariprasathLakshmanan 我们使用的map 函数已经依赖于响应数据是一个数组这一事实。该函数循环遍历数组,因此您可以使用操作数组并返回一个新数组(这将是一个元素数组)。在您的情况下,它将是一系列视频。如果我们将数组元素命名为videoURL,那么map函数如下:{this.state.data.map((videoURL) =&gt; &lt;video src={videoURL}&gt;&lt;/video&gt;)}
  • @HariprasathLakshmanan 你能解释一下这个问题吗?你的意思是你想删除http://localhost:3000 部分吗?
  • 如果一个数组元素重复,你应该检查后端。如果您的意思是要渲染具有n * n 个元素的数据,只需使用相同的方法,添加一个新状态,更新它并通过数组映射。
【解决方案3】:
<div>
  {this.state.data.map((dataObjectToDisplay) => {
    return (
      <div>
        {/* Include your data in a way you want here, you can also replace the div with any other element (li) */}
      </div>
    );
  })}
</div>

【讨论】:

  • 你真的只是复制了@MrCeRaYA 在你之前 25 分钟给出的答案吗?这是大胆的。
猜你喜欢
  • 2021-11-25
  • 2020-12-14
  • 2020-09-12
  • 2018-09-09
  • 2019-10-17
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多