当前位置: 首页 > 知识库问答 >
问题:

react.js - 如何在React中处理路由转换后标题未更新的问题?

冯良才
2024-03-11

我在写React程序的时候,我使用useEffect钩子函数来更新路由转换后的标题,发现在Effect中的回调函数执行时,document.title打印值还是跳转之前的值,useEffect钩子函数是在Dom渲染完成后执行的,但此时不知道为什么标题未发生改变,可能是我的当时不对,怎样才可以实现?
代码如下:

import { useEffect, useRef } from "react";import { useLocation } from "react-router-dom";export default function useRouterTracking() {  const viewNumber = useRef({});  const location = useLocation();  const pathname = useRef(null);  const title = useRef(document.title);  useEffect(() => {    console.log(document.title)    pathname.current = location.pathname;    title.current = document.title;    if (title.current in viewNumber.current) viewNumber.current[title.current] += 1;    else viewNumber.current[title.current] = 1;    console.log(viewNumber.current);  }, [location.pathname]);}

如上,如何获取路由更新后的标题呢?

共有2个答案

东郭瀚玥
2024-03-11

有点没看懂你代码意图。
如果是想让每个路由自动设置页面标题,可以看看下面的示例代码有没有帮助:

import React from 'react';import { createBrowserRouter } from 'react-router-dom';import Root from './Root';import Public from './Public';function PageTitleWrap({ title, children }) {  React.useEffect(() => {    document.title = title;  }, [title]);  return children;}const router = createBrowserRouter([  {    path: '/',    element: (      <PageTitleWrap title="首页">        <Root />      </PageTitleWrap>    ),  },  {    path: '/public',    element: (      <PageTitleWrap title="公共页">        <Public />      </PageTitleWrap>    ),  },]);export default router;
司马宏茂
2024-03-11

这个问题可能是由于React的useEffect在组件渲染完成前就执行导致的。在useEffect中,你试图获取并打印当前的document.title,然而在此时,React可能还没有更新DOM,因此你获取到的还是旧的标题。

一个可能的解决方案是使用useEffect的依赖数组来解决这个问题。你可以将location.pathnamedocument.title都作为useEffect的依赖,这样当它们中的任何一个发生改变时,useEffect都会被触发。

下面是你的代码的修改版:

import { useEffect, useRef, useState } from "react";import { useLocation } from "react-router-dom";export default function useRouterTracking() {  const viewNumber = useRef({});  const location = useLocation();  const pathname = useRef(null);  const [title, setTitle] = useState(document.title);  useEffect(() => {    console.log(title); // 打印当前的标题    pathname.current = location.pathname;    setTitle(document.title); // 更新标题的状态    if (title in viewNumber.current) viewNumber.current[title] += 1;    else viewNumber.current[title] = 1;    console.log(viewNumber.current);  }, [location.pathname, title]); // 当路径名和标题改变时,执行此effect}

这个修改版的代码应该可以在你路由转换后更新标题。然后你可以在需要的地方使用useRouterTracking这个hook来获取路由转换后的标题。

 类似资料:
  • 用的是 React 和 Antd v5 为什么在改了 state 之后元素还是没变化呢 问过 GPT 但是没有结果

  • 问题内容: 我正在react.js中处理单个页面应用程序,那么在页面转换或浏览器后退/前进时更新元标记的最佳方法是什么? 问题答案: 我在一个较旧的项目中使用了react-document-meta。 只需定义您的元值 并放置一个 在回报

  • 问题内容: 对于Java-JDBC API和Oracle数据库,我有一个稍微独特的要求。我将autoCommit设置为默认值,这对于Oracle是正确的,并且我使用的示例与此链接相似。 但是,当我添加说1000批次时,可以说每个批次都是插入的。并且让我们假设大约20条记录违反了某些约束,我希望其余980条变为COMMITTED(并且以后对使用任何其他连接的任何其他查询都可见)到数据库,并忽略20条

  • 项目是 Umi 创建的,用的路由插件是 react-router-dom。 有两个页面,第一个页面通过 Link 组件跳转到第二个页面,第二页页面是 router 文件夹里的 router-page,第一个页面的代码如下: .umirc 里也的路由也添加好了: 可以成功的从第一页跳转到第二页。 然后第二页 router-page.tsx 里的代码如下: 页面显示如下: 现在的问题是,我点击“关于”

  • 问题内容: 我正在使用Angular2开发NodeJS应用程序。在我的应用程序中,我有一个主页和搜索页面。对于主页,我有一个将为 localhost:3000 /* 呈现的HTML页面,并且从主页用户导航到 搜索, 即 我由 angular2路由 处理的 localhost:3000 / search 页面。 * 我没有搜索页面的页面,其视图由angular2呈现。但是当我直接点击 localho