zoukankan      html  css  js  c++  java
  • react-router-dom V5 使用指南(1)

    react-router-dom V5 使用指南(1)

    • react-router 提供了路由核心接口,如 Router、Route、Switch 等,未提供终端操作相关的接口;
    • react-router-dom 提供了浏览器端接口,BrowserRouter、HashRouter,Route、Link 等API;
    • react-router-native 提供了 native 端的相关接口。

    学习方法

    初学者建议先熟悉一遍 官网文档react-router-dom,看找一篇阐述的比较清楚的实战文章,这里我整理了一些资料:

    实用例子

    路由跳转

    演示地址:https://reactrouter.com/web/example/basic,这是一个非常简单的例子,从这个例子可以学到在React中路由功能是如何实现的,没有什么难度:

    • Link:实现了URL点击跳转的功能,点击它可以跳转到指定的路由URL
    • Route:用于配置路由
    • Switch:保证在一组路由中只渲染一个

    获取 URL Params

    演示地址:https://reactrouter.com/web/example/url-params,这个例子也比较简单没什么值得说的:

    • useParams: 可以在任意级别的组件里获取 URL Params。V5.1之前非Route子组件是没办法获取到,你需要借助 withRouter。

    路由嵌套

    演示地址:https://reactrouter.com/web/example/nesting,路由嵌套理解为:在 Route 组件的子孙组件中存在 Route 组件,比如:

    <Route path="/topics">
        <h1>parent</h1>
        <Route path="/topics/:topicId">
          child
        </Route>
    </Route>
    

    值得注意的是,演示地址中使用了 useRouteMatch,它在这个例子中的作用是将与他匹配成功的路由信息找出来,举个例子就很容易理解:

    import React from "react";
    import {
      BrowserRouter as Router,
      Switch,
      Route,
      Link,
      useParams,
      useRouteMatch
    } from "react-router-dom";
    
    export default function NestingExample() {
      return (
        <Router>
          <Switch>
            <Route path="/topics">
              <Topics />
            </Route>
          </Switch>
        </Router>
      );
    }
    
    function Topics() {
      let { path, url } = useRouteMatch();
      console.log(useRouteMatch())
      // 在这里必须使用 useRouteMatch 找出当前匹配成功的 Route 的 path 信息, 否则子路由无法跳转
      return (
        <div>
          <h2>Topics</h2>
          <ul>
            <li>
              <Link to={`${url}/rendering`}>Rendering with React</Link>
            </li>
          </ul>
          <Switch>
            <Route path={`${path}/:topicId`}>
              <Topic />
            </Route>
          </Switch>
        </div>
      );
    }
    
    function Topic() {
      let { topicId } = useParams();
      console.log(useRouteMatch())
      return (
        <div>
          <h3>{topicId}</h3>
        </div>
      );
    }
    

    当访问 url path 为 /topics/props-v-state 时,打印信息如下:
    -w997

    重定向

    演示地址:https://reactrouter.com/web/example/auth-workflow,重定向是路由系统中不可或缺的功能,常被用于登录跳转等场景中,由于React崇尚一切皆组件的思想,所以在React中,当您需要重定向时,只需返回一个 Redirect 组件:

    // state 常用来携带额外信息
    <Redirect
        to={{
          pathname: "/login",
          state: { from: '/orders' }
        }}
    />
    

    在该演示地址代码中(简化后),一个非常值得学习的技巧是:ProtectedPage 是需要登录才能访问的,但是我们将登录校验以及重定向的操作封装到了 PrivateRoute 组件中,两者被隔离开,降低代码逻辑的耦合行,大大增大了代码的复用性:

    export default function AuthExample() {
      return (
        <Router>
          <div>
            <Switch>
              <Route path="/login">
                <LoginPage />
              </Route>
              <PrivateRoute path="/protected">
                <ProtectedPage />
              </PrivateRoute>
            </Switch>
          </div>
        </Router>
      );
    }
    
    function PrivateRoute({ children, ...rest }) {
      return (
        <Route
          {...rest}
          render={({ location }) =>
            fakeAuth.isAuthenticated ? (
              children
            ) : (
              <Redirect
                to={{
                  pathname: "/login",
                  state: { from: location }
                }}
              />
            )
          }
        />
      );
    }
    
  • 相关阅读:
    js全选,全不选,反选练习
    linux查看系统的一些命令,留着用
    JAVA中native方法
    应该被记住的 8 位 Java 人物
    iframe里面的iframe无法左右对齐的解决方法
    sql语句,查找合并后的结果
    地址路径过深时的处理方式
    惠普中国CEO孙振耀退休感言
    js获得readOnly属性
    直接加载错误页面void com.opensymphony.xwork2.ActionSupport.addActionError(String anErrorMessage)
  • 原文地址:https://www.cnblogs.com/GManba/p/13326616.html
Copyright © 2011-2022 走看看