news 2026/6/10 12:27:52

React - React 配置代理、搜索案例(Fetch + PubSub)、React 路由基本使用、NavLink

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
React - React 配置代理、搜索案例(Fetch + PubSub)、React 路由基本使用、NavLink

一、React 配置代理

1、在package.json文件中配置代理
(1)具体实现
  1. package.json
"proxy":"http://localhost:5000"
  1. App.jsx
importReact,{Component}from"react";importaxiosfrom"axios";exportdefaultclassAppextendsComponent{getStudentData=()=>{axios.get("/students").then((response)=>{console.log("成功了",response.data);},(error)=>{console.log("失败了",error);},);};render(){return(<div><button onClick={this.getStudentData}>点我获取学生数据</button></div>);}}
(2)小结
  • 工作方式:当请求了 3000 不存在的资源时,那么该请求会转发给5000(优先匹配前端资源)
  1. 优点:配置简单,前端请求资源时可以不加任何前缀

  2. 缺点:不能配置多个代理

2、在setupProxy.js文件中配置代理
(1)具体实现
  1. 在 src 目录下创建并配置 setupProxy.js 文件
const{createProxyMiddleware}=require("http-proxy-middleware");module.exports=function(app){app.use(createProxyMiddleware("/api1",{target:"http://localhost:5000",changeOrigin:true,pathRewrite:{"^/api1":""},}),createProxyMiddleware("/api2",{target:"http://localhost:5001",changeOrigin:true,pathRewrite:{"^/api2":""},}),);};
  1. App.jsx
importReact,{Component}from"react";importaxiosfrom"axios";exportdefaultclassAppextendsComponent{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>);}}
(2)解读
  1. /api1是需要转发的请求,target 是转发目标地址,所有带有/api1前缀的请求都会转发给 target
createProxyMiddleware("/api1",{target:"http://localhost:5000",...})
  1. 控制服务器接收到的请求头中 Host 字段的值,changeOrigin 默认值为 false,但我们一般设置为 true
1. changeOrigin 设置为 true 时,服务器收到的请求头中的 Host 字段为:localhost:5000 2. changeOrigin 设置为 false 时,服务器收到的请求头中的 Host 字段为:localhost:3000
changeOrigin:true,
  1. 去除请求前缀,保证交给后台服务器的是正常请求地址(必须配置)
pathRewrite:{"^/api2":""},
(3)小结
  1. 优点:可以配置多个代理,可以灵活的控制请求是否走代理

  2. 缺点:配置繁琐,前端请求资源时必须加前缀


二、搜索案例(Fetch + PubSub)

  1. List 组件
