尽管写过 outlet 路由的配置。
考虑到 token 判定和 路由页 变更,我不了解v6是不是有更详解的做法。

决定调一下配置,期望 在任何页面异步更新时,token 都可以在跳转前 被检测到,防止无 token 跳转发生。

为 src 文件配置 v6版本:路由子组件

App.js
import { HashRouter, Routes, Route } from 'react-router-dom';
import Main from './main';
import Login from './page/login'
import Home from './page/home/home'
import About from './page/about/about'
import Integrated from './page/integrated/integrated'
import Sidebar from './page/sidebar/sidebar'
import Latent from './page/latent/latent'
import Particulars from './page/particulars/particulars'
import SecurityCheck from './page/securityCheck/securityCheck'
function App() {
{/* 默认显示页面将不需要填写路径 ,子路由不需要写/斜杠跳转时会带有*/ }
return (
<HashRouter>
<Routes>
{/* Main 负责token的判定(刷新和前往) */}
<Route path='/' element={<Main />} >
<Route path='/login' element={<Login />} ></Route>
<Route path='/about' element={<About />} >
<Route path='' element={<Integrated />} ></Route>
<Route path='sidebar' element={<Sidebar />} >
<Route path='' element={<Latent />} ></Route>
<Route path='particulars' element={<Particulars />} ></Route>
<Route path='securityCheck' element={<SecurityCheck />} ></Route>
</Route>
</Route>
<Route path='/home' element={<Home />} ></Route>
</Route>
</Routes>
</HashRouter>
);
} export default App;
index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App'; const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
创建和 App.js 、index.js 同级别的 main.js
// main 组件, 充当 路由子组件的主体
// 判定 page页发生改变
// 判定 token 的 状态变更
// 判定 不存在的页面 404~ import React, { Component, useEffect, useState } from 'react'
import { Outlet, useLocation, useNavigate } from 'react-router-dom';
import storage from './util/storage'; const Index = () => {
const location = useLocation(); //获取生命周期钩子(页面变化)
const [pathname, setpathname] = useState() //监听地址变化
const navigate = useNavigate(); //获取生命周期钩子(page跳转)
const Token = storage.get('token'); //获取本地缓存:token
const [newToken, oldToken] = React.useState(Token)
// console.log('Main页打印Token:', Token)
// console.log('Main页打印location.pathname', location.pathname) // let Daa={
// pathname:'', //地址名
// token:'',//附加token
// }
// const [allData,setAllData] =React.useState(Daa) //上下文数据 useEffect(() => { //监听location变化
if (!Token) { //不存在
if (location.pathname === '/') { //地址栏不全
navigate('/login')
}
else if (location.pathname != '/login') {//地址为登录后
navigate('/login')
}
} else { //存在
if (location.pathname === '/') { //地址栏不全
navigate('/login')
}
}
setpathname(location.pathname) //更新page页面名
}, [location])
return <Outlet context={[newToken, oldToken]}></Outlet>
} export class Main extends Component {
render() {
return (
<>
<Index />
</>
)
}
}
export default Main

在src中,创建 util 配置文件夹

配置 storage.js
var storage = {
set(key, value) { // 添加/编辑 缓存
localStorage.setItem(key, JSON.stringify(value)) },
get(key) { // 取出缓存数据
return JSON.parse(localStorage.getItem(key)) }, remover(key) { // 移除指定缓存
localStorage.removeItem(key) }
} export default storage;

为page文件创建

login.js 组件
import React, { Component } from 'react'
import storage from '../../util/storage'
import { useNavigate, useOutletContext } from 'react-router-dom'; const Login = () => {
const [newToken, oldToken] = useOutletContext();
const navigate = useNavigate();
let params = {
message: '这是跳转时携带的参数',
}
const storageToken = () => {
if (!newToken) {
storage.set('token', '这是被存储的token')
navigate('/about', { state: params });
} else {
storage.remover('token')
}
oldToken(() => { return storage.get('token')})
} const Btn = () => {
if (!newToken) {
return <>
<button onClick={storageToken}>点击缓存token</button>
</>
} else {
return <>
<button onClick={storageToken}>点击清除token</button>
</>
}
} return <>
<h4>这里是登录前</h4>
<Btn />
<br />
<span>{newToken}</span>
</>
}
export default Login

about.js 组件
import React from 'react';
import { Outlet, useNavigate, useLocation } from 'react-router-dom'; export default function About() {
const navigate = useNavigate();
// 需要注意的是 useNavigate() 跳转只能在无状态组件中进行
let ddd = ['c', 'n'] const [count, setCount] = React.useState(ddd); // 数据共享
// 需要注意的是,它只能传入两组字段,一组为原始数据,一组变更数据,用作对比时,每次数据变动
// 页面随之更新 传入的数据类型由自己决定 const state = useLocation() //接收参数
console.log('state', state) // navigate('', {}) // 前往默认页
// navigate('/home', {}) // 前往其他页
// navigate('文件名/子文件', {}) //前往子级
// navigate('文件名', {replace: true}) //前往当前路由其他同级页 replace: true 重定向
return (
<>
<h4>About</h4>
<button onClick={() => {
navigate('test', { state: ddd });
// state 传参不限制传参类型
}}>点击Test页</button>
<Outlet context={[count, setCount]} />
</>
)
}

