React脚手架搭建项目知识点----路由(二)

news/2024/7/15 17:39:26 标签: react.js, javascript, 前端

一、路由的基本使用

  1. 明确好界面中的导航区、展示区
  2. 导航区的a标签改为Link标签
javascript"><Link to="/xxxxx">Demo</Link>
  1. 展示区写Route标签进行路径的匹配
javascript">{/* v5版本: */}
<Route path='/xxxx' component={Demo}/>

{/* v6版本: */}
<Route path='/xxxx' element={<Demo/>}/>
  1. 的最外侧包裹了一个或,用来管理路由
javascript">ReactDOM.render(
   <BrowserRouter>
     <App />
   </BrowserRouter>,
   document.getElementById('root')
)

二、NavLink与封装NavLink

  1. NavLink可以实现路由链接的高亮,通过activeClassName指定样式名
  2. 标签体内容是一个特殊的标签属性
  3. 通过this.props.children可以获取标签体内容

三、路由传参

1. params传参
    v5:
        路由链接(携带参数):
            <Link to={`/home/message/detail/${msg.id}/${msg.title}`}>{msgObj.title}</Link>
        注册路由(声明接收) :
            <Route path='/home/message/detail/:id/:title' component={Detail} /> 
        接收参数 :
            const { id,title } = this.props.match.params

    v6:(使用函数组件,并且通过引入 useParams 来实现参数的接收)
        路由链接(携带参数):
            <Link to={`detail/${msg.id}/${msg.title}`}>{msg.title}</Link>
        注册路由(声明接收):
            <Routes> 
                <Route path='detail/:id/:title' element={<Detail/>} /> 
            </Routes>
        接收参数 :
            import { useParams } from 'react-router-dom';
            const params = useParams(); 
            const {id,title} = params;

2. search传参
    v5:
        路由链接(携带参数):
            <Link to={`/home/message/detail?id=${msg.id}&title=${msg.title}`}>{msgObj.title}</Link>
        无需注册路由(正常注册) :
            <Route path='/home/message/detail' component={Detail} /> 
        接收参数 :
            import {qs} from 'querystring'
            const {search} = this.props.location;
            const {id,title} = qs.parse(search.slice(1)); //截取

    v6:(使用函数组件,并且通过引入 useSearchParams 来实现参数的接收)
        路由链接(携带参数):
            <Link to={`detail?id=${msg.id}&title=${msg.title}`}>{msg.title}</Link>
        无需注册路由(正常注册):
            <Routes> 
                <Route path='detail' element={<Detail/>} /> 
            </Routes>
        接收参数 :
            import { useSearchParams } from 'react-router-dom';
            const [params] = useSearchParams(); 
            const id = params.get('id');
            const title = params.get('title');

3. state参数(刷新界面也可以保留参数)
    v5:
        路由链接(携带参数):
            <Link to={{pathname:'home/message/detail',state:{id:msg.id,title:msg.title}}}>{msg.title}<Link/>
        无需注册路由(正常注册) :
            <Route path='/home/message/detail' component={Detail} /> 
        接收参数 :
            const {id,title} = this.props.location.state

    v6:(使用函数组件,并且通过引入 useLocation 来实现参数的接收)
        路由链接(携带参数):
            <Link to='detail' state={{id: msg.id, title: msg.title}}>{msg.title}</Link>
        无需注册路由(正常注册):
            <Routes> 
                <Route path='detail' element={<Detail/>} /> 
            </Routes>
        接收参数 :
            import { useLocation } from 'react-router-dom';
            const location = useLocation(); 
            const {id,title} = location.state;

四、编程式路由导航

1. v5
    // push跳转+携带params参数
    this.props.history.push(`/home/message/detail/${id}/${title}`);
    // push跳转+携带search参数
    this.props.history.push(`/home/message/detail?id=${id}&title=${title}`);
    // push跳转+携带state参数
    this.props.history.push(`/home/message/detail`, { id, title });

    // replace跳转+携带params参数
    this.props.history.replace(`/home/message/detail/${id}/${title}`)
    // replace跳转+携带search参数
    this.props.history.replace(`/home/message/detail?id=${id}&title=${title}`)
    // replace跳转+携带state参数
    this.props.history.replace(`/home/message/detail`, { id, title });

    // 前进
    this.props.history.goForward();
    // 回退
    this.props.history.back();
    // 前进或回退 ( go )
    this.props.history.go(-2); //回退到前2条的路由

    // 在一般组件中使用编程式路由导航 (非路由组件)
    import {withRouter} from 'react-router-dom'
    class Header extends Component {
        // withRouter(Header)后,就可以在一般组件内部使用 this.props.history 
        //...
    }
    export default withRouter(Header) // 将一般组件包裹后返回,使一般组件的props中也携带路由相关的三个参数


