React-router 最佳实践

使用的是 BrowserRouterRoutes 和 Route,这是 react-router-dom v5 和 v6 都支持的 API。这种方式的优点是路由配置和应用的其它部分是紧密集成的,这使得路由配置更加直观和易于理解 

// router/index.js
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from '../components/Home';
import About from '../components/About';
import User from '../components/User';
import UserDetails from '../components/UserDetails';

function AppRouter() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/user" element={<User />}>
          <Route path=":id" element={<UserDetails />} />
        </Route>
        {/* 添加更多的 Route 组件以定义更多的路由 */}
      </Routes>
    </Router>
  );
}

export default AppRouter;
// App.js
import AppRouter from './router';

function App() {
  return <AppRouter />;
}

export default App;

react-router-dom 获取 params 和 query

import { useParams, useSearchParams } from 'react-router-dom';

function SomeComponent() {
  // 获取路径参数
  const params = useParams();
  const userId = params.id;

  // 获取查询参数
  const [searchParams] = useSearchParams();
  const someQuery = searchParams.get('someQuery');

  // ...
}

注意,setSearchParams 函数会替换所有的查询参数,如果你只想修改某个查询参数,你需要先获取当前的查询参数,然后修改它,然后再调用 setSearchParams。例如:

const [searchParams, setSearchParams] = useSearchParams();
const newSearchParams = new URLSearchParams(searchParams.toString());
newSearchParams.set('someParam', 'newValue');
setSearchParams(newSearchParams);

只有 someParam 参数会被修改,其它的查询参数会保持不变

react-router-dom  v5 vs v6 

// router/index.js
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from '../components/Home';
import About from '../components/About';
import User from '../components/User';
import UserDetails from '../components/UserDetails';

function AppRouter() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/user" element={<User />}>
          <Route path=":id" element={<UserDetails />} />
        </Route>
        {/* 添加更多的 Route 组件以定义更多的路由 */}
      </Routes>
    </Router>
  );
}

export default AppRouter;




v5 
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

const Home = () => <h1>Home</h1>;
const About = () => <h1>About</h1>;
const User = () => <h1>User</h1>;
const UserSettings = () => <h1>User Settings</h1>;

const App = () => (
  <Router>
    <Switch>
      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
      <Route path="/user" component={User}>
        <Route path="/user/settings" component={UserSettings} />
      </Route>
    </Switch>
  </Router>
);

export default App;

outlet

Outlet 组件被用来渲染子路由。当你在一个路由组件中包含一个 Outlet 组件时,它会自动渲染与当前 URL 匹配的子路由。

import { BrowserRouter as Router, Routes, Route, Outlet } from 'react-router-dom';

const Home = () => <h1>Home</h1>;
const About = () => <h1>About</h1>;
const User = () => (
  <div>
    <h1>User</h1>
    <Outlet />  {/* 子路由将会在这里被渲染 */}
  </div>
);
const UserDetails = () => <h1>User Details</h1>;

const App = () => (
  <Router>
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
      <Route path="/user" element={<User />}>
        <Route path=":id" element={<UserDetails />} />
      </Route>
    </Routes>
  </Router>
);

export default App;
    多个子路由但是不在一个页面

如果你有多个子路由,但它们不应该在同一个页面上同时渲染,你可以使用 Routes 组件来包裹这些子路由。Routes 组件会渲染与当前 URL 匹配的第一个 Route 组件

import { BrowserRouter as Router, Routes, Route, Outlet } from 'react-router-dom';

const User = () => (
  <div>
    <h1>User</h1>
    <Outlet />  {/* 子路由将会在这里被渲染 */}
  </div>
);

const UserDetails = () => <h1>User Details</h1>;
const UserSettings = () => <h1>User Settings</h1>;

const App = () => (
  <Router>
    <Routes>
      <Route path="/user" element={<User />}>
        // 可省 <Routes>
          <Route path="details" element={<UserDetails />} />
          <Route path="settings" element={<UserSettings />} />
        // </Routes>
      </Route>
    </Routes>
  </Router>
);

export default App;

当你访问 /user/details 时,只有第一个匹配的子路由(UserDetails)
会被渲染在 Outlet 中。尽管你定义了两个与 /user/details 匹配的子路由,
但是 react-router-dom v6 只会渲染第一个匹配的 Route。

因此,无论你访问 /user/details,Outlet 都只会渲染 UserDetails 组件,
而不会渲染 UserSettings 组件。

这是因为 react-router-dom v6 的设计原则之一是:每个 URL 应该对应一个唯一的视图。
如果有多个 Route 与同一个 URL 匹配,那么只有第一个 Route 会被渲染。

你使用了嵌套的 Routes 组件来定义子路由,但这并不会改变路由的行为。
无论你是否使用嵌套的 Routes,react-router-dom 都会渲染与当前 URL
 匹配的第一个 Route 组件。

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React 17是最新发布的React版本,它带来了一些重要的改进和优化,提高了React应用的性能和可维护性。React Hooks是一种新的特性,它可以替代Class组件中的生命周期方法和状态管理方式,使代码更简洁、易读和可测试。TypeScript是一种静态类型检查的编程语言,结合ReactReact Hooks可以提供更好的类型安全和代码提示,减少潜在的bug。 在仿Jira企业级项目中,使用React 17、React Hooks和TypeScript的最佳实践可以如下: 1. 使用函数组件和React Hooks来构建UI组件,避免使用Class组件和生命周期方法。这样可以降低组件的复杂度,并且让代码更加易于维护和扩展。 2. 在使用React Hooks时,尽可能将逻辑分离成可复用的自定义Hooks,以提高代码的可维护性和重用性。 3. 使用TypeScript来为组件和函数添加类型声明,以提供更好的类型安全和代码提示。通过使用接口和类型别名,可以明确指定组件的props和状态的类型,并及时发现并修复类型错误。 4. 使用React Context和useContext Hook来实现全局状态管理。这对于企业级项目中的共享数据是非常有用的,可以避免通过Props层层传递数据。 5. 使用React Router来管理路由,以便实现页面间的导航和切换。 6. 使用Axios或其他合适的网络库来处理与服务器的数据通信。 7. 使用CSS模块化或CSS-in-JS技术来管理组件的样式,以确保样式的隔离性和可重用性。 8. 使用ESLint和Prettier等代码检查工具,确保代码的一致性和质量。 通过遵循以上最佳实践,可以使仿Jira企业级项目更加现代化、高效、可维护,帮助开发者更好地进行团队协作和项目开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值