React 使用 Outlet默认渲染页面

本文介绍了在React中使用HashRouter进行路由配置,包括页面跳转和数据传递的方法。通过使用`useNavigate`进行导航和`useOutletContext`接收父页面的数据。文章提到了在HashRouter下参数刷新丢失的问题,并建议通过父组件传递数据或使用无状态组件和hook来解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:在React版本更新到现在,路由的页面跳转已经非常丰富,当然封装方法也是各种各样。

由于比较懒,所以选择以Outlet 默认渲染页面。但对于数据如何父传子,以及子如何调用父页面困扰了一段时间,以此写此文,防止忘记。

路由配置文件  App.js

import { HashRouter, Routes, Route } from 'react-router-dom';
import Login from './page/login'
import Home from './page/home'
import About from './page/about/about'
import Integrated from './page/integrated/integrated'
// import Sidebar from './page/sidebar'
import Sidebar from './page/sidebar/index.tsx'
import Latent from './page/latent/latent'
import Particulars from './page/particulars/particulars'
import SecurityCheck from './page/securityCheck/securityCheck'
import { AdminStoreContext } from './utils/context/Context';
import Test from './page/test';
function App() {
  {/* 如果需要默认显示页面将不需要填写路径 ,子路由不需要写/斜杠跳转时会带有*/ }
  return (
    <HashRouter>
      <Routes>
        <Route path='/' element={<Login />} ></Route>
        <Route path='/home' element={<Home />} >
          {/* <Route path='' element={<Particulars AdminStoreContext ={AdminStoreContext } />} ></Route> */}
          {/* <Route path='securityCheck' element={<SecurityCheck />} ></Route> */}
        </Route>

        {/* 一级路由about */}
        <Route path='/about' element={<About />} >
          {/* 二级默认路由Integrated */}
          <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 path='test' element={<Test />}></Route>
        </Route>
      </Routes>
    </HashRouter>
  );
}

export default App;

以Page文件夹about.js 为例

import React from 'react';
import { Outlet, useNavigate} from 'react-router-dom';

export default function About() {
    const navigate = useNavigate(); 
    // 需要注意的是 useNavigate() 跳转只能在无状态组件中进行 
    let ddd=['c','n']

    const [count, setCount] = React.useState(ddd); // 数据共享
    // 需要注意的是,它只能传入两组字段,一组为原始数据,一组用于变更数据,用作对比时,每次数据变动
    // 页面随之更新  传入的数据类型由自己决定

    //  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]} />
        </>
    )
}

<button onClick={() => {navigate('sidebar/securityCheck', { state: ddd }); }}>点击</button> 

<button onClick={() => {navigate('/home')

        // 跳转不同页  '/'+页名

}}>跳转home不同页</button>

 

 Page文件test.js (这里的test是作为about二级页面的内嵌页在使用)  即:

 

import React, { Component } from 'react'
import { useOutletContext } from 'react-router-dom';
const Test = () => {
    const [count, setCount] = useOutletContext(); 
    console.log('count',count)
    //useOutletContext 路由内置方法,监听数据发生变动
    //只能传两个参数,类型由父文件决定
    const increment = () => setCount((c) => c + 1);
    return <button onClick={increment}>{count}</button>;
}
export default Test

注意事项:HashRouter 会使 跳转时传入的参数,刷新时丢失。

好处是:参数不是通过url地址拼接带入的,这使页面看上去较简介。

解决办法:可以在父页面传入需要渲染的数据,而不是参数。react推荐对与业务上无关的组件,使用无状态组件。或者hook 、 临时缓存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值