React 使用 Outlet默认渲染页面

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

前言:在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 、 临时缓存。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Context(React 上下文)是 React 提供的一项能力,它能够在组件树中传递数据,无需手动一层层地传递数据。React 提供了一个 `React.createContext` 方法来创建一个 Context 对象,该对象包含了两个组件: `Provider` 和 `Consumer`。 React Outlet 是基于 React Context 实现的一种状态管理方案。它提供了一个 `OutletProvider` 组件,负责向子组件传递状态;以及一个 `OutletConsumer` 组件,用于在子组件中获取状态。使用 React Outlet 可以减少 props 层层传递的繁琐过程,可以在 React 组件树的任何位置获取到状态。 使用 React Outlet 需要先安装 `react-outlet` 包。然后在需要使用 OutletProvider 的组件中引入 `OutletProvider` 组件,并将需要共享的状态放在 `value` 属性中。在需要使用状态的组件中引入 `OutletConsumer` 组件,并使用 render props 将状态传递给子组件。例如: ```jsx import React from 'react'; import { OutletProvider, OutletConsumer } from 'react-outlet'; function App() { return ( <OutletProvider value={{ count: 0 }}> <div> <h1>Counter</h1> <OutletConsumer> {({ count }) => ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> )} </OutletConsumer> </div> </OutletProvider> ); } ``` 在上面的例子中,`OutletProvider` 组件将 `{ count: 0 }` 这个对象作为共享状态传递给了其子组件。`OutletConsumer` 组件则通过 render props 获取到共享状态中的 `count` 属性,并将其传递给子组件。这样,子组件就可以获取到父组件中的状态,而不需要通过 props 层层传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值