首页
Preview

React Router :在路由更改时滚动到顶部和解析查询字符串参数

在使用 React Router 进行导航和路由时,可以使用useLocation来获取表示当前 URL 的位置对象。获得位置对象后,可以检索并解析查询字符串,如下所示:

const location = useLocation();
 const queryString = location.search;

 const params = new URLSearchParams(queryString);
 console.log(params.get('key'));

useLocation

在此之前我们先来详细了解一下useLocationuseLocation是一个返回包含当前 URL 信息的位置对象的函数。每当 URL 发生变化时,都会返回一个新的位置对象。位置对象属性:

  • hash: 锚点部分 (#)
  • pathname: 路径名
  • search: 查询字符串部分
  • state:状态
  • key

当你想要根据 URL 的更改触发函数时,可以使用useLocation,一般情况下,它与React提供的useEffect hook结合使用,比如下面的例子,我们可以使用useLocationuseEffect实现一个在路由更改时滚动到顶部的效果:

我们的示例项目有 2 个路由,“/”(HomePage)和“/about”(AboutPage)。每个页面都很长并且有一个链接组件,因此我们可以导航到另一个页面。

  • 创建一个包装组件来处理滚动恢复:
// src/pages/ScrollToTop.tsx
import { useEffect } from "react";
import { useLocation } from "react-router";

const ScrollToTop = (props) => {
  const location = useLocation();
  useEffect(() => {
    window.scrollTo(0, 0);
  }, [location]);

  return <>{props.children}</>
};

export default ScrollToTop;
import {Link, Route, Routes, useLocation} from "react-router-dom";
import ScrollToTop from "./pages/ScrollToTop.tsx";

function App() {
  return (
    <ScrollToTop>
        <Routes>
            <Route path="/" element={<HomePage />}>Home</Route>
            <Route path="/about" element={<AboutPage />}>About</Route>
        </Routes>
    </ScrollToTop>
  )
}

const HomePage = () =>{

    return <div style={{ margin: "auto", width: "80%" }}>
        <h1>Product Page</h1>
        <div style={{ backgroundColor: "green", height: 700 }}></div>
        <div style={{ backgroundColor: "grey", height: 700 }}></div>
        <div style={{ backgroundColor: "blueviolet", height: 700 }}></div>
        <Link to="/about">
            <h2>Go To About Page</h2>
        </Link>
    </div>
}
const AboutPage = () =>{

    return <div style={{ margin: "auto", width: "80%" }}>
        <h1>About Page</h1>
        <div style={{ backgroundColor: "pink", height: 700 }}></div>
        <div style={{ backgroundColor: "orange", height: 700 }}></div>
        <div style={{ backgroundColor: "purple", height: 700 }}></div>
        <Link to="/">
            <h2>Go To Home Page</h2>
        </Link>
    </div>
}

export default App

解析查询字符串参数实例

如下面的例子:

import {Route, Routes, useLocation} from "react-router-dom";

function App() {
  return (
    <div style={{  height: 'calc(100vh - 40px)', padding: '20px' }}>
        <Routes>
            <Route path="/" element={<HomePage />}>Home</Route>
        </Routes>
    </div>
  )
}

const HomePage = () =>{
    const location = useLocation();
    const search = location.search;
    console.log(search);
    const params = new URLSearchParams(search);
    console.log(params.get('s'));
    return <div>
        <h3>S: {params.get('s')}</h3>
        <h3>Page: {params.get('page')}</h3>
        <h3>Limit: {params.get('limit')}</h3>
        <h3>Sort: {params.get('sort')}</h3>
        <h3>Order: {params.get('order')}</h3>
    </div>
}

export default App

测试:比如我们有这么一个链接:http://localhost:3000/?s=hello&page=23&limit=3&sort=dete&order=desc

image.png

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
Hedy
大家好!我是一位前端开发工程师,拥有6年以上的前端开发经验。我熟练掌握HTML、CSS、JavaScript等语言,能够灵活运用各种前端框架,如Vue、React、Uniapp、Flutter等。我注重理论与实践相结合,能够为学员提供丰富的案例和实践项目,并以生动、易懂的语言为学员讲解前端开发的核心知识和技能。我不仅注重传授技能,更关注学员的职业发展,希望通过我的教学,帮助学员成为一名优秀的前端开发工程师。

评论(0)

添加评论