react 个人总结出来router 比较好用封装 用法类似Vue 路由嵌套

import Login from '../component/login/index'
import Index from '../component/index/index'
import Props from '../component/props/index'
import Events from '../component/event/index'

export const routes = [
	{
		path: '/home',
		component: Login
	},
	{
		path: '/index',
		component: Index,
		children: [
			{
				path: '/index/events',
				component: Events
			},
			{
				path: '/index/props',
				component: Props
			}
		]
	}
]

index文件是主要展示内容的 用了element ui

import React from 'react';
import { Menu } from 'element-react';
import './index.scss'
// import { CSSTransition } from 'react-transition-group'
import 'element-theme-default';
export default class Index extends React.Component {

	render() {
		let { routes } = this.props;	//取到传进来的路由表
		console.log(routes)
		return (

			<div className="p-index-page">
				<div className="p-left__menu">
					<Menu defaultActive="2" className="el-menu-vertical-demo">
						<Menu.SubMenu index="1" title={<span><i className="el-icon-message"></i>导航一</span>}>
							<Menu.ItemGroup title="分组一">
								<Menu.Item index="1-1">选项1</Menu.Item>
								<Menu.Item index="1-2">选项2</Menu.Item>
							</Menu.ItemGroup>
							<Menu.ItemGroup title="分组2">
								<Menu.Item index="1-3">选项3</Menu.Item>
							</Menu.ItemGroup>
						</Menu.SubMenu>
						<Menu.Item index="2"><i className="el-icon-menu"></i>导航二</Menu.Item>
						<Menu.Item index="3"><i className="el-icon-setting"></i>导航三</Menu.Item>
					</Menu>
				</div>
				<div className="p-right__content">
					<div className="p-nav-bar"></div>
					<div className="p-main__content">{this.props.children}</div>
				</div>
			</div>
		)
	}
}


最终调用的路由

import React, { Component } from 'react';
import { BrowserRouter as Router, Switch, Route, Redirect } from 'react-router-dom';
import { routes } from './routerList';	//路由表
class RouterView extends Component {
	render() {
		// let { routes } = this.props;	//取到传进来的路由表
		console.log(routes)
		let rdArr = routes.filter(item => item.redirect);	//把所以路由重定向取出来
		// let rdCom = rdArr.map((item, key) => <Redirect from={item.path} to={item.redirect} key={key} />);
		return (
			<Router>
				<Switch>
					{
						routes.map((item, index) => {
							if (item.children && item.children.length > 0) {

								return (
									<Route path={item.path} key={index} render={() => (
										<item.component> {
											item.children.map((children, childrenKey) => {
												return (
													<Route path={children.path} key={children.path} component={children.component}></Route>
												)
											})
										}
										</item.component>
									)} ></Route>
								)
							} else {
								return (
									<Route path={item.path} key={index} component={item.component}></Route>
								)
							}

						})
					}
				</Switch>
			</Router>
		);
	}
}
export default RouterView;

最终效果渲染出来类似这样的嵌套
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Router v6中,路由嵌套的写法有所改变。以下是一个示例: ```jsx import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; import { Outlet } from 'react-router-dom'; const App = () => { return ( <Router> <Routes> <Route path="/app" element={<ThisLayout />}> <Route path="/" element={<PostsList />} /> <Route path="/singlePostPage/:id" element={<SinglePostPage />} /> </Route> </Routes> </Router> ); }; const PostsList = () => { // ... return ( <section> <h2>posts</h2> {renderedPosts} <Outlet /> {/* 子路由渲染位置 */} </section> ); }; const SinglePostPage = () => { // ... }; const ThisLayout = () => { // ... }; export default App; ``` 在v6中,我们使用`Routes`组件来定义路由,而不再使用`Switch`组件。在父路由中,我们使用`Route`组件来定义子路由。子路由的元素可以通过`element`属性指定。在子路由的父组件中,我们可以使用`Outlet`组件来渲染子路由的内容。 希望这个例子能帮助你理解React Router v6中的路由嵌套写法。 #### 引用[.reference_title] - *1* [解决react-router-dom V6路由嵌套时子路由无法显示的问题](https://blog.csdn.net/frank7023/article/details/128913988)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [React Router v6 路由配置,嵌套路由](https://blog.csdn.net/Snow_GX/article/details/123656412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [react-router-dom v6版本 嵌套路由](https://blog.csdn.net/jzh1359314792/article/details/126526047)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值