react路由总结

目录

一、脚手架基础语法(16~17)

1.1、hello react

1.2、组件样式隔离(样式模块化)

1.3、react插件

二、React Router v5

2.1、react-router-dom相关API

2.1.1、内置组件

2.1.1.1、BrowserRouter

2.1.1.2、HashRouter

2.1.1.3、Route

2.1.1.4、Redirect

2.1.1.5、Link

2.1.1.6、NavLink

2.1.1.7、Switch

2.1.2、其它

2.1.2.1、history对象

2.1.2.2、match对象

2.1.2.3、withRouter对象

2.2、向路由组件传参

2.2.1、传递params参数

2.2.2、传递search参数

2.2.3、传递state参数

2.3、编程式路由导航跳转

三、React Router v6

3.1、一级路由

3.2、重定向

3.3、NavLink高亮

3.4、useRoutes

3.5、嵌套路由

3.6、路由传参

3.6.1、params

3.6.2、search

3.6.3、state

3.7、编程式路由导航

3.8、use拓展

四、V6 pk V5

一、脚手架基础语法(16~17)

1.1、hello react

1.2、组件样式隔离(样式模块化)

已知:vue2通过scoped来防止组件样式冲突

react解决方法:样式模块化(CSS Modules)

使用方法:
1、将 CSS 文件命名为 [name].module.css
2、在组件中导入样式模块,并使用对象属性访问样式类名。

import "./hello.css";//直接引入
import styles from "./hello.module.css";//样式模块化
<h2 className={styles.title}>hello react!</h2>

补充:Styled Components、Emotion、Shadow DOM 和 CSS 命名空间等方案也可以。

1.3、react插件

VScode插件搜索react:ES7+ React/Redux/React-Native snippets

输入rcc:类组件   rfc:函数组件回车即可

更多快捷代码块:vscode-react-javascript-snippets/docs/Snippets.md at 185bb91a0b692c54136663464e8225872c434637 · r5n-labs/vscode-react-javascript-snippets · GitHub

二、React Router v5

1、SPA:单页面应用

      (1)、点击页面中的链接不会刷新页面,只做页面的局部刷新

      (2)、数据都通过ajax请求获取,并在前端异步展现

2、路由:一个路由就是一个映射关系(key:value)

      key为路径,value可能是function【后端路由】或component【前端路由】

      前端:当浏览器的path变为/XX时,当前路由组件就会变为XX组件,依赖浏览器的 hash history API来管理 URL 状态。

2.1、react-router-dom相关API

下载:npm i react-router-dom@5

路由组件和一般组件接收的props不同,前者会接收到三个history、location、match固定属性。

2.1.1、内置组件

import { BrowserRouter as Router, Route, Switch, Redirect,Link } from 'react-router-dom'
export default class App extends Component {render() {return (<div><Router>
{/* Switch虽然在v5版本不是必须的,但是基本都会用到,只让页面匹配上一个,不能匹配上多个 */}<Switch>
<Route path='/' exact render={() => <Redirect to='/index'></Redirect>}></Route>
<Route path='/index' render={(props) => {
//想要进入到主页,如果此时还未登录就重定向到登录页,如果已经登陆了就进入首页if (isLogin()) {
// Home组件并不是路由组件,render的函数式组件才是真正的路由组件,需要把props的内容传到Home组件中。return <Home {...props}></Home>} else {return <Redirect to='/login'></Redirect>}
}}></Route>
<Route path='/login' render={(props) => {if (isLogin()) {return <Redirect to='/index/home'></Redirect>} else {return <Login {...props}></Login>}
}}></Route></Switch><div className="left-side"><Link to="/about">About</Link><Link to="/home">Home</Link></div><div className="right-content"><Route path="/about" component={About}></Route><Route path="/home" component={Home}></Route></div></Router></div>)}
}
2.1.1.1、BrowserRouter

使用 HTML5 history API 来保持URL 路径不带 #,适合现代 Web 应用

2.1.1.2、HashRouter

使用 # 来管理 URL,适合不支持HTML5 history API的老版本浏览器,刷新后会导致路由参数丢失

