[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中定义) /*自定义模板替换标签* ...
随机推荐
- ngResource和REST介绍
ngResource和REST介绍 一.RESTful介绍 RESTful维基百科 REST(表征性状态传输,Representational State Transfer)是Roy Fielding ...
- 恢复spark挂掉的节点
背景: 某个Worker节点挂掉了,我们需要将Worker进行启动恢复,同时可以恢复streaming中的executor 解决办法: 其实很简单,去worker节点中执行sbin/start-sla ...
- 029 RDD Join相关API,以及程序
1.数据集 A表数据: 1 a 2 b 3 c B表数据: 1 aa1 1 aa2 2 bb1 2 bb2 2 bb3 4 dd1 2.join的分类 inner join left outer jo ...
- PAT 1066. Root of AVL Tree (25)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- MySQL数据库引擎详解
作为Java程序员,MySQL数据库大家平时应该都没少使用吧,对MySQL数据库的引擎应该也有所了解,这篇文章就让我详细的说说MySQL数据库的Innodb和MyIASM两种引擎以及其索引结构.也来巩 ...
- django表单字段
在通过django.forms.Forms创建表单字段时,其中每个字段都有一些自定义的验证逻辑和一些其他钩子 虽然表单字段的Field类主要使用在Form类中,但也可以直接实例化来使用它们,以更好的了 ...
- JAVA 图形开发中组件对齐方法及界面开发
/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 在上篇博客中提到了JAVA图形界面开发时的两种布局,流式布局和边框布局. 在实际使用中可能会发现,往 ...
- 【bzoj3451】Tyvj1953 Normal 期望+树的点分治+FFT
题目描述 给你一棵 $n$ 个点的树,对这棵树进行随机点分治,每次随机一个点作为分治中心.定义消耗时间为每层分治的子树大小之和,求消耗时间的期望. 输入 第一行一个整数n,表示树的大小接下来n-1行每 ...
- [POI2014]Rally
OJ题号:BZOJ3832.洛谷3573 思路: 建立超级源汇$S$和$T$,DP求出分别以$S$和$T$为源点的最长路$diss$和$dist$. 对于每条边$i$,设定一个权值$w_i=diss_ ...
- C#中执行Dos命令
//dosCommand Dos命令语句 public string Execute(string dosCommand) { ); } /// <summary> /// 执行DOS命令 ...