importReact,{Component}from"react";importPubSubfrom"pubsub-js";import"./index.css";exportdefaultclassListextendsComponent{state={users:[],isFirst:true,isLoading:false,err:"",};componentDidMount(){this.token=PubSub.subscribe("test",(msgName,stateObj)=>{this.setState(stateObj);});}componentWillUnmount(){PubSub.unsubscribe(this.token);}render(){const{users,isFirst,isLoading,err}=this.state;return(<div className="row">{isFirst?(<h3>欢迎使用,输入关键字,随后点击搜索</h3>):isLoading?(<h3>Loading...</h3>):err?(<h3 style={{color:"red"}}>{err}</h3>):(users.map((userObj)=>{return(<div key={userObj.id}className="card"><a rel="noreferrer"href={userObj.html_url}target="_blank"><img alt="head_portrait"src={userObj.avatar_url}style={{width:"100px"}}/></a><p className="card-text">{userObj.login}</p></div>);}))}</div>);}}
.album{min-height:50rem;padding-top:3rem;padding-bottom:3rem;background-color:#f7f7f7;}.card{float:left;width:33.333%;padding:0.75rem;margin-bottom:2rem;border:1px solid #efefef;text-align:center;}.card > img{margin-bottom:0.75rem;border-radius:100px;}.card-text{font-size:85%;}
  1. Search 组件
importReact,{Component}from"react";importPubSubfrom"pubsub-js";exportdefaultclassSearchextendsComponent{search=async()=>{// 获取用户的输入(连续解构赋值 + 重命名)const{keyWordElement:{value:keyWord},}=this;// 发送请求前通知更新状态PubSub.publish("test",{isFirst:false,isLoading:true});try{constresponse=awaitfetch(`/api1/search/users?q=${keyWord}`);constdata=awaitresponse.json();// 请求成功后通知更新状态PubSub.publish("test",{isLoading:false,users:data.items});}catch(error){// 请求失败后通知更新状态PubSub.publish("test",{isLoading:false,err:error.message});}};render(){return(<section className="jumbotron"><h3 className="jumbotron-heading">搜索 GitHub 用户</h3><div><input ref={(c)=>(this.keyWordElement=c)}type="text"placeholder="输入关键词点击搜索"/>&nbsp;<button onClick={this.search}>搜索</button></div></section>);}}
  1. App 组件
importReact,{Component}from"react";importSearchfrom"./components/Search";importListfrom"./components/List";exportdefaultclassAppextendsComponent{render(){return(<div className="container"><Search/><List/></div>);}}
  1. index.js
importReactfrom"react";// 引入 React 核心库importReactDOMfrom"react-dom";// 引入 ReactDOMimportAppfrom"./App";// 引入 App 组件// 渲染 App 组件到页面ReactDOM.render(<App/>,document.getElementById("root"));
  1. setupProxy.js
const{createProxyMiddleware}=require("http-proxy-middleware");module.exports=function(app){app.use(createProxyMiddleware("/api1",{target:"http://localhost:5000",changeOrigin:true,pathRewrite:{"^/api1":""},}),);};

三、React 路由基本使用

  1. About 组件
importReact,{Component}from"react";exportdefaultclassAboutextendsComponent{render(){return<h3>About Content</h3>;}}
  1. Home 组件
importReact,{Component}from"react";exportdefaultclassHomeextendsComponent{render(){return<h3>Home Content</h3>;}}
  1. App 组件
importReact,{Component}from"react";import{Link,Route}from"react-router-dom";importHomefrom"./components/Home";importAboutfrom"./components/About";exportdefaultclassAppextendsComponent{render(){return(<div><h2>React Router Demo</h2><div><Link to="/about">About</Link><Link to="/home">Home</Link></div><div><Route path="/about"component={About}/><Route path="/home"component={Home}/></div></div>);}}
  1. index.js
importReactfrom"react";// 引入 React 核心库importReactDOMfrom"react-dom";// 引入 ReactDOMimportAppfrom"./App";// 引入 App 组件import{BrowserRouter}from"react-router-dom";// 渲染 App 组件到页面ReactDOM.render(<BrowserRouter><App/></BrowserRouter>,document.getElementById("root"),);

四、NavLink

1、基本介绍
  1. Link:单纯的页面跳转组件,提供导航功能

  2. NavLink:是 Link 的特殊版本,除了导航功能,它会自动给当前激活的链接添加样式或类名

  • NavLink 的 activeClassName 用于自定义激活类名,默认是 active
2、基本使用
  1. About 组件
importReact,{Component}from"react";exportdefaultclassAboutextendsComponent{render(){return<h3>About Content</h3>;}}
  1. Home 组件
importReact,{Component}from"react";exportdefaultclassHomeextendsComponent{render(){return<h3>Home Content</h3>;}}
  1. App 组件
importReact,{Component}from"react";import{NavLink,Route}from"react-router-dom";importHomefrom"./components/Home";importAboutfrom"./components/About";import"./App.css";exportdefaultclassAppextendsComponent{render(){return(<div><h2>React Router Demo</h2><div><NavLink activeClassName="selected"className="list-group-item"to="/about">About</NavLink><NavLink activeClassName="selected"className="list-group-item"to="/home">Home</NavLink></div><div><Route path="/about"component={About}/><Route path="/home"component={Home}/></div></div>);}}
.active{color:red;font-weight:bold;background-color:#f0f0f0;}.selected{color:blue;font-weight:bold;background-color:#f0f0f0;}
  1. index.js
importReactfrom"react";// 引入 React 核心库importReactDOMfrom"react-dom";// 引入 ReactDOMimportAppfrom"./App";// 引入 App 组件import{BrowserRouter}from"react-router-dom";// 渲染 App 组件到页面ReactDOM.render(<BrowserRouter><App/></BrowserRouter>,document.getElementById("root"),);
3、NavLink 封装
(1)pages
  1. About 组件
importReact,{Component}from"react";exportdefaultclassAboutextendsComponent{render(){return<h3>About Content</h3>;}}
  1. Home 组件
importReact,{Component}from"react";exportdefaultclassHomeextendsComponent{render(){return<h3>Home Content</h3>;}}
(2)components
  • MyNavLink 组件
importReact,{Component}from"react";import{NavLink}from"react-router-dom";import"./index.css";exportdefaultclassMyNavLinkextendsComponent{render(){return<NavLink activeClassName="selected"className="list-group-item"{...this.props}/>;}}
.active{color:red;font-weight:bold;background-color:#f0f0f0;}.selected{color:blue;font-weight:bold;background-color:#f0f0f0;}
(3)main
  1. App 组件
importReact,{Component}from"react";import{Route}from"react-router-dom";importHomefrom"./pages/Home";importAboutfrom"./pages/About";importMyNavLinkfrom"./components/MyNavLink/index";exportdefaultclassAppextendsComponent{render(){return(<div><h2>React Router Demo</h2><div><MyNavLink to="/about">About</MyNavLink><MyNavLink to="/home">Home</MyNavLink></div><div><Route path="/about"component={About}/><Route path="/home"component={Home}/></div></div>);}}
  1. index.js
importReactfrom"react";// 引入 React 核心库importReactDOMfrom"react-dom";// 引入 ReactDOMimportAppfrom"./App";// 引入 App 组件import{BrowserRouter}from"react-router-dom";// 渲染 App 组件到页面ReactDOM.render(<BrowserRouter><App/></BrowserRouter>,document.getElementById("root"),);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 3:57:53

tao-8k Embedding模型实战教程:本地化部署+WebUI交互+API集成

tao-8k Embedding模型实战教程&#xff1a;本地化部署WebUI交互API集成 1. 环境准备与快速部署 在开始使用tao-8k模型之前&#xff0c;我们需要先准备好基础环境。tao-8k是一个专门处理文本嵌入的开源模型&#xff0c;能够将文本转换成高维向量&#xff0c;特别适合处理长文本…

作者头像 李华
网站建设 2026/6/10 6:13:21

嵌入式Linux实战:用wait_event和wake_up实现按键驱动(附完整代码)

嵌入式Linux按键驱动开发&#xff1a;深入理解wait_event与wake_up机制 在嵌入式Linux开发中&#xff0c;设备驱动程序的编写是连接硬件与操作系统的关键环节。按键驱动作为最常见的外设驱动之一&#xff0c;其实现方式直接影响系统响应速度和资源利用率。本文将深入探讨如何利…

作者头像 李华
网站建设 2026/6/10 11:09:06

HALCON/C++实战:从图像处理到区域分析的完整流程

1. HALCON/C入门&#xff1a;为什么选择这个组合&#xff1f; 第一次接触HALCON/C时&#xff0c;我完全被它的高效震惊了。作为一个在工业视觉领域摸爬滚打多年的开发者&#xff0c;我见过太多图像处理库&#xff0c;但HALCON/C的组合确实与众不同。想象一下&#xff0c;你既拥…

作者头像 李华
网站建设 2026/6/10 11:02:30

前端日志美化指南:ansi_up + Vue实现控制台风格日志展示

前端日志美化指南&#xff1a;ansi_up Vue实现控制台风格日志展示 在复杂的现代Web应用中&#xff0c;日志系统是开发者调试和监控的"眼睛"。然而&#xff0c;当我们将后端生成的彩色日志直接呈现在前端时&#xff0c;常常会遇到ANSI颜色代码显示为乱码的问题。这不…

作者头像 李华