2.1.1.3、Route

<Route> :用于定义路径和对应组件的基本单元

<Route path="/home" component={<Home />} />
2.1.1.4、Redirect

重定向:<Redirect to='/index'></Redirect>

2.1.1.5、Link

是React Router提供的用于页面跳转的组件,类似于HTML的<a>标签,但不会引起页面刷新

2.1.1.6、NavLink

特殊的<Link>,添加了活动样式(activeClassName),通过this.props.children获取标签体内容

<NavLink to="/home" activeClassName="active">Go to Home</NavLink>
2.1.1.7、Switch

只让页面匹配上一个,不能匹配上多个,提高路由匹配效率

拓展:

        路由默认使用模糊匹配,如果开启严格匹配【exact={true}】的话,有时会导致无法继续匹配二级路由,不要随便开启。

2.1.2、其它

2.1.2.1、history对象

管理浏览器的会话历史。例如推送新的路径、替换当前路径和返回上一页等处理导航的方法。

 const history = useHistory();const handleNavigation = () => {history.push('/new-path'); // 导航到新的路径};
2.1.2.2、match对象

包含了与当前路由匹配的信息,它通常在路由组件中作为 props 传递。

const User = ({ match }) => {return <div>User ID: {match.params.userId}</div>;
};
const App = () => (<Route path="/users/:userId" component={User} />
);
2.1.2.3、withRouter对象

高阶组件,用于将history、location 和match对象作为props传递给包装的组件,将一般组件加工,让其具备路由组件所特有的API。

const MyComponent = ({ history, location, match }) => {const handleNavigation = () => {history.push('/new-path'); // 导航到新的路径};return (<div><h1>Current Path: {location.pathname}</h1><button onClick={handleNavigation}>Go to New Path</button></div>);
};
export default withRouter(MyComponent);

类组件应用路由跳转:

import React from 'react';
import { withRouter } from 'react-router-dom';
class MyComponent extends React.Component {handleNavigate = () => {const { history } = this.props;history.push('/new-route');};render() {return (<div><button onClick={this.handleNavigate}>Go to New Route</button></div>);}
}
export default withRouter(MyComponent);

2.2、向路由组件传参

2.2.1、传递params参数

类组件 :

函数组件:

const User = ({ match }) => {const { userId } = match.params;return <div>User ID: {userId}</div>;
};

2.2.2、传递search参数

类组件 :

函数组件:

import { useLocation } from 'react-router-dom';
const User = () => {const location = useLocation();const searchParams = new URLSearchParams(location.search);const name = searchParams.get('name');const age = searchParams.get('age');return (<div><p>Name: {name}</p><p>Age: {age}</p></div>);
};

2.2.3、传递state参数

类组件:

函数组件:

import { useLocation } from 'react-router-dom';
const User = () => {const location = useLocation();const { id,title } = location.state || {};return (<div><p>From Dashboard: {id}---{title}</p></div>);
};

总结:

1、params:通过路由路径传递参数,使用match.params接收。
2、search:通过查询字符串传递参数,使用location.searchqs.parse【基于类组件】、location.searchURLSearchParams基于函数组件接收。
3、state:通过history.pushLink的to属性传递任意对象,使用location.state接收。

补充:useHistory、useLocation、useParams等Hook在React 16.8之后才可用,并通过withRouterHOC进行路由的高阶组件包装。

2.3、编程式路由导航跳转

函数组件:

import React from 'react';
import { useHistory } from 'react-router-dom';
const MyComponent = () => {const history = useHistory(); // 获取 history 对象const handleNavigate = () => {history.push('/new-route');};return (<div><button onClick={handleNavigate}>Go to New Route</button></div>);
};
export default MyComponent;

类组件:

<button onClick={() => this.pushShow(item.id, item.title)}>push查看</button>
<button onClick={() => this.replaceShow(item.id, item.title)}>replace查看</button>
replaceShow = (id, title) => {this.props.history.replace(`/homes/message/detail/${id}/${title}`);this.props.history.replace(`/homes/message/detail/?id=${id}/title=${title}`);this.props.history.replace(`/homes/message/detail`,{id,title});};
pushShow = (id, title) => {this.props.history.push(`/homes/message/detail/${id}/${title}`);this.props.history.push(`/homes/message/detail/?id=${id}/title=${title}`);this.props.history.push(`/homes/message/detail`,{id,title});};

三、React Router v6

下载:npm i react-router-dom@6

3.1、一级路由

Routes:它用来包裹所有的<Route>,并且确保只渲染匹配的第一个 <Route>

<Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} />
</Routes>

3.2、重定向

<Route path="/" element={<Navigate to="/about" />}></Route>

3.3、NavLink高亮

function computedClassName({ isActive }) {return isActive ? "list-item active" : "list-item";
}
<NavLink className={computedClassName} to="/about">About</NavLink>
<NavLink className={computedClassName} to="/homes">Home</NavLink>

3.4、useRoutes

3.5、嵌套路由

<Outlet />是一个占位符组件,用来渲染匹配的子路由的内容,父路由通常会渲染一个包含 <Outlet /> 的组件,这样它就可以根据当前的 URL 渲染子路由对应的组件。

3.6、路由传参

3.6.1、params

<Route path="/user/:id" element={<UserProfile />} />
// UserProfile 组件中接收 params 参数
import { useParams } from 'react-router-dom';
const UserProfile = () => {const { id } = useParams();return <div>User ID: {id}</div>;
};

3.6.2、search

	const [searchParams] = useSearchParams();const q = searchParams.get("q"); // 获取查询参数 'q'const page = searchParams.get("page"); // 获取查询参数 'page'return (<div><h1>搜索结果</h1><p>查询关键词:{q}</p><p>当前页码:{page}</p></div>);
<Link to="/search?keyword=react">搜索React</Link>
// 在组件中接收查询参数
import { useLocation } from 'react-router-dom';
const Search = () => {const location = useLocation();const query = new URLSearchParams(location.search);const keyword = query.get("keyword");return <div>搜索关键词:{keyword}</div>;
};

3.6.3、state

<Link to={{ pathname: '/detail', state: { id: 1, name: 'React' } }}>详情</Link>
// 在目标组件中接收 state 参数
import { useLocation } from 'react-router-dom';
const Detail = () => {const location = useLocation();const { id, name } = location.state || {};return (<div><p>ID:{id}----------名称:{name}</p></div>);
};

总结:

1、params:通过路由路径传递参数,使用useParams钩子接收。
2、search:通过查询字符串传递参数,使用useSearchParams或者useLocationURLSearchParams解析。
3、state:通过LinkuseNavigate传递状态参数,使用useLocation.state 来接收。

3.7、编程式路由导航

 const navigate = useNavigate();const handleClick = () => {// 导航到 "/about" 页面,state参数写在对象里,params与search参数之间写url里navigate('/about', { state: { fromDashboard: true } });};

3.8、use拓展

useInRouterContext:检查组件是否在路由上下文中。
useNavigationType:获取当前导航类型(POP、PUSH、REPLACE)。
useOutlet:在父路由中渲染子路由的元素。
useResolvedPath:解析路径并返回路径对象

四、V6 pk V5

V6相比V5,进行了以下改动:

1、Routes代替了Switch、Navigate代替了Redirect;
2、useNavigate代替了useHistory,新增useParams、useLocation等,官方推荐函数组件
3、路由匹配变得更精确,支持嵌套路由和动态路由的定义。
4、Route 组件的 API 也发生了改变,不再需要 component 或 render 属性,使用element 属性来传递渲染的组件。

若项目使用的是React 16.3 ~16.7,只能使用React Router v5
若项目使用的是 React 16.8 或更高版本,可以选择React Router v5React Router v6,但建议使用v6,因为它包含了最新的功能和更简洁的 API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内外网隔离文件传输解决方案|系统与钉钉集成+等保合规,安全提升70%

一、背景与痛点 在内外网隔离的企业网络环境中&#xff0c;员工与外部协作伙伴&#xff08;如钉钉用户&#xff09;的文件传输面临以下挑战&#xff1a; 1. **安全性风险**&#xff1a;内外网直连可能导致病毒传播、数据泄露。 2. **操作繁琐**&#xff1a;传统方式需频繁切…

多线程篇学习面试

多线程 1.乐观锁、CAS思想 java乐观锁机制&#xff1a; ​ 乐观锁体现的是悲观锁的反面。它是一种积极的思想&#xff0c;它总是认为数据是不会被修改的&#xff0c;所以是不会对数据上锁的。但是乐观锁在更新的时候会去判断数据是否被更新过。乐观锁的实现方案一般有两种&a…

云服务器和物理服务器该如何选择

随着互联网的快速发展&#xff0c;企业大多都会选择云服务器和物理服务器进行使用&#xff0c;那么对于云服务器和物理服务器两者之间该如何进行选择呢&#xff1f; 云服务器可以为用户和企业提供网站处理中等到高流量所需要的一切&#xff0c;云服务器中的高可用能性功能&…

将产品照片(form.productPhotos)转为 JSON 字符串发送给后端

文章目录 1. 前端 form.productPhotos 的当前处理a. 组件绑定b. 当前发送逻辑 2. 如何将 form.productPhotos 转为 JSON 字符串发送给后端a. 修改前端 save() 方法b. 确保 esave API 支持接收字符串 基于你提供的 identify-form.vue 代码&#xff0c;我将分析如何将产品照片&a…

SpringCloud系列教程:微服务的未来(二十五)-基于注解的声明队列交换机、消息转换器、业务改造

前言 在现代分布式系统中&#xff0c;消息队列是实现服务解耦和异步处理的关键组件。Spring框架提供了强大的支持&#xff0c;使得与消息队列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成变得更加便捷和灵活。本文将深入探讨如何利用Spring的注解驱动方式来配置和管理队…

国产编辑器EverEdit - 文本编辑器的关键特性:文件变更实时监视,多头编辑不掉坑

1 监视文件变更 1.1 应用场景 某些时候&#xff0c;用户会使用多个编辑器打开同一个文件&#xff0c;如果在A编辑器修改保存&#xff0c;但是B编辑器没有重新打开&#xff0c;直接在B编辑器修改再保存&#xff0c;则可能造成在A编辑器中修改的内容丢失&#xff0c;因此&#x…

HAProxy介绍与编译安装

目录 1、HAProxy介绍 2、HAProxy编译安装 Centos 基础环境 Ubuntu 基础环境 编译安装HAProxy 验证HAProxy版本 HAProxy启动脚本 配置文件 启动haproxy 验证haproxy状态 查看haproxy的状态页面 1、HAProxy介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年…

python类型转换深浅拷贝

1.类型转换 1.1 int(x):转化为一个整数&#xff0c;只能转换由纯数字组成的字符串 float->int 浮点型强转整形会去掉小数点后面的数&#xff0c;只保留整数部分 a 1.2 print(type(a)) #<class float> b int(a) print(type(b)) #<class int>print(int…

分布式光纤声波振动技术在钻井泄漏检测中的应用

在石油天然气的钻井作业中&#xff0c;及时发现并定位泄漏点对于保障开采安全、降低环境污染以及避免经济损失至关重要。传统的泄漏检测方法往往存在局限性&#xff0c;而分布式光纤声波振动技术凭借其独特的优势&#xff0c;正逐渐成为钻井过程中寻找泄漏的有力工具。 技术原理…

rtconfig.cpython-313.pyc 在 .gitignore文件中写入 *.pyc 文件仍然没有被忽略?

在 .gitignore 文件中添加 *.pyc 和 *.*.pyc 规则时&#xff0c;如果 .pyc 文件仍然没有被忽略&#xff0c;可能有以下几种原因&#xff1a; 1. 已经被 Git 跟踪的文件 即使您在 .gitignore 中指定了忽略 .pyc 文件&#xff0c;Git 仍然会跟踪已经被提交到版本库中的文件。如…

机器学习---KNN算法核心原理和思路分析

文章目录 1.算法介绍2.过拟合和欠拟合3.几种不同的距离4.特征的归一化处理 特此声明&#xff1a;该内容是学习耿直哥的相关机器学习理论&#xff0c;也是文章里面的部分图片素材的来源 1.算法介绍 KNN全称叫做K Nearset Neighbor,翻译之后就是K个最近的邻居&#xff1b; 其实…

书生大模型实战营14-MindSearch深度解析实践

文章目录 L2——进阶岛MindSearch深度解析实践1 MindSearch 简介2 开发环境配置2.1. 打开codespace主页&#xff0c;选择Blank模板进行创建2.2. 创建conda环境隔离并安装依赖 3. 获取硅基流动API KEY4. 启动MindSearch4.1. 启动后端4.2. 启动前端 5. 部署到自己的 HuggingFace …

uniapp实现app的pdf预览

实现效果 文件准备 static下添加该pdf文件&#xff08;下载地址&#xff1a;https://gitee.com/shallow-winds/resource_package/tree/master/%E6%96%B9%E6%B3%95%E4%B8%80/html&#xff09; 使用web-view进行展示&#xff1a; 在这里插入代码片 <web-view :src"u…

重启 nginx

首先确认Nginx是否已经安装&#xff0c;并检查它的安装位置。 执行以下命令来检查&#xff1a; which nginx#例如&#xff1a;显示/usr/local/nginx/sbin/nginx方法1&#xff1a;直接使用完整路径启动Nginx 1.1、启动 Nginx&#xff0c;执行命令&#xff1a; sudo /usr/loca…

java实现多图合成mp4和视频附件下载

java实现多图合成mp4和视频附件下载 在wutool中&#xff0c;封装了视频处理工具类&#xff0c;基于javacv和ffmpeg库&#xff0c;实现多图合成mp4、视频http附件下载等。 关于wutool wutool是一个java代码片段收集库&#xff0c;针对特定场景提供轻量解决方案&#xff0c;只…

ollama修改监听ip: 0.0.0.0

确认Ollama绑定IP地址 默认情况下&#xff0c;Ollama可能仅监听本地回环地址&#xff08;127.0.0.1&#xff09;。要允许外部访问&#xff0c;需将其配置为监听所有IP&#xff08;0.0.0.0&#xff09;或指定IP&#xff08;如10…19&#xff09;。 修改启动命令&#xff08;推荐…

STM32-温湿度上传OneNET项目

一、项目需求 使用 ESP8266 连接 OneNET 云平台&#xff0c;并通过 MQTT 协议上传 DHT11 获取的温湿度值。 二、项目框图 三、DHT11工作原理 参考于良许嵌入式手把手教你玩转DHT11&#xff08;原理驱动&#xff09; | 良许嵌入式 3.1 正常工作验证 #​ 上电后&#xff…

百度首页上线 DeepSeek 入口,免费使用

大家好&#xff0c;我是小悟。 百度首页正式上线了 DeepSeek 入口&#xff0c;这一重磅消息瞬间在技术圈掀起了惊涛骇浪&#xff0c;各大平台都被刷爆了屏。 百度这次可太给力了&#xff0c;PC 端开放仅 1 小时&#xff0c;就有超千万人涌入体验。这速度&#xff0c;简直比火…

Ubuntu:wvp-GB28181-pro安装、运行

参考 https://doc.wvp-pro.cn 下载源码 GitHub - 648540858/wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台&#xff0c;支持NAT穿透&#xff0c;支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联&#xff0c;支持rtsp/rtm…

c++入门-------命名空间、缺省参数、函数重载

C系列 文章目录 C系列前言一、命名空间二、缺省参数2.1、缺省参数概念2.2、 缺省参数分类2.2.1、全缺省参数2.2.2、半缺省参数 2.3、缺省参数的特点 三、函数重载3.1、函数重载概念3.2、构成函数重载的条件3.2.1、参数类型不同3.2.2、参数个数不同3.2.3、参数类型顺序不同 前言…