[Web 前端] 如何在React中做Ajax 请求?
cp from : https://segmentfault.com/a/1190000007564792
如何在React中做Ajax 请求?
首先:React本身没有独有的获取数据的方式。实际上,就React而言,它甚至不知道有服务器画面的存在。
React只是简单地渲染组件,单独从两个地方获取数据:props 和 state。
因此,为了使用服务器的数据,你需要在你的组件(component)的props或state里拿到数据。
你可以将这个过程与服务和数据模型复杂化,就像你所希望的那样,但最终只是组件渲染props和state。
选择一个HTTP 库
为了获取来自服务器的数据,你需要一个HTTP库,网上有很多,最终他们都做同样的事情,但他们有不同的特点。
喜欢
Promise?那就选axios吧:https://github.com/mzabriskie...讨厌
Promise?,但是喜欢callback?不妨看看superagent?https://github.com/visionmedi...
当然,你也可以选择自己封装一个ajax库,我喜欢Axios,下面将以这个库作为例子,如果你不喜欢,可以选择其他库看看。
Fetch Data
如下是一个简单的实例,一个组件从subreddit获取职位。看看这个例子,我们将会了解它是如何工作的
import React from 'react';
import ReactDOM from 'react-dom';
import axios from 'axios';
class FetchDemo extends React.Component {
constructor(props) {
super(props);
this.state = {
posts: []
};
}
componentDidMount() {
axios.get(`http://www.reddit.com/r/${this.props.subreddit}.json`)
.then(res => {
const posts = res.data.data.children.map(obj => obj.data);
this.setState({ posts });
});
}
render() {
return (
<div>
<h1>{`/r/${this.props.subreddit}`}</h1>
<ul>
{this.state.posts.map(post =>
<li key={post.id}>{post.title}</li>
)}
</ul>
</div>
);
}
}
ReactDOM.render(
<FetchDemo subreddit="reactjs"/>,
document.getElementById('root')
);
它是如何工作的?
首先,我们将axios 库import进来。
然后在constructor 里先调用super,接着初始化state,让它拥有一个posts空数组。
componentDidMount是关键所在,这个方法将会在组件插入DOM的第一时间执行。该方法在整个组件的生命周期只会执行一次。
它使用axios.get方法从subreddit获取数据,反引号的字符串是ES6的模板字符串,${}部分是由表达式的值所取代,所以URL传递给axios.get实际上是http://www.reddit.com/r/react...。
有两点你需要注意的是:
你可以在任意的subreddit URL末尾处附加上
.json并且获得那个职位的json形式的展示如果你忘记
www,你会得到一个CORS错误
因为Axios使用Promise,所有我们可以链式调用then方法来处理response。获取的职位信息是一点一点的转换后提取的,最重要的一点是,组件的状态(state)是由职位与新数组调用this.setState更新的,由此触发一个重新渲染,然后职位的信息就可以看见了
[Web 前端] 如何在React中做Ajax 请求?的更多相关文章
- React 中的 AJAX 请求:获取数据的方法
React 中的 AJAX 请求:获取数据的方法 React 只是使用 props 和 state 两处的数据进行组件渲染. 因此,想要使用来自服务端的数据,必须将数据放入组件的 props 或 st ...
- react中使用Ajax请求(axios,Fetch)
React本身只关注于界面, 并不包含发送ajax请求的代码,前端应用需要通过ajax请求与后台进行交互(json数据),可以使用集成第三方ajax库(或自己封装) 常用的ajax请求库 jQuery ...
- React中的Ajax
React中的Ajax 组件的数据来源,通常是通过Ajax请求从服务器获取,可以使用componentDidMount方法设置Ajax请求,等到请求成功,再用this.setState方法重新渲染UI ...
- 如何在react中使用decorator
2020-03-27 如何在react中使用decorator decorator目前都需要修改babel才能使用 说一下具体的操作方法 踩了一天的坑... 步骤1: yarn create reac ...
- ASP.NET Core Razor中处理Ajax请求
如何ASP.NET Core Razor中处理Ajax请求 在ASP.NET Core Razor(以下简称Razor)刚出来的时候,看了一下官方的文档,一直没怎么用过.今天闲来无事,准备用Rozor ...
- Struts2 在登录拦截器中对ajax请求的处理
前言: 由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串. 之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后 ...
- javascrpt 中的Ajax请求
回顾下javascript中的Ajax请求,写一个小例子: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...
- 关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题
前段时间做一个项目,而项目中所有的请求都要用jquery 中的ajax请求或者post请求,但是开始处理一些简单操作还好,但是自己写了一些验证就出现问题了,比如表单提交的时候,要验证帐号的唯一性,所以 ...
- PHP--------TP中的ajax请求
PHP--------TP中的ajax请求 以jQuery中的ajax为例: (1)引入jQuery 通过模板替换表示路径,我们可以自定义模板替换变量(在config中定义) /*自定义模板替换标签* ...
随机推荐
- Sublime快速入门
在当前的互联网时代,任何程序语言和相关技术都只是实现互联网应用的一种手段,这也就造成了大量的互联网工程师长期与不同的语言.技术.系统环境.IDE等打交道.因此一个相对统一方便的IDE对于程序员来说显得 ...
- MySQL数据库之索引
1 引言 在没有索引的情况下,如果要寻找特定行,数据库可能要遍历整个数据库,使用索引后,数据库可以根据索引找出这一行,极大提高查询效率.本文是对MySQL数据库中索引使用的总结. 2 索引简介 索引是 ...
- Android-Service和Thread
Android-Service和Thread 学习自 郭霖的博客 服务是运行在主线程上的 可能在我们第一次接触到Service的时候都是对于 __服务是运行在主线程上的 __这一现象不太理解,但是事实 ...
- 卡在 构建 gradle 项目信息
之所以卡死是因为Android Studio在初次构建的时候,会联网进行gradle目录的更新操作.断网之后就不会去主动更新了. 断网. 打开项目. 把 gradle 改成 使用当地. ======= ...
- VM 操作系统实例化(基于 KVM 的虚拟化研究及应用--崔泽永(2011))的论文笔记
一.VM操作系统实例化 1.建立虚拟磁盘镜像 虚拟磁盘镜像在逻辑上是提供给虚拟机使用的硬盘, 在物理上可以是 L inux系 统内一普通镜像文件, 也可以是真实的物理磁盘或分区. 本方案设计中将虚拟机 ...
- Java_Certificates does not conform to algorithm constraints
java.security.cert.CertificateException: Certificates does not conform to algorithm constraints SSL证 ...
- [Go] md5 加密 示例
package main import ( "crypto/md5" "encoding/hex" "fmt" "io" ...
- [Winform]setupfactory打包时添加开机自启动的脚本
摘要 如果有这样的需求,需要软件开机自启动,该如何做呢?开机自启动的做法,就是修改注册表,将你的exe注册到注册表Run节点下. setupfactory 在安装的时候需要以管理员身份运行,这样可以保 ...
- Win10系统下如何禁止同步主机session?windows 10禁止同步主机session的方法
近来,有些刚刚升级Win10正式版的用户反映自己的电脑开机时有个同步主机session启动项占用了将近半分钟,而选择用360禁止后,下次会出现同步主机session3,再禁止下次又会出现同步主机ses ...
- 在Brackets中使用Emmet
当在Brackets中安装上Emmet插件后,就可以使用Emmet的语法来加速前端编写. 有关html ● 子关系> div>ul>li ● 相邻+ div+p+bq ● 上一级^ ...