React学习时,outlet配置(token判定,页面path监听)的更多相关文章

  1. 开始学习Django,配置静态登录页面

    开始学习Django,配置静态登录页面 准备阶段 众所周知,Django是一个重量级的设备齐全的web开发框架.在学习Django前我们需要具备如下的知识点: python基础编程 并发 网络编程 H ...

  2. js和jquery实现页面滚动监听

    js和jquery实现页面滚动监听 一.总结 一句话总结:onscroll方法和监听页面元素的高度都可以实现滚动监听. 1.onscroll方法实现滚动监听的核心代码是什么? <body ons ...

  3. jQuery页面滚动监听事件及高级效果插件

    jQuery页面滚动监听事件及高级效果插件 1. One Page scroll (只适用于上下焦点图)http://www.thepetedesign.com/demos/onepage_scrol ...

  4. 配置redis开机自启动和监听

    redis安装好后,每次手动启动很不方便,配置开机自启动. 方法一:设置启动命令到/etc/rc.d/rc.local rc.local文件是系统全局脚本文件,会在其他开机进程脚本文件执行完毕后执行该 ...

  5. android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人

    要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上 ...

  6. ionic2+Angular ionScroll页面滑动监听

    第一:需要在组件中引入相关模块: 第二:如果只是监听页面滑动,只需要标注@ViewChild(Content) content: Content;就可以了. 附加:如果要监听页面的某个元素,并对其进行 ...

  7. JS学习笔记(一)DOM事件和监听

    将事件绑定到元素身上的三种方法: 1.HTML事件处理程序(不推荐使用) 1 <a onclick="hide()"> 2.传统的DOM事件处理程序 即在目标DOM事件 ...

  8. vue页面内监听路由变化

    beforeRouteEnter (to, from, next) { // 在渲染该组件的对应路由被 confirm 前调用 // 不!能!获取组件实例 `this` // 因为当钩子执行前,组件实 ...

  9. 配置非默认端口的监听Listener

  10. springboot启动配置原理之三(事件监听机制)

    ApplicationContextInitializer public class HelloApplicationContextInitializer implements Application ...

随机推荐

  1. 人工智能NVIDIA显卡计算(CUDA+CUDNN)平台搭建

    NVIDIA是GPU(图形处理器)的发明者,也是人工智能计算的引领者.我们创建了世界上最大的游戏平台和世界上最快的超级计算机. 第一步,首先安装N卡驱动. cby@cby-Inspiron-7577: ...

  2. 关于 IDP 的五大认知误解

    内部开发者平台(IDP)是近年来在希望加快软件交付和改善开发者体验的企业中得到普及的一个概念.然而,大众对于什么是 IDP 以及它能为开发者和企业带来什么也有很多困惑和误解.在这篇文章中,我们将尝试解 ...

  3. YII2.0的文件上传, 并把文件名称重新编译

    /** *@Action 文件上传示例 *@这里我们演示的是一个YII2.0的文件上传, 并把文件名称重新编译 *@我们上传的是一个叫 photo 的jpg和png格式的文件 */ Controlle ...

  4. Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】

    一.VsCode 常见的配置 1.取消更新 把插件的更新也一起取消了 2.设置编码为utf-8:默认就是了,不用设置了 3.设置常用的开发字体:Consolas, 默认就是了,不用设置了 字体对开发也 ...

  5. extend笔记

    JavaScript面向对象 继承extend 1. 概念(主要用途) 将子类中的共性代码 ( 属性和方法 ) 抽取出来 放到父类中 每当有一个新的子类需要用到共性的属性或者方法时 不需要在自己内容复 ...

  6. 关于spring嵌套事务,我发现网上好多热门文章持续性地以讹传讹

    事情起因是,摸鱼的时候在某平台刷到一篇spring事务相关的博文,文章最后贴了一张图.里面关于嵌套事务的表述明显是错误的. 更奇怪的是,这张图有点印象.在必应搜索关键词PROPAGATION_NEST ...

  7. JS 实现关键字文本搜索 高亮显示

    示例:  利用字符串的 split 方法,通过搜索的关键字分割成数组  在利用数组的 join 方法拼接成字符串 我是利用mock的省份 1 <template> 2 <div cl ...

  8. [C++核心编程] 2、引用

    文章目录 2 引用 2.1 引用的基本使用 2.2 引用注意事项 2.3 引用做函数参数 2.4 引用做函数返回值 2.5 引用的本质 2.6 常量引用 2 引用 2.1 引用的基本使用 **作用: ...

  9. 从浏览器输入域名开始分析DNS解析过程

    摘要:DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于 TCP/IP 网络. 本文分享自华为云社区<DNS那些事--从浏 ...

  10. 2022-09-29:在第 1 天,有一个人发现了一个秘密。 给你一个整数 delay ,表示每个人会在发现秘密后的 delay 天之后, 每天 给一个新的人 分享 秘密。 同时给你一个整数 forg

    2022-09-29:在第 1 天,有一个人发现了一个秘密. 给你一个整数 delay ,表示每个人会在发现秘密后的 delay 天之后, 每天 给一个新的人 分享 秘密. 同时给你一个整数 forg ...