博主头像
<CodeEra />

心存敬畏 行有所止

React 向路由组件传递state参数

在 React 应用中,我们经常需要在不同的路由之间传递数据。除了使用 URL 参数或查询字符串之外,还可以通过 state 参数来传递数据。state 参数不会显示在 URL 中,因此适合传递一些敏感或复杂的数据。

1. 使用 useHistoryuseNavigate 传递 state 参数

在 React Router v5 中,我们可以使用 useHistory hook 来导航并传递 state 参数。在 React Router v6 中,useHistoryuseNavigate 替代。

React Router v5 示例:

import React from 'react';
import { useHistory } from 'react-router-dom';

function HomePage() {
  const history = useHistory();

  const navigateToAbout = () => {
    history.push('/about', { message: 'Hello from HomePage!' });
  };

  return (
    <div>
      <h1>Home Page</h1>
      <button onClick={navigateToAbout}>Go to About</button>
    </div>
  );
}

export default HomePage;

React Router v6 示例:

import React from 'react';
import { useNavigate } from 'react-router-dom';

function HomePage() {
  const navigate = useNavigate();

  const navigateToAbout = () => {
    navigate('/about', { state: { message: 'Hello from HomePage!' } });
  };

  return (
    <div>
      <h1>Home Page</h1>
      <button onClick={navigateToAbout}>Go to About</button>
    </div>
  );
}

export default HomePage;

2. 在目标组件中获取 state 参数

在目标组件中,我们可以使用 useLocation hook 来获取传递的 state 参数。

React Router v5 和 v6 示例:

import React from 'react';
import { useLocation } from 'react-router-dom';

function AboutPage() {
  const location = useLocation();
  const { message } = location.state || {};

  return (
    <div>
      <h1>About Page</h1>
      {message && <p>{message}</p>}
    </div>
  );
}

export default AboutPage;

3. 注意事项

  • state 参数不会出现在 URL 中:这意味着如果用户刷新页面,state 参数将会丢失。因此,state 参数适合传递一些临时数据,而不是持久化的数据。
  • 默认值处理:在目标组件中获取 state 参数时,建议使用默认值或条件渲染,以防止 stateundefined 时导致的错误。

4. 总结

通过 state 参数,我们可以在路由之间传递数据而不暴露在 URL 中。这在某些场景下非常有用,例如传递敏感信息或复杂对象。需要注意的是,state 参数在页面刷新后会丢失,因此不适合用于持久化数据。

5. 完整示例

App.js

import React from 'react';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import HomePage from './HomePage';
import AboutPage from './AboutPage';

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<HomePage />} />
        <Route path="/about" element={<AboutPage />} />
      </Routes>
    </Router>
  );
}

export default App;

HomePage.js

import React from 'react';
import { useNavigate } from 'react-router-dom';

function HomePage() {
  const navigate = useNavigate();

  const navigateToAbout = () => {
    navigate('/about', { state: { message: 'Hello from HomePage!' } });
  };

  return (
    <div>
      <h1>Home Page</h1>
      <button onClick={navigateToAbout}>Go to About</button>
    </div>
  );
}

export default HomePage;

AboutPage.js

import React from 'react';
import { useLocation } from 'react-router-dom';

function AboutPage() {
  const location = useLocation();
  const { message } = location.state || {};

  return (
    <div>
      <h1>About Page</h1>
      {message && <p>{message}</p>}
    </div>
  );
}

export default AboutPage;

通过以上代码,我们实现了一个简单的 React 应用,展示了如何在路由之间通过 state 参数传递数据。

发表新评论