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)的更多相关文章

  1. [Web 前端] 如何在React中做Ajax 请求?

    cp from : https://segmentfault.com/a/1190000007564792 如何在React中做Ajax 请求? 首先:React本身没有独有的获取数据的方式.实际上, ...

  2. React 中的 AJAX 请求:获取数据的方法

    React 中的 AJAX 请求:获取数据的方法 React 只是使用 props 和 state 两处的数据进行组件渲染. 因此,想要使用来自服务端的数据,必须将数据放入组件的 props 或 st ...

  3. Vue中发送ajax请求——axios使用详解

    axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 htt ...

  4. React中的Ajax

    React中的Ajax 组件的数据来源,通常是通过Ajax请求从服务器获取,可以使用componentDidMount方法设置Ajax请求,等到请求成功,再用this.setState方法重新渲染UI ...

  5. PHP--------TP中的ajax请求

    PHP--------TP中的ajax请求 以jQuery中的ajax为例: (1)引入jQuery 通过模板替换表示路径,我们可以自定义模板替换变量(在config中定义) /*自定义模板替换标签* ...

  6. javascrpt 中的Ajax请求

    回顾下javascript中的Ajax请求,写一个小例子: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  7. ASP.NET Core Razor中处理Ajax请求

    如何ASP.NET Core Razor中处理Ajax请求 在ASP.NET Core Razor(以下简称Razor)刚出来的时候,看了一下官方的文档,一直没怎么用过.今天闲来无事,准备用Rozor ...

  8. HighCharts中的Ajax请求的2D折线图

    HighCharts中的Ajax请求的2D折线图 设计源码: <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  9. 关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题

    前段时间做一个项目,而项目中所有的请求都要用jquery 中的ajax请求或者post请求,但是开始处理一些简单操作还好,但是自己写了一些验证就出现问题了,比如表单提交的时候,要验证帐号的唯一性,所以 ...

随机推荐

  1. 验证码图片二值化问题 BitmapData 怎么解决

    对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色 ...

  2. springMVC_06数据的处理

    一.提交数据的处理 *springmvc是单例的 1. 提交的域名称和处理方法的参数一致即可 提交的数据 处理方法 2.如果域名城和参数名不一致,在方法内加上域名称eg.(RequestParam(“ ...

  3. SpringBoot快速开始Hello World

    介绍 Spring Boot跟Spring MVC不太一样,Spring MVC建新项目的时候是要配置很多东西的,而Spring Boot讲究的是快速,提供了很多默认配置,所以新建一个项目不需要手动配 ...

  4. DevExpress ChartControl ViewType.Line

    源码地址:https://files.cnblogs.com/files/lanyubaicl/ChartControl.Line.7z public partial class Form1 : Fo ...

  5. CPU 实用工具

    系统版本:CentOS 7.4 top 17:49:04 // 当前时间 up 3:55 // 系统运行时间,格式为时:分 2 users // 当前登录用户数 load average // 三个值 ...

  6. 如何去除vue项目中的 # --- History模式

    来自:https://www.cnblogs.com/zhuzhenwei918/p/6892066.html 侵删 使用vue-cli搭建的环境,在配置好路由之后,可以看到下面的情况: 但是不难发现 ...

  7. 李飞飞确认将离职!谷歌云AI总帅换人,卡耐基·梅隆老教授接棒

    https://mp.weixin.qq.com/s/i1uwZALu1BcOq0jAMvPdBw 看点:李飞飞正式回归斯坦福,新任谷歌云AI总帅还是个教授,不过这次是全职. 智东西9月11日凌晨消息 ...

  8. tomcat闪退解决

    异常原因:拷贝了一个tomcat到新机器上,运行startup闪退 解决方法: 1.检查发现当前系统没有安装配置jdk,安装配置后运行仍然闪退 2.在tomcat的启动脚本和关闭脚本中指定JDK和to ...

  9. 生产者、消费者模型---Queue类

    Queue队列在几乎每种编程语言都会有,python的列表隐藏的一个特点就是一个后进先出(LIFO)队列.而本文所讨论的Queue是python标准库queue中的一个类.它的原理与列表相似,但是先进 ...

  10. 前端AntD框架的upload组件上传图片时遇到的一些坑

    前言 本次做后台管理系统,采用的是 AntD 框架.涉及到图片的上传,用的是AntD的 upload 组件. 前端做文件上传这个功能,是很有技术难度的.既然框架给我们提供好了,那就直接用呗.结果用的时 ...