react中使用Ajax请求(axios,Fetch)
React本身只关注于界面, 并不包含发送ajax请求的代码,前端应用需要通过ajax请求与后台进行交互(json数据),可以使用集成第三方ajax库(或自己封装)
常用的ajax请求库
jQuery: 比较重, 如果需要另外引入不建议使用
axios: 轻量级, 建议使用,封装XmlHttpRequest对象的ajax,promise风格,可以用在浏览器端和node服务器端
fetch: 原生函数, 但老版本浏览器不支持,不再使用XmlHttpRequest对象提交ajax请求,为了兼容低版本的浏览器, 可以引入兼容库fetch.js
常用的ajax请求库—axios
文档地址:https://github.com/axios/axios
相关API—get请求
axios.get('/user?ID=12345').then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
axios.get('/user', { params: { ID: 12345 } }).then(function (response) { console.log(response); }).catch(function (error) { console.log(error); });
相关API—post请求
axios.post('/user', { firstName: 'Fred', lastName: 'Flintstone' }).then(function (response) { console.log(response); }).catch(function (error) { console.log(error); });
常用的ajax请求库—fetch
文档地址:https://github.github.io/fetch/,https://segmentfault.com/a/1190000003810652
由于 Fetch API 是基于 Promise 设计,有必要先学习一下 Promise,推荐阅读 MDN Promise 教程。旧浏览器不支持 Promise,需要使用 polyfill es6-promise
Fetch API 很简单,看文档很快就学会了。推荐 MDN Fetch 教程 和 万能的WHATWG Fetch 规范
相关API-get请求
fetch(url).then(function(response) { return response.json() }).then(function(data) { console.log(data) }).catch(function(e) { console.log(e) });
相关API-post请求
fetch(url, { method: "POST", body: JSON.stringify(data), }).then(function(data) { console.log(data) }).catch(function(e) { console.log(e) })
分别使用axios和fetch实现一个搜索案例
效果大致如下
使用脚手架创建项目并且创建目录结构并且编写静态的组件
将这个功能抽出来一整个模块(search),将主组件在App.js中引入
search.js(主组件)
组件中需要接收子组件search-input.js传过来的一个searchName数据,search组件拿到这个数据进行请求后台,将返回的数据传递给子组件search-list
search-list有四个状态,初始(initView),查询中(loading),查询的数据(users),查询失败信息(errorMsg),在父组件中传递给子组件search-list并且根据查询结果进行更新这四个状态,更新状态后子组件会接收到最新的状态
先来看看使用axios
import React, {Component} from 'react' import axios from 'axios' import './search.css'; import SearchInput from './search-input/search-input' import SearchList from './search-list/search-list' class Search extends Component { // search-list有四个状态,初始(initView),查询中(loading),查询的数据(users),查询失败信息(errorMsg) state = { initView: true, loading: false, users: [], errorMsg: '' } search = (searchName) => { const url = `https://api.github.com/search/users?q=${searchName}` this.setState({ initView: false, loading: true }) axios.get(url) .then((response) => { this.setState({ loading: false, users: response.data.items }) }) .catch((error) => { console.log('error', error.response.data.message, error.message) this.setState({ loading: false, errorMsg: error.message }) }) } render() { const {initView, loading, users, errorMsg} = this.state return ( <div className='search-axios'> <div className='search-input-cantain'> <SearchInput search={this.search}/> </div> <div className='search-list-cantain'> <SearchList initView={initView} loading={loading} users={users} errorMsg={errorMsg}/> </div> </div> ) } } export default Search
.search-axios{ width: 900px; height: 600px; margin: 40px auto 0; border: 1px solid #cccccc; box-sizing: border-box; } .search-input-cantain{ width: 100%; height: 100px; padding: 20px; box-sizing: border-box; border-bottom: 1px solid #cccccc; } .search-list-cantain{ width: 100%; height: 500px; padding: 20px; box-sizing: border-box; }
子组件search-input
将输入框的数据使用自定义事件传个父组件search
import React, {Component} from 'react' import './search-input.css'; import propTypes from 'prop-types' class SearchInput extends Component { static propTypes = { search: propTypes.func.isRequired } handleSearch = () => { // 获取输入框中的数据 const searchName = this.searchName.value // 更新状态 this.props.search(searchName) // 清空输入框中的数据 this.searchName.value = '' } render() { return ( <div className='search-input'> <input type='text' ref={input => this.searchName = input} placeholder='enter the name you search'/> <button onClick={this.handleSearch}>Search</button> </div> ) } } export default SearchInput
.search-input input{ width: 80%; height: 35px; border-bottom-left-radius: 4px; border-top-left-radius: 4px; outline: none; border: 1px solid #cccccc; padding: 0 8px; box-sizing: border-box; } .search-input button{ width: 20%; text-align: center; height: 35px; line-height: 35px; outline: none; border: 1px solid #cccccc; box-sizing: border-box; cursor: pointer; vertical-align: -2px; border-bottom-right-radius: 4px; border-top-right-radius: 4px; }
子组件search-list根据父组件search传过来的四个状态进行判断显示
import React, {Component} from 'react' import './search-list.css'; import propTypes from "prop-types"; class SearchList extends Component { static propTypes = { initView: propTypes.bool.isRequired, loading: propTypes.bool.isRequired, users: propTypes.array.isRequired, errorMsg: propTypes.string.isRequired } render() { const {initView, loading, users, errorMsg} = this.props if (initView) { return <div className='search-hide-enter'>enter the name you search</div> } else if (loading) { return <div className='search-ing'>搜索中,请稍后.....</div> } else if (errorMsg) { return <div className='search-error'>{errorMsg}</div> } else { return ( <div className='search-list'> {users.map((user, index) => ( <div className='search-item' key={index}> <div className='search-item-img'><img src={user.avatar_url} alt='user'/></div> <p className='search-item-name'>{user.login}</p> </div> ))} </div> ) } } } export default SearchList
.search-list{ width: 100%; height: 460px; overflow-y: auto; } .search-item{ width: 25%; height: 150px; display: inline-block; padding: 10px; box-sizing: border-box; } .search-item-img{ width: 70%; margin: 0 auto; text-align: center; } .search-item-img img{ max-width: 100%; } .search-item p{ width: 100%; text-align: center; margin:; padding:; } .search-hide-enter,.search-ing,.search-error{ font-size: 20px; }
另外一种方式是子组件search-input将输入框的数据使用自定义事件传个父组件search,父组件search在将这个数据传个子组件search-list,子组件search-list接收到新的属性时自动调用componentWillReceiveProps这个方法继续ajax请求
search组件
import React, {Component} from 'react' import './search.css'; import SearchInput from './search-input/search-input' import SearchList from './search-list/search-list' class Search extends Component { state = { searchName: '' } search = (searchName) => { this.setState({searchName}) } render() { const {searchName} = this.state return ( <div className='search-axios'> <div className='search-input-cantain'> <SearchInput search={this.search}/> </div> <div className='search-list-cantain'> <SearchList searchName={searchName} /> </div> </div> ) } } export default Search
search-list组件
import React, {Component} from 'react' import './search-list.css'; import propTypes from "prop-types"; import axios from 'axios' class SearchList extends Component { static propTypes = { searchName: propTypes.string.isRequired } state = { initView: true, loading: false, users: [], errorMsg: null } // 当组件接收到新的属性时回调(生命周期的函数) async componentWillReceiveProps(newProps) { const {searchName} = newProps const url = `https://api.github.com/search/users?q=${searchName}` this.setState({ initView: false, loading: true }) try { let data = await axios.get(url); this.setState({ loading: false, users: data.data.items }) } catch(e) { this.setState({ loading: false, errorMsg: e.message }) console.log("Oops, error", e); } } render() { const {initView, loading, users, errorMsg} = this.state if (initView) { return <div className='search-hide-enter'>enter the name you search</div> } else if (loading) { return <div className='search-ing'>搜索中,请稍后.....</div> } else if (errorMsg) { return <div className='search-error'>{errorMsg}</div> } else { return ( <div className='search-list'> {users.map((user, index) => ( <div className='search-item' key={index}> <div className='search-item-img'><img src={user.avatar_url} alt='user'/></div> <p className='search-item-name'>{user.login}</p> </div> ))} </div> ) } } } export default SearchList
最终效果
react中使用Ajax请求(axios,Fetch)的更多相关文章
- [Web 前端] 如何在React中做Ajax 请求?
cp from : https://segmentfault.com/a/1190000007564792 如何在React中做Ajax 请求? 首先:React本身没有独有的获取数据的方式.实际上, ...
- React 中的 AJAX 请求:获取数据的方法
React 中的 AJAX 请求:获取数据的方法 React 只是使用 props 和 state 两处的数据进行组件渲染. 因此,想要使用来自服务端的数据,必须将数据放入组件的 props 或 st ...
- Vue中发送ajax请求——axios使用详解
axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 htt ...
- React中的Ajax
React中的Ajax 组件的数据来源,通常是通过Ajax请求从服务器获取,可以使用componentDidMount方法设置Ajax请求,等到请求成功,再用this.setState方法重新渲染UI ...
- PHP--------TP中的ajax请求
PHP--------TP中的ajax请求 以jQuery中的ajax为例: (1)引入jQuery 通过模板替换表示路径,我们可以自定义模板替换变量(在config中定义) /*自定义模板替换标签* ...
- javascrpt 中的Ajax请求
回顾下javascript中的Ajax请求,写一个小例子: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...
- ASP.NET Core Razor中处理Ajax请求
如何ASP.NET Core Razor中处理Ajax请求 在ASP.NET Core Razor(以下简称Razor)刚出来的时候,看了一下官方的文档,一直没怎么用过.今天闲来无事,准备用Rozor ...
- HighCharts中的Ajax请求的2D折线图
HighCharts中的Ajax请求的2D折线图 设计源码: <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题
前段时间做一个项目,而项目中所有的请求都要用jquery 中的ajax请求或者post请求,但是开始处理一些简单操作还好,但是自己写了一些验证就出现问题了,比如表单提交的时候,要验证帐号的唯一性,所以 ...
随机推荐
- IdentityServer开题篇
最近也研究了一段时间的IdentityServer4,园里关于IdentityServer的文章也很多,这里也简单写写,做做记录(文笔不佳,见谅). 1.identityserver是什么? Iden ...
- 有关于MVC SignalR的问题
刚拜读 @Learning hard 的 [Asp.net 开发系列之SignalR篇]专题一:Asp.net SignalR快速入门 跟着博文一步步操作,这是新人的学习方式 然而笔者的开发环境和 @ ...
- 集成腾讯位置服务到webapi
经纬度转换为详细地址信息 参考文档:http://lbs.qq.com/webservice_v1/guide-gcoder.html 首先申请key,如果使用的是服务端请求webservice AP ...
- DirBuste 使用
https://sourceforge.net/projects/dirbuster/ 官网下载 记得安装java 运行环境 这是扫描 443 端口的数据 也可以自己写字典规则 在选择模糊查询时 下面 ...
- ASP.NET资源大全-知识分享
API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台.官网 ASP.NET WebAPI:快捷创建 HTTP 服务 ...
- 推荐数据库、Web、Net、架构的PDF数据,书不在多,在看!
先收藏,后看:千万不要做一个屯书的人,一定要坚持有选择性的看下去: 数据库类 SqlServer Oracle .NET 更多... Web 更多... 架构 不刮了,直接可以看到了. 链接: h ...
- struts2_struts2线程安全吗?
线程安全:在一个进程中有多个线程并发执行,线程执行过程中,变量值是相同的,执行结果也是相同的 struts2线程安全 1.每次请求都会重新创建新的action对象,所以线程安全. 2.由于action ...
- epoll代码示例
#include <errno.h> #include <string.h> #include <stdlib.h> #include <sys/types. ...
- springboot之scheduled任务调度
springboot整合Scheduled可以方便的进行任务调度,话不多说,直接上代码 package com.rookie.bigdata; import org.springframework.b ...
- Html5页面内使用JSON动画的实现
有一天我们的UI设计师找到我说,要把页面中我自己用程序写的动画,换成他们给的json动画,原因是有的动画很复杂,自己写起来达不到他们的预期效果(写到这里我突然想到一个问题,这么复杂的动画为什么不使用g ...