将 react-router 转换为 v4:重定向所有路由以包含 lang
Convert react-router to v4: Redirect all routes to include lang
我们已经本地化了我们的应用程序,现在我需要在所有路由中包含 lang,我遇到了可以做我想做的事情的代码,但在 react-router v4 中做同样的事情时遇到了麻烦
这是我引用的代码
这是我正在使用的示例代码,以便在将其集成到我们的应用程序之前使其正常运行:
// add lang to url if it's not present
function langRedirect(props) {
console.log({ props });
const defaultLang = 'en';
const redirectPath = `/${defaultLang}${props.history.location.pathname}`;
console.log(redirectPath);
props.history.replace({ pathname: redirectPath, });
}
.....
<Switch>
<Route path="/:lang/" render={() => <h1>testing... does nothing</h1>}>
<Route path="/:lang/test" render={() => <h2>Test</h2>} />
<Route path="/:lang/test2" render={() => <h2>Test2</h2>} />
</Route>
<Route path="*" render={langRedirect} />
</Switch>
这里发生的事情是,如果我去像 /test
这样的路线,开关仍然会捕获 /:lang/
路线,即使最后没有 / 阻止去 /:lang/
路线 langRedirect
。似乎是 v4 中的不同行为。
好吧,在这个问题上花了几个小时后,我碰巧在发布问题后就弄明白了...
我不得不像这样在路线中添加 * <Route exact path="/:lang/*" render={() => <h1>Test</h1>}>
这是工作代码:
// add lang to url if it's not present
function langRedirect(props) {
console.log({ props });
const defaultLang = 'en';
const redirectPath = `/${defaultLang}${props.history.location.pathname}`;
console.log(redirectPath);
props.history.replace({
pathname: redirectPath,
});
}
...
const TestingRoutes = () => {
return (
<Switch>
<Route exact path="/:lang/*" render={() => <h1>Test</h1>}>
<Route path="/:lang/test" render={() => <h2>Test</h2>} />
<Route path="/:lang/test2" render={() => <h2>Test2</h2>} />
</Route>
<Route path="*" render={langRedirect} />
</Switch>
);
};
我们已经本地化了我们的应用程序,现在我需要在所有路由中包含 lang,我遇到了可以做我想做的事情的代码,但在 react-router v4 中做同样的事情时遇到了麻烦
这是我引用的代码
这是我正在使用的示例代码,以便在将其集成到我们的应用程序之前使其正常运行:
// add lang to url if it's not present
function langRedirect(props) {
console.log({ props });
const defaultLang = 'en';
const redirectPath = `/${defaultLang}${props.history.location.pathname}`;
console.log(redirectPath);
props.history.replace({ pathname: redirectPath, });
}
.....
<Switch>
<Route path="/:lang/" render={() => <h1>testing... does nothing</h1>}>
<Route path="/:lang/test" render={() => <h2>Test</h2>} />
<Route path="/:lang/test2" render={() => <h2>Test2</h2>} />
</Route>
<Route path="*" render={langRedirect} />
</Switch>
这里发生的事情是,如果我去像 /test
这样的路线,开关仍然会捕获 /:lang/
路线,即使最后没有 / 阻止去 /:lang/
路线 langRedirect
。似乎是 v4 中的不同行为。
好吧,在这个问题上花了几个小时后,我碰巧在发布问题后就弄明白了...
我不得不像这样在路线中添加 * <Route exact path="/:lang/*" render={() => <h1>Test</h1>}>
这是工作代码:
// add lang to url if it's not present
function langRedirect(props) {
console.log({ props });
const defaultLang = 'en';
const redirectPath = `/${defaultLang}${props.history.location.pathname}`;
console.log(redirectPath);
props.history.replace({
pathname: redirectPath,
});
}
...
const TestingRoutes = () => {
return (
<Switch>
<Route exact path="/:lang/*" render={() => <h1>Test</h1>}>
<Route path="/:lang/test" render={() => <h2>Test</h2>} />
<Route path="/:lang/test2" render={() => <h2>Test2</h2>} />
</Route>
<Route path="*" render={langRedirect} />
</Switch>
);
};