React ajax

2023-11-14

目录

前置说明

. 常用的ajax请求库

 axios

相关API

配置代理 方法一

 配置代理  方法二

案例—github用户搜索

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

 消息订阅与发布机制

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

list组件

search组件


前置说明

  1. React本身只关注于界面, 并不包含发送ajax请求的代码
  2. 前端应用需要通过ajax请求与后台进行交互(json数据)
  3. react应用中需要集成第三方ajax(或自己封装)

. 常用的ajax请求库

  1. jQuery: 比较重, 如果需要另外引入不建议使用
  2. axios: 轻量级, 建议使用
    1. 封装XmlHttpRequest对象的ajax
    2. promise风格
    3. 可以用在浏览器端和node服务器端

 axios

GitHub - axios/axios: Promise based HTTP client for the browser and node.js

相关API

axios.get('/user?ID=12345')
  .then(function (response) {
    console.log(response.data);
  })
  .catch(function (error) {
    console.log(error);
  });

axios.get('/user', {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });
export default class App extends Component {

	getStudentData = () => {
		axios.get('http://localhost:3000/api1/students').then(
			response => { console.log('成功了', response.data); },
			error => { console.log('失败了', error); }
		)
	}

	getCarData = () => {
		axios.get('http://localhost:3000/api2/cars').then(
			response => { console.log('成功了', response.data); },
			error => { console.log('失败了', error); }
		)
	}

	render() {
		return (
			<div>
				<button onClick={this.getStudentData}>点我获取学生数据</button>
				<button onClick={this.getCarData}>点我获取汽车数据</button>
			</div>
		)
	}
}

使用代理服务器解决跨域问题 :客户端请求代理服务器 代理服务器跟客户端处于同源下,由代理服务器转发给服务器(代理服务器跟服务器没有跨域问题)

代理服务器有指定的路由就不在转发给服务器(/index)

配置代理 方法一

在package.json中追加如下配置 :"proxy":"http://localhost:5000"

  • 1. 优点:配置简单,前端请求资源时可以不加任何前缀。
  • 2. 缺点:不能配置多个代理。
  • 3. 工作方式:上述方式配置代理,当请求了3000不存在的资源时,那么该请求会转发给5000 (优先匹配前端资源)

 配置代理  方法二

 第一步:创建代理配置文件  在src下创建配置文件:src/setupProxy.js

编写setupProxy.js配置具体代理规则:

 const proxy = require('http-proxy-middleware')
   
   module.exports = function(app) {
     app.use(
       proxy('/api1', {  //api1是需要转发的请求(所有带有/api1前缀的请求都会转发给5000)
         target: 'http://localhost:5000', //配置转发目标地址(能返回数据的服务器地址)
         changeOrigin: true, //控制服务器接收到的请求头中host字段的值
         /*
         	changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000
         	changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:3000
         	changeOrigin默认值为false,但我们一般将changeOrigin值设为true,欺骗服务器
         */
         pathRewrite: {'^/api1': ''} //去除请求前缀,保证交给后台服务器的是正常请求地址(必须配置)
       }),
       proxy('/api2', { 
         target: 'http://localhost:5001',
         changeOrigin: true,
         pathRewrite: {'^/api2': ''}
       })
     )
   }
  • 1. 优点:可以配置多个代理,可以灵活的控制请求是否走代理。
  • 2. 缺点:配置繁琐,前端请求资源时必须加前缀。

案例—github用户搜索

请求地址: https://api.github.com/search/users?q=xxxxxx

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

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

let obj = { a: { b: { c: 1 } } }
const { a: { b: { c: data } } } = obj
console.log(data);

 消息订阅与发布机制

  1. 工具库: PubSubJS
  2. 下载: npm install pubsub-js --save
  3. 使用:
    1. import PubSub from 'pubsub-js' //引入
    2. PubSub.subscribe('delete', function(data){ }); //订阅
    3. PubSub.publish('delete', data) //发布消息

  •     1.先订阅(接收方),再发布 (发送方)(理解:有一种隔空对话的感觉)
  •     2.适用于任意组件间通信
  •     3.要在组件的componentWillUnmount中取消订阅

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

  1. fetch documentation
  2. fetch: 原生函数,不再使用XmlHttpRequest对象提交ajax请求
  3. 老版本浏览器可能不支持
  4. 传统 Ajax 已死,Fetch 永生 - SegmentFault 思否
 try {
    const response= await fetch(`/api1/search/users2?q=${keyWord}`)
    const data = await response.json()
    console.log(data);
    } catch (error) {
        console.log('请求出错',error);
    }

 相关API