2. v6
    // v6版本编程导航使用 useNavigate (以下为引入代码)
    import {  useNavigate } from "react-router-dom";
    export default function A() {
        const navigate = useNavigate();
        //...
    }

    // push跳转+携带params参数
    navigate(`detail/${id}/${title}`);
    // push跳转+携带search参数
    navigate(`detail?id=${id}&title=${title}`);
    // push跳转+携带state参数
    navigate(`detail`, {state: { id, title }});

    // replace跳转+携带params参数
    navigate(`detail/${id}/${title}`, {replace: true})
    // replace跳转+携带search参数
    navigate(`detail?id=${id}&title=${title}`, {replace: true})
    // replace跳转+携带state参数
    navigate(`detail`, {state: { id, title }, replace: true});
    
    // 前进
    navigate(1);
    // 回退
    navigate(-1);
    // 前进或回退 ( go )
    navigate.go(-2); //回退到前2条的路由

    withRouter v6已被移除,v6中一般组件也可以使用useNavigate跳转,不需要withRouter

五、BrowserRouter与HashRouter的区别

1. 底层原理不一样:
    BrowserRouter使用的是H5的history API,不兼容IE9及以下版本。
    HashRouter使用的是URL的哈希值。
2. path表现形式不一样
    BrowserRouter的路径中没有#,例如: localhost:3000/demo/test
    HashRouter的路径包含#,例如: localhost:3000/#/demo/test
3. 刷新后对路由state参数的影响
    (1) BrowserRouter没有任何影响,因为state保存在history对象中
    (2) HashRouter刷新后会导致路由state参数的丢失!!!
4. 备注: HashRouter可以用于解决一些路径错误相关的问题。
附:解决多级路径刷新页面样式丢失的问题
  1. public/index.html 中 引入样式时不写./ 写 /(常用)
  2. public/index.html 中 引入样式时不写 ./ 写 %PUBLIC_URL% (常用)
  3. 使用HashRouter包裹 App组件

http://www.niftyadmin.cn/n/253206.html

相关文章

JS监测网络状态

JS监测网络状态 文章目录 JS监测网络状态1. navigator.onLine2. ajax请求3. 获取网络资源4. 监测online和offline事件 1. navigator.onLine 机器未连接到局域网或者路由器返回false&#xff0c;其它返回true。缺点是存在机器连接上没联通网络的路由器返回true的情况。 2. aja…

git 自学笔记

git 自学笔记 git 是一个开源的分布式版本控制软件&#xff0c;可以敏捷的处理任何大小项目。 git 的工作流程大体如下&#xff1a; 首先克隆一个git资源作为工作目录 在克隆的资源上添加或者修改文件 如果其他人也修改了&#xff0c;就要对资源进行更新 在提交时也要查看有没有…

C语言中的灵魂-指针

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;张磊|慕课网讲师 C 语言中的指针 C 语言的指针常常被人们认为是 C 语言中的灵魂所在&#xff0c;可以完成很多高难度的…

Rocky 9浅谈

Planned EOL: May 31 2032 镜像下载地址 配置网络 vim /etc/NetworkManager/system-connections/ens192.nmconnection[ipv4] # 23就是255.255.254.0 address1192.168.75.250/23,192.168.72.1 dns172.25.2.69 methodmanualnmcli connection reload /etc/NetworkManager/system…

AI如何帮助人类进而验证直觉的可靠性?

AI可以通过以下方式帮助人类寻找反例进行否定或寻找特别的架构&#xff1a; 1. 利用机器学习算法进行反例搜索。AI可以训练一个分类器&#xff0c;用于判断某个假设是否成立。通过反复训练和测试&#xff0c;AI可以识别出一些不合理的假设&#xff0c;并帮助人类进行进一步的验…

Replika:AI智能聊天机器人

【产品介绍】 Replika&#xff0c;这个名字可能有点拗口&#xff0c;但如果你知道这是复制品Replica的同音变体&#xff0c;你即刻能明白这个产品的定位了。官方Luka公司定义它是你的AI朋友&#xff0c;默默学习你&#xff0c;最终成为你的复制品。它不像现在市面上各大厂的AI助…

LinuxGUI自动化测试框架搭建(十八)-邮件服务模块封装(sendmail)

((十八)-邮件服务模块封装(sendmail) 1 测试目的2 测试需求3 需求分析4 详细设计4.1 设置邮件服务第三方客户端4.2 新建邮件服务模块脚本4.2 邮件服务脚本封装5 完整邮件服务源码6 目前框架结构1 测试目的 把测试结果或测试报告附在邮件的附件和正文,通过邮件发送给项目成…

特征选择算法 | Matlab 基于无限潜在特征选择算法(ILFS)的分类数据特征选择

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab 基于无限潜在特征选择算法(ILFS)的分类数据特征选择 部分源码 %