是否可以匹配 React Router 4 中路由的 # 部分
Is it possible to match the # part of a route in React Router 4
在我的应用中,我想将路径和散列匹配到不同的组件。例如:
/pageA#modalB
会将 PageA 显示为主页,modalB 位于顶部。
我尝试了以下路径,路径有很多变体 属性:
<Route path="#modalB" component={modalB}/>
但没有任何效果。
在模态 'controller' 组件内的 React Router 2 中,我会使用:
browserHistory.listen( (location) => { //do something with loction.hash })
我希望在 V4 中有一些更优雅的东西
并非开箱即用,但 React Router 4 的美妙之处在于您自己实现它非常容易。
let HashRoute = ({ component: Component, path, ...routeProps }) => (
<Route
{...routeProps}
component={({ location, ...props }) =>
location.hash === path && <Component {...props} />
}
/>
)
<HashRoute path="#modalB" component={ModalB} />
@azium 只要您不需要在 HashRoute 中使用 render 或 children 道具,答案就可以正常工作。
在这种情况下,此解决方案会更好地工作:
import React from 'react';
import { Route } from 'react-router-dom';
const HashRoute = ({ hash, ...routeProps }) => (
<Route
render={({ location }) => (
(location.hash === hash) && <Route {...routeProps} />
)}
/>
);
export default HashRoute;
像这样使用它:
<HashRoute hash="#modalB" component={ModalB} />
或者结合路由匹配:
<HashRoute hash="#modalB" path="/subPageOnly" component={ModalB} />
如果你真的想匹配并获取参数,使用matchPath
。
import { useLocation, matchPath } from 'react-router-dom';
// your route you want to see if it matches
const routePath = '/overtherainbow/:country/#/city/:city/detail'
// somewhere while rendering
const location = useLocation();
useEffect(() => {
const matched = matchPath(location.pathname + location.hash, routePath);
if (matched){
// matched, do something with it, like setting state, fetching data or what not
console.log(matched.params); // will be {country:..., city:...}
}
}, [location])
在我的应用中,我想将路径和散列匹配到不同的组件。例如:
/pageA#modalB
会将 PageA 显示为主页,modalB 位于顶部。 我尝试了以下路径,路径有很多变体 属性:
<Route path="#modalB" component={modalB}/>
但没有任何效果。
在模态 'controller' 组件内的 React Router 2 中,我会使用:
browserHistory.listen( (location) => { //do something with loction.hash })
我希望在 V4 中有一些更优雅的东西
并非开箱即用,但 React Router 4 的美妙之处在于您自己实现它非常容易。
let HashRoute = ({ component: Component, path, ...routeProps }) => (
<Route
{...routeProps}
component={({ location, ...props }) =>
location.hash === path && <Component {...props} />
}
/>
)
<HashRoute path="#modalB" component={ModalB} />
@azium 只要您不需要在 HashRoute 中使用 render 或 children 道具,答案就可以正常工作。 在这种情况下,此解决方案会更好地工作:
import React from 'react';
import { Route } from 'react-router-dom';
const HashRoute = ({ hash, ...routeProps }) => (
<Route
render={({ location }) => (
(location.hash === hash) && <Route {...routeProps} />
)}
/>
);
export default HashRoute;
像这样使用它:
<HashRoute hash="#modalB" component={ModalB} />
或者结合路由匹配:
<HashRoute hash="#modalB" path="/subPageOnly" component={ModalB} />
如果你真的想匹配并获取参数,使用matchPath
。
import { useLocation, matchPath } from 'react-router-dom';
// your route you want to see if it matches
const routePath = '/overtherainbow/:country/#/city/:city/detail'
// somewhere while rendering
const location = useLocation();
useEffect(() => {
const matched = matchPath(location.pathname + location.hash, routePath);
if (matched){
// matched, do something with it, like setting state, fetching data or what not
console.log(matched.params); // will be {country:..., city:...}
}
}, [location])