React 初探(十一)

2019-01-28  本文已影响7人  bowen_wu

概述

之前已经将目录构建完成,这次主要将路由和页面结合起来,完成一些路由的切换和页面的跳转。我的项目地址

<BrowserRouter><HashRouter>

之前的文章中已经说明了 hashhistory 实现路由的方式,在 React-Router 中也有两种模式,即 <BrowserRouter><HashRouter>

<BrowserRouter>

<Router> 使用 HTML5 history API( pushStatereplaceStatepropsState 事件 )去保持你的 UI 和 URL 同步

属性:

<HashRouter>

<Router> 使用 URLhash 部分( window.location.hash ) 去保持你的 UI 和 URL 同步

注意:hash 历史不支持 location.key 或者 location.state。在以前的版本中,我们试图填充行为,但是有一些边缘情况不能解决。任何需要此行为的代码或插件都不能工作。由于此技术仅用于支持传统浏览器,因此建议使用 <BrowserRouter>

最佳实践

使用 <BrowserRouter>

Link + Route 实现路由跳转

可以通过 react-router<Link> + <Route> 实现路由跳转。

<BrowserRouter>
    <div className="router">
        <button className="link-button"><Link to="/">Home</Link></button>
        <button className="link-button"><Link to="/login">Login</Link></button>
        
        <Route path="/" exact component={Home} />
        <Route path="/login" exact component={Login} />
    </div>
</BrowserRouter>

<Link>

引入
import { Link } from 'react-router-dom'
属性

<Route>

<Route> 组件在 React-Router 中可能是最重要的去理解和学习良好使用的组件,它最基本的职责是在位置和路由路径匹配时呈现一些 UI。一旦应用程序 location 和 路由路径匹配,你的组件将会被渲染

引入
import { Route } from 'react-router-dom'
属性

Router render methods
这里有三种方式去 render 通过 <Route>

每一个都是有用的在不同的环境中。你应该使用其中一种在给定的 <Route>。查看他们的说明来理解为什么你有三个选项,大多数情况下你将会使用 component

  1. component
  1. render: Function

注意: <Route component> 要优先于 <Route render> 所以不要在相同的 <Route> 中使用两者

3.children: Function

注意:<Route component><Route render> 优先于 <Route children> 所以不要在相同的 <Route> 中使用两个或三个

Route props
所有的三个 render 方法将会具有三个相同的 route props

  1. path: string | string[]
    能够被解析的任何有效的 URL path 或者 path 数组

Routes without a path always match.( 没有路径的路由总是匹配的 )

  1. exact: Boolean
    如果为 true,则仅仅当 pathlocation.pathname 完全匹配时才匹配
path location.pathname exact matches?
/one /one/two true no
/one /one/two false yes
  1. strict: Boolean
    如果为 true,则带有尾随斜杠的路径将只与带有尾随斜杠的 location.pathname 匹配,当 location.pathname 中有其他 URL 部分时这是不起作用的
path location.pathname matches?
/one/ /one no
/one/ /one/ yes
/one/ /one/two yes

注意:strict 可以被用于强制 location.pathname 没有尾随斜杠,但是为了做这个 strictexact 必须都是 true

path location.pathname matches?
/one /one yes
/one /one/ no
/one /one/two no
  1. location: Object
    <Route> 元素尝试将其路径去和当前历史位置 location 匹配( 通常是当前浏览器 URL )。但是,也可以传递带有不同的 pathnamelocation 进行匹配。这是非常有用的假使当你需要将 <Route> 匹配到当前历史以外的 location
  1. sensitive: Boolean
    如果为 true,路径匹配将区分大小写
path location.pathname sensitive matches?
/one /one true yes
/One /one true no
/One /one false yes

history + <Router> 实现路由跳转代码

然而上述的 <Link> + <Route> 并不能满足我们的需求,例如我们有时需要点击一个 button 之后先进行一些逻辑操作,之后再进行跳转,这时我们需要使用 history

historyhistory object 指的是 history package,它是 React Router 中的两个主要依赖项之一( 除了 React 本身 ),它提供了几种不同的实现方式,用于各种环境中来管理 JavaScript 中的会话 history

还使用以下术语:

属性 | 方法

注意:history 对象是可变的。因此,建议从 <route>render props 访问 location,而不是从 history.location ,这可以确保您对 React 的假设在生命周期函数中是正确的。

上一篇下一篇

猜你喜欢

热点阅读