使用useRoutes时如何统一设置title

常规遍历路由的方式大家都熟悉了,这里就不赘述了,这里主要是介绍使用useRoutes时,怎么统一设置title

可以用一个Layout组件包裹element,然后设置title可以写在Layout里面,当然也可以就写在app里面,看个人喜好

react-router-dom版本

"react-router-dom": "^6.4.2",

App.js

import { useRoutes } from 'react-router-dom';
import { routeList } from '@pages/routers';
import Layout from './Layout';
function App() {
  const element = useRoutes(routeList);
  return (
          <Layout>
            {element}
          </Layout>
  );
}

export default App;

Layout.js

  • matchPath(route.path,pathname)
  • 如果你的路由是树形的,那就要转成数组,不是的话直接遍历,用matchPath匹配到和你当前pathname一致的路由就会返回一个对象,否则就返回null
import { useCallback, useEffect, useMemo } from 'react';
import { useLocation,  useMatch, matchPath } from 'react-router-dom';
import { routeList } from './routers';
// 树形转数组
export const treeToArray = (arrayList) => {
  const list = [];
  const listFun = (ll) => {
      ll.map(li => {
              list.push(li);
              const children = li.children
              if (children && Array.isArray(children)) {
                  listFun(children.slice(0))
              }
              return list
      })
      return list
  }
  listFun(arrayList)
  return list
}

const Layout = ({  children }) => {
    const { pathname } = useLocation();

    const routerTitle = useMemo(() => {
        const list = treeToArray(routeList); // 如果你的路由不是树形的,可以不用转
        const title = list.filter(route => route['title'] && matchPath(route.path,pathname))
        return Array.isArray(title) && title.length ? title[0]['title'] : '标题'
    }, [routeList, pathname])

    useEffect(() => {
      document.title = routerTitle
    }, [routerTitle])
    </div>
    return (
        <div className={style.layout_content}>
            {children}
        </div>
    );
};

export default Layout;

routers.js

export const routeList = [
  {
	path: '/home/index',
    name: 'Home',
    element: <Home />, // 使用useRoutes必须传组件形式不可以传Home
    title:'首页',
    children:[
	   {
        path: '/home/index/logo',
        name: 'Logo',
        element: <Logo />,
        title:'Logo'
      },
	]
  },
    {
	path: '/home/two',
    name: 'Two',
    element: <Two />,
    title:'信息'
  },
]

总结

其实就是匹配一下你的当前pathname和你routerList里设置的path一致,然后获取到你设置的title,再document.title一下就行了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值