我在写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]);}
如上,如何获取路由更新后的标题呢?
有点没看懂你代码意图。
如果是想让每个路由自动设置页面标题,可以看看下面的示例代码有没有帮助:
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;
这个问题可能是由于React的useEffect
在组件渲染完成前就执行导致的。在useEffect
中,你试图获取并打印当前的document.title
,然而在此时,React可能还没有更新DOM,因此你获取到的还是旧的标题。
一个可能的解决方案是使用useEffect
的依赖数组来解决这个问题。你可以将location.pathname
和document.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
难道是 配置了 hash 路由后只能 这样吗?