前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React---发送Ajax请求

React---发送Ajax请求

作者头像
半指温柔乐
发布2021-04-25 15:23:23
1.9K0
发布2021-04-25 15:23:23
举报
文章被收录于专栏:前端知识分享前端知识分享

1. 理解

1.1. 前置说明

  1. React本身只关注于界面, 并不包含发送ajax请求的代码
  2. 前端应用需要通过ajax请求与后台进行交互(json数据)
  3. react应用中需要集成第三方ajax库(或自己封装)
  4. jQuery: 比较重, 如果需要另外引入不建议使用
  5. axios: 轻量级, 建议使用

1.2. 常用的ajax请求库

1) 封装XmlHttpRequest对象的ajax

2) promise风格

3) 可以用在浏览器端和node服务器端

2. axios

2.1. 文档

  地址: https://github.com/axios/axios

  安装axios: npm install axios

2.2. 相关API

  1)GET请求

代码语言:javascript
复制
 1 axios.get('/user?ID=12345')
 2   .then(function (response) {
 3     console.log(response.data);
 4   })
 5   .catch(function (error) {
 6     console.log(error);
 7   });
 8 
 9 axios.get('/user', {
10     params: {
11       ID: 12345
12     }
13   })
14   .then(function (response) {
15     console.log(response);
16   })
17   .catch(function (error) {
18     console.log(error);
19   });

2)POST请求

代码语言:javascript
复制
 1 axios.post('/user', {
 2   firstName: 'Fred',
 3   lastName: 'Flintstone'
 4 })
 5 .then(function (response) {
 6 console.log(response);
 7 })
 8 .catch(function (error) {
 9 console.log(error);
10 });

3. 案例

分析:

   1.设计状态时要考虑全面,例如带有网络请求的组件,要考虑请求失败怎么办。

2.ES6小知识点:解构赋值+重命名

let obj = {a:{b:1}}

const {a} = obj; //传统解构赋值

const {a:{b}} = obj; //连续解构赋值

const {a:{b:value}} = obj; //连续解构赋值+重命名

3.消息订阅与发布机制

1.先订阅,再发布(理解:有一种隔空对话的感觉)

2.适用于任意组件间通信

3.要在组件的componentWillUnmount取消订阅

4.fetch发送请求(关注分离的设计思想)

try {

const response= await fetch(`/api1/search/users?q=${keyWord}`)

const data = await response.json()

console.log(data);

} catch (error) {

console.log('请求出错',error);

}

(1)App.jsx

代码语言:javascript
复制
 1 import React, { Component } from 'react'
 2 import Search from './components/Search'
 3 import List from './components/List'
 4 
 5 export default class App extends Component {
 6 
 7     state = { //初始化状态
 8         users:[], //users初始值为数组
 9         isFirst:true, //是否为第一次打开页面
10         isLoading:false,//标识是否处于加载中
11         err:'',//存储请求相关的错误信息
12     } 
13 
14     //更新App的state
15     updateAppState = (stateObj)=>{
16         this.setState(stateObj)
17     }
18 
19     render() {
20         return (
21             <div className="container">
22                 <Search updateAppState={this.updateAppState}/>
23                 <List {...this.state}/>
24             </div>
25         )
26     }
27 }

(2) List.jsx

代码语言:javascript
复制
 1 import React, { Component } from 'react'
 2 import './index.css'
 3 
 4 export default class List extends Component {
 5     render() {
 6         const {users,isFirst,isLoading,err} = this.props
 7         return (
 8             <div className="row">
 9                 {
10                     isFirst ? <h2>欢迎使用,输入关键字,随后点击搜索</h2> :
11                     isLoading ? <h2>Loading......</h2> :
12                     err ? <h2 style={{color:'red'}}>{err}</h2> :
13                     users.map((userObj)=>{
14                         return (
15                             <div key={userObj.id} className="card">
16                                 <a rel="noreferrer" href={userObj.html_url} target="_blank">
17                                     <img alt="head_portrait" src={userObj.avatar_url} style={{width:'100px'}}/>
18                                 </a>
19                                 <p className="card-text">{userObj.login}</p>
20                             </div>
21                         )
22                     })
23                 }
24             </div>
25         )
26     }
27 }

(3) Search.jsx

代码语言:javascript
复制
 1 import React, { Component } from 'react'
 2 import axios from 'axios'
 3 
 4 export default class Search extends Component {
 5 
 6     search = ()=>{
 7         //获取用户的输入(连续解构赋值+重命名)
 8         const {keyWordElement:{value:keyWord}} = this
 9         //发送请求前通知App更新状态
10         this.props.updateAppState({isFirst:false,isLoading:true})
11         //发送网络请求
12         axios.get(`/api1/search/users?q=${keyWord}`).then(
13             response => {
14                 //请求成功后通知App更新状态
15                 this.props.updateAppState({isLoading:false,users:response.data.items})
16             },
17             error => {
18                 //请求失败后通知App更新状态
19                 this.props.updateAppState({isLoading:false,err:error.message})
20             }
21         )
22     }
23 
24     render() {
25         return (
26             <section className="jumbotron">
27                 <h3 className="jumbotron-heading">搜索github用户</h3>
28                 <div>
29                     <input ref={c => this.keyWordElement = c} type="text" placeholder="输入关键词点击搜索"/>&nbsp;
30                     <button onClick={this.search}>搜索</button>
31                 </div>
32             </section>
33         )
34     }
35 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 理解
    • 1.1. 前置说明
      • 1.2. 常用的ajax请求库
      • 2. axios
        • 2.1. 文档
          • 2.2. 相关API
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档