API
BrowserRouter
底层调用H5的history api
basename: string
所有路由的基本url。设置时只需要前导斜杠,不需要尾部斜杠
<BrowserRouter basename="/calendar" />
<Link to="/today"/> // renders <a href="/calendar/today">
getUserConfirmation: func
默认调用 window.confirm
显示一个模态对话框
forceRefresh: bool
是否在路由跳转时强制刷新页面,可能只需要在不支持H5 history 的前提下使用这个属性
keyLength: number
location.key的长度,默认为6
children: node
需要渲染的子元素
HashRouter
调用hash api
注意:无法使用location.key 或者 location.state属性
basename: string | getUserConfirmation: func | children: node
同BrowserRouter
hashType: string
Link
为应用提供可声明,可访问性的导航
to:string | object | function
字符串形式
<Link to="/courses?sort=name" />
对象形式
pathname
: A string representing the path to link to.search
: A string representation of query parameters.hash
: A hash to put in the URL, e.g.#a-hash
.state
: State to persist to thelocation
.
<Link
to={{
pathname: "/courses",
search: "?sort=name",
hash: "#the-hash",
state: { fromDashboard: true }
}}
/>
函数形式
参数为当前location,返回值为对象或字符串
<Link to={location => ({ ...location, pathname: "/courses" })} />
<Link to={location => `${location.pathname}?sort=name`} />
replace:bool
替换history stack 而不是添加一个
<Link to="/courses" replace />
innerRef: function | RefObject
使用React.createRef()获取组件的底层引用
others
自定义其他属性,例如title,id,className
NavLink
Link的特殊版本,它将在与当前URL匹配时为渲染元素添加样式属性。
activeClassName:string
激活时命中的样式,默认为样式名为active,该属性会与className属性提供的样式合并
activeStyle:object
<NavLink
to="/faq"
activeStyle={{
fontWeight: "bold",
color: "red"
}}
>
FAQs
</NavLink>
exact:bool
是否默认选中
strict:bool
在命中路由时是否考虑尾部斜杠
isActive:func
激活时调用的函数,包含match和location两个参数
// only consider an event active if its event id is an odd number
const oddEvent = (match, location) => {
if (!match) {
return false
}
const eventID = parseInt(match.params.eventID)
return !isNaN(eventID) && eventID % 2 === 1
}
<NavLink
to="/events/123"
isActive={oddEvent}
>Event 123</NavLink>
location:object
当前的历史记录位置。要比较不同的location,可以将当前location作为参数传入
aria-current:string
语义化
Prompt
用于在离开当前导航时提示用户
message:string | func
<Prompt
message={location =>
location.pathname.startsWith("/app")
? true
: `Are you sure you want to go to ${location.pathname}?`
}
/>
when: bool
控制prompt的渲染时机
<Prompt when={formIsHalfFilledOut} message="Are you sure?" />
MemoryRouter
将用户的访问记录存储在内存中。适合于测试或无浏览器环境如react native
initialEntries: array
初始化一个location对象的集合。location可以是一个包含{pathname,search,hash,state}中任意属性的对象或字符串
<MemoryRouter
initialEntries={["/one", "/two", { pathname: "/three" }]}
initialIndex={1}
>
<App />
</MemoryRouter>
initialIndex: number
指定初始化initialEntries的下标
getUserConfirmation: func | keyLength: number | children: node
类似BrowerRouter
Redirect
在history stack中,redirect-to 的 location 将会替换当前的 location
to:string | object
<Redirect
to={{
pathname: "/login",
search: "?utm=your+face",
state: { referrer: currentLocation }
}}
/>
state 参数可以在redirected-to 组件的this.props.location.state中访问到
push: bool
如果设置为true,将不会替换history stack中的location
from: string
exact:bool
strict:bool
sensitive:bool
是否大小写敏感
Route
当location命中时,去渲染对应的组件
component
<Route path="/user/:username" component={User} />;
// All route props (match, location and history) are available to User
function User(props) {
return <h1>Hello {props.match.params.username}!</h1>;
}
function User({match, location, history}){};
底层调用React.createElement去创建一个新的React element
render:func
函数同样可以访问match, location和history三个参数
// convenient inline rendering
<Route path="/home" render={() => <div>Home</div>}/>
// wrapping/composing
// You can spread routeProps to make them available to your rendered Component
const FadingRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={routeProps => (
<FadeIn>
<Component {...routeProps}/>
</FadeIn>
)}/>
)
<FadingRoute path="/cool" component={Something}/>
注意:component的优先级高于render
children:func
它工作的方式同render一样,区别在于不管有没有命中路由,他都将被渲染
children 接受的参数与component和render相同,当路由没有命中的时候,match为null
<Route children={({ match, ...rest }) => (
{/* Animate will always render, so you can use lifecycles
to animate its child in and out */}
<Animate>
{match && <Something {...rest}/>}
</Animate>
)}/>
注意:component和render的优先级高于children, 应当只使用其中的一个元素
path:string | string[]
<Route path="/users/:id" component={User} />
<Route path={["/users/:id", "/profile/:id"]} component={User} />
exact:bool
strict:bool
具有尾部斜杠的路径将仅匹配具有尾部斜杠的location.pathname。当location.pathname中有其他URL段时,这不起作用。
path | location.pathname | matches? |
---|---|---|
/one/ |
/one |
no |
/one/ |
/one/ |
yes |
/one/ |
/one/two |
yes |
sensitive:bool
path | location.pathname | sensitive | matches? |
---|---|---|---|
/one |
/one |
true |
yes |
/One |
/one |
true |
no |
/One |
/one |
false |
yes |
location:object
Router
所有路由器组件的通用低级接口
history:object
children:node
StaticRouter
永远不会改变location的Router
basename: string
location: string | object
context: object
在渲染期间,组件可以向对象添加属性以存储有关渲染的信息。
当<Route>
匹配时,它会将context渲染为staticContext prop传递给命中的组件
渲染后,context中的属性可用于配置服务器的响应。
children: node
Switch
渲染第一个匹配的Route或Redirect
Switch与一组Route的区别在于,它仅仅渲染第一个匹配的路由
location: object
children: node
Switch只能包含Route和Redirect元素,Route匹配path元素,Redirect匹配from元素,仅匹配其中一个元素
history
React Router的两个主要依赖项之一https://github.com/ReactTraining/history
history is mutable
因为history是不可变的。因此建议从Router的渲染props来访问location而不是通过history.location来访问
location
location代表应用程序现在的位置,您希望它去的位置,甚至是当前的位置。看起来像这样:
{
key: 'ac3df4', // not with HashHistory!
pathname: '/somewhere'
search: '?some=search-string',
hash: '#howdy',
state: {
[userDefined]: true
}
}
你可以通过这些方式访问location:
- Route component as
this.props.location
- Route render as
({ location }) => ()
- Route children as
({ location }) => ()
- withRouter as
this.props.location
history.location同样也可访问到location,但最好不要这样做,因为history是不可变的
location对象是never mutated,所以当导航改变的时候,你可以在组件的生命周期钩子中访问它,以决定是否进行动画渲染或获取数据等操作
最后,你可以通过把location传递给:
这将阻止他们使用路由器状态中的实际位置。这对于动画和待定导航很有用,或者您想要将组件欺骗渲染到与真实位置不同的位置时
match
match对象包含如下属性:
params
- (object) Key/value pairs parsed from the URL corresponding to the dynamic segments of the pathisExact
- (boolean)true
if the entire URL was matched (no trailing characters)path
- (string) The path pattern used to match. Useful for building nested<Route>
surl
- (string) The matched portion of the URL. Useful for building nested<Link>
s
你可以通过如下方式去访问它:
- Route component as
this.props.match
- Route render as
({ match }) => ()
- Route children as
({ match }) => ()
- withRouter as
this.props.match
- matchPath as the return value
null match
注意:当你在Route上使用children属性渲染,并试图访问match.url属性时,可能会出现一个TypeError错误
matchPath
这使您可以使用Route使用的相同匹配代码,但你可以在正常渲染周期之外使用它
第一个参数pathname,你需要命中的路由。
第二个参数为一个对象,他们与Route接受的匹配props相同
{
path, // like /users/:id; either a single string or an array of strings
strict, // optional, defaults to false
exact, // optional, defaults to false
}
返回值,当匹配成功时返回一个object,当匹配失败时返回null
withRouter
您可以通过withRouter高阶组件访问history的属性和最近的Route的match对象