//1)GET请求
fetch(url).then(function(response) {
    return response.json()
  }).then(function(data) {
    console.log(data)
  }).catch(function(e) {
    console.log(e)
  });
//2)POST请求
 fetch(url, {
    method: "POST",
    body: JSON.stringify(data),
  }).then(function(data) {
    console.log(data)
  }).catch(function(e) {
    console.log(e)
  })

list组件

  • 三元运算符连问  isFirst ? <h2>欢迎使用,输入关键字,最后点击搜索</h2> : isLoding ? <h2>Loadding.......</h2> :err ? <h2 style={{ color: 'red' }}>{err} </h2> :users.map((userObj)={}
  • componentDidMount初始化钩子 componentWillUnmount即将卸载钩子
  • import PubSub from 'pubsub-js' 发布订阅第三方库
  • 接收数据订阅信息  PubSub.subscribe 记得取消订阅 PubSub.unsubscribe
import React, { Component } from 'react'
import PubSub from 'pubsub-js'
import './index.css'
export default class List extends Component {
	render() {
		const { users, isFirst, isLoding, err } = this.state
		return (
			<div className="row">
				{
					isFirst ? <h2>欢迎使用,输入关键字,最后点击搜索</h2> :
						isLoding ? <h2>Loadding.......</h2> :
							err ? <h2 style={{ color: 'red' }}>{err} </h2> :
								users.map((userObj) => {
									return (
										<div className="card" key={userObj.id}>
											<a href={userObj.html_url} target="_blank" rel="noreferrer">
												<img alt='head_portait' src={userObj.avatar_url} style={{ width: '100px' }} />
											</a>

											<p className="card-text">{userObj.login}</p>
										</div>
									)
								})
				}


			</div>
		)
	}
	state = {
		users: [],//初始值为数组
		isFirst: true,//是否为第一次打开
		isLoding: false,//标识是否处于加载中
		err: ''//存储请求相关错误信息
	}
	//初始化状态订阅消息
	componentDidMount() {
		this.token = PubSub.subscribe('sub', (_, data) => {
			this.setState(data)
		})
	}
	//即将卸载
	componentWillUnmount() {
		//取消订阅·
		PubSub.unsubscribe(this.token)
	}
}

search组件

  • PubSub.publish 发布消息 发送数据方
  • promise.then 返回的值为非promise实例,这个promise为成功值为undefined
  • 返回一个初始化状态的promise中断 可以防止穿透
  • await 右边必须为promise实例,必须使用async修饰  使用try,catch捕获
  • fetch发送请求(关注分离的设计思想)
import React, { Component } from 'react'
import PubSub from 'pubsub-js'
import axios from 'axios'

export default class Search extends Component {
	render() {
		return (
			<section className="jumbotron">
				<h3 className="jumbotron-heading">Search Github User</h3>
				<div>
					<input ref={c => this.keyWordElement = c} type="text" placeholder="输入关键字点击搜索" />&nbsp;
					<button onClick={this.search}>搜索</button>
				</div>
			</section>
		)
	}
	// PubSub.publish 发布消息
	search = async () => {
		//获取用户的输入(连续解构赋值并重命名)
		const { keyWordElement: { value: keyWord } } = this
		// 发送请求前通知list更新状态
		PubSub.publish('sub', { isFirst: false, isLoding: true })
		// #region 发送网络请求-----------使用axios发请求
		/* 	axios.get(`http://localhost:3000/api1/search/users?q=${keyWord}`)
				.then(response => {
					// 请求成功后通知list更新状态
					PubSub.publish('sub', { isLoding: false, users: response.data.items })
				},
					error => { PubSub.publish('sub', { isLoding: false, err: error.message }) }
				) */
		// #endregion

		//发送网络请求----使用fetch(未优化版)
		// fetch(`/api1/search/users?q=${keyWord}`).then(
		// 	response => {
		// 		console.log('联系服务器成功了');
		// 		return response.json()
		// 	},
		// 	///返回的值为非promise实例,这个promise为成功值为undefined
		// 	err => {
		// 		console.log('联系服务器失败了', err);
		// 		//返回一个初始化状态的promise中断
		// 		return new Promise(() => { })
		// 	}
		// ).then(
		// 	response => {
		// 		console.log('获取数据成功了', response);

		// 	},
		// 	err => { console.log('获取数据失败了', err); }
		// )
		// 使用try,catch捕获
		try {
			const response = await fetch(`/api1/search/users?q=${keyWord}`)
			//await 右边必须为promise实例,必须使用async修饰
			const data = await response.json()
			PubSub.publish('sub', { isLoding: false, users: data.items })
			console.log(data);
		} catch (error) {
			console.log('请求出错了', error);
			PubSub.publish('sub', { isLoding: false, err: error.message })
		}

	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React ajax 的相关文章

  • onMouseEnter 和 onMouseLeave 未按预期运行

    我正在尝试为我的组件模拟悬停效果 然而 onMouseEnter Leave 事件没有按预期工作 现在我试图让它简单地 console log 一个字符串来检查它是否正常工作 但什么也没有发生 目的是我可以在悬停时更改其背景颜色 我尝试通过
  • Firebase setDoc() 不创建文档

    我正在使用 auth 创建一个新用户 该用户正在工作 然后使用新创建的 uid 创建一个具有相同内容的新文档 const currentUser await auth createUserWithEmailAndPassword email
  • 避免对象突变

    我正在使用 React 和 ES6 所以我遇到了以下情况 我有一个带有对象数组的状态假设a id 1 value 1 id 2 value 2 处于以下状态Object A 然后我将列表传递给Object B通过道具 Object B 在构
  • React Router 总是将我重定向到不同的 url

    我是 React 和 React Router 的新手 我正在使用 React Router v4 并遵循基于以前版本的教程 但我让它工作了 使用在 SO 上找到的一些东西和 React Router v4 文档上的一些东西 但有一件事困扰
  • 需要将mxGraph与react js集成

    是否有任何示例或示例项目解释如何将 mxGraph 与 React js 集成 import React Component from react import PropTypes from prop types import ReactD
  • 组件样式...是动态创建的。您可能会看到此警告,因为您在另一个组件内调用了 styled

    在 ReactJS 中使用 styled component 时 我在尝试动态生成样式时遇到以下问题 下面是错误信息 id 为 sc fzqyvX 的组件 styled div 已动态创建 您可能会看到此警告 因为您在另一个组件内调用了 s
  • 哪种反应钩子与 firestore onsnapshot 一起使用?

    我在我的 React Native 应用程序中使用了大量的 Firestore 快照 我也在使用 React hooks 代码看起来像这样 useEffect gt someFirestoreAPICall onSnapshot snaps
  • 如何解决此错误“不要使用对象作为类型”?

    我不明白这个错误消息造成的 我的组件有两个和一个包含对象的数据数组 我收到一条错误消息 不要使用object作为一种类型 这object类型目前很难使用 我该如何解决它 我附加了数组包含对象的数据 first tsx import data
  • 由于 CORS 错误,POST 请求在 React axios 中被阻止[重复]

    这个问题在这里已经有答案了 我正在尝试向包含多部分数据的 API 发送 POST 请求 我在 postman 中测试了 API 一切正常 但是当我在react中调用API时 它给了我CORS错误 我交叉检查了 URL 标头和数据 对我来说一
  • Facebook SDK 登录/注销 ngrok

    我正在尝试将我正在构建的网络应用程序与 Facebook 集成 Facebook 现在要求所有 API 调用都必须从 https 站点进行 我正在构建的这个应用程序只是为了好玩 所以我使用的是 localhost 我在用着ngrok将我的请
  • React this.state 未定义?

    我正在遵循 Pluralsight 的初学者教程 在表单提交时将值传递给addUser组件方法 我需要将 userName 推送到this state users但我收到错误 App jsx 14 Uncaught TypeError Ca
  • 如何将 hls.js 与 React 结合使用

    我需要一些帮助来尝试弄清楚如何在 React 中使用 hls js 让我解释一下我必须从 api 获取 m3u8 的情况我能够使用基本的 html 使其工作
  • 在使用第三方东西时如何保持 Browserify 包大小合理(如果重要的话通过 grunt )

    我正在尝试捆绑我自己的代码 A 该代码又使用 2 个第三方组件 B 和 C 其中 C 也需要 B 据我所知 所有内容都是使用 CommonJS 节点样式模块编写的 捆绑后单独使用的价格为 60K B 是单独包含的 并假定是全局的 我通过在构
  • React中如何触发同级组件的函数?

    I am new to front end world and could not figure out how to trigger a function from a sibling component Lets say I have
  • 如何包装内在组件,保留大部分 Props?

    我想用我自己的 React 功能组件包装一个标准按钮 但我希望新组件的用户能够设置 几乎所有底层按钮的道具 当然 我想保持正确的打字 所以如果 WrappedButton 包含一个button then
  • 下一张图片不采用类属性

    我正在使用 Next js 和next image显示图像 但 CSS 在其中不起作用 该图像是 SVG 格式 我已将其放在公共文件夹中 我正在使用 Tailwind CSS 与此一起使用
  • 更改所选元素的颜色 - React

    我是反应新手 我试图更改所选的一个特定 li 的颜色 但它会更改所有 li 的颜色 此外 当单击另一个 li 时 我希望第一个 i 不再处于活动状态 这是代码 http codepen io polinaz pen zNJKqO http
  • Redux 减速器的副作用

    Redux 减速器应该没有副作用 但是 如果某个操作应该触发浏览器中文件的下载 其中内容基于商店的状态 该怎么办 这当然应该算作副作用吗 像下面这样的方法可以吗 还是我应该寻找替代方法 case SAVE GRID const json s
  • 如何在react-三纤维中提取并播放动画

    嗯 我有 gltf 动画模型 我成功加载模型 但无法播放嵌入的动画 我想知道是否可以以任何方式解决它 顺便说一句 我正在反应中工作 先感谢您 在这里您可以找到型号https drive google com file d 1ZVyklaQu
  • useParams 钩子在 React 功能组件中返回未定义

    该应用程序显示所有照片

随机推荐

  • VS2019+QT5.15.2+QGIS二次开发环境搭建

    VS2019 QT5 15 2 QGIS二次开发环境搭建 1 开发环境 VS2019 QT5 15 2 QGIS 注意 QT 平台的版本与qgis下载的版本有关 以前采用OSGeo4w64来下载qgis时会区分32和64位 但现在官网已经不
  • QT中QWeight与QMainWindow的区别

    在Qt中 QWidget 和 QMainWindow 是两个常用的类 用于创建用户界面 它们之间有一些区别 1 QWidget 是Qt中所有用户界面类的基类 而 QMainWindow 是一个特殊的窗口类 通常用于创建应用程序的主窗口 QM
  • elasticsearch(磁盘删除data后kibana自动进入只读模式)

    Elasticsearch 基于磁盘的碎片分配 向index插入 删除数据时发生报错 index kibana 1 blocked by FORBIDDEN 12 index read only allow delete api clust
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • DEDE自动调用轮播图/幻灯片

    备注 以下示例是以自动调取轮播图为例 具体使用时 步骤不变 内容据实调整即可 一 创建 1 新建模型 2 在新模型下依次添加字段 本例字段 datu xiaotu 分别给PC端和手机端用 据实调整即可
  • 雅思词汇表8000词版_考“鸭”干货丨雅思词汇备考技巧!

    点击蓝字 关注我们 考 鸭 干货第3期 雅思词汇备考技巧 语言学家TERREL认为 只要掌握了足够的词汇 即使没有多少语法知识 外语学习者也能较好理解外语和用外语进行表达 语言学家WILKINS有一句经典名言 没有语法只能传达很少的信息 没
  • 【STM32】STM32之timer1产生PWM(互补通道)

    本篇博文最后修改时间 2017年01月14日 23 50 一 简介 本文介绍STM32系列如何使用timer1的第TIM1 CH2N通道 PB14 产生PWM 二 实验平台 库版本 STM32F10x StdPeriph Lib V3 5
  • 反序列化攻击原理及防御措施(已解决)

    反序列化攻击原理及防御措施 已解决 java序列化算法透析 Serialization 序列化 是一种将对象以一连串的字节描述的过程 反序列化deserialization是一种将这些字节重建成一个对象的过程 Java序列化API提供一种处
  • 计算机视觉之VGGNet

    1 VGGNet介绍 VGGNet是牛津大学视觉几何组 Visual Geometry Group 提出的模型 故简称VGGNet 该模型在2014年的ILSVRC中取得了分类任务第二 定位任务第一的优异成绩 该模型证明了增加网络的深度能够
  • C#学习笔记 字符串和正则表达式

    字符串字面值 原始字符串 和很多语言相似 C 使用 来包括字符串字面值 字符串字面值可以是普通的字符串 也可以包含以 开头的转义字符 如果想让字符串字面值中包含 就必须写成 这样的 但是 像Windows系统文件路径这样的字符串 这就是很不
  • PTA 1074 宇宙无敌加法器(Python3)

    地球人习惯使用十进制数 并且默认一个数字的每一位都是十进制的 而在 PAT 星人开挂的世界里 每个数字的每一位都是不同进制的 这种神奇的数字称为 PAT数 每个 PAT 星人都必须熟记各位数字的进制表 例如 0527 就表示最低位是 7 进
  • 内容安全策略 Content-Security-Policy

    一 作用 1 限制资源获取 限制网页当中一系列的资源获取的情况 从哪里获取 请求发到哪个地方 限制方式 default src限制全局的和链接有关的作用范围 根据资源类型 connect src img src等 限制资源范围 2 报告资源
  • kotlin编译报错问题和解决方案

    IDEA 编译springboot项目报错 Error Kotlin Module was compiled with an incompatible version of Kotlin The binary version of its
  • 网络同步与异步概念整理

    在网络同步中 有两种同步方式 分别为同步与异步 同步的操作指的是 当所有的操作请求都做完 才将结果返回给用户 用户才能进行下一个操作 这样就会让用户有一种卡顿的感觉 因为需要等待上一步操作的执行结果 异步操作指的是 用户的操作之间不需要进行
  • git相关命令

    git命令 首先在github页面上创建一个自己的分支 new branch 命名branch 1 git clone git 克隆项目 2 git init 生成本地 git 文件 3 git add 添加需要上传的文件 4 git co
  • 什么是Docker容器?一文带你了解,看完直接学会

    一 为什么需要Docker容器 1 引入 1 1麻烦的环境部署 1 在软件开发中 最麻烦的事情之一就是环境配置 在正常情况下 如果要保证程序能运行 我们需要设置好操作系统 以及各种库和组件的安装 2 举例来说 要运行一个Python程序 计
  • 双重求和∑∑的定义及性质

    目录 一 复习求和符号 二 二重求和的定义 三 双重求和 交换求和顺序 一 复习求和符号 自从约瑟夫 傅立叶于1820年引入求和符号 大写的希腊字母sigma 以来 求和 以及双重求和 在数学公式推导 命题证明中被经常使用 掌握它的定义和性
  • Linux笔记——chapter1 从登陆Linux开始

    1 1 X Window与命令行模式 X Window 图形化界面 CentOS默认至少提供GNOME KDE这两种图形界面 命令行模式 纯文本界面 通常我们也称命令行模式为终端界面 terminal或console 登录模式的切换 Lin
  • 【C++】-- 高并发内存池

    高并发内存池 项目介绍 池化技术 内存池 定长内存池的实现 整体框架 threadcache threadcache整体设计 threadcache哈希桶映射对齐规则 TLS无锁访问 centralcache centralcache整体设
  • React ajax

    目录 前置说明 常用的ajax请求库 axios 相关API 配置代理 方法一 配置代理 方法二 案例 github用户搜索 ES6小知识点 解构赋值 重命名 消息订阅与发布机制 fetch发送请求 关注分离的设计思想 list组件 sea