【问题标题】:react Router, add variable to url before view routing反应路由器,在查看路由之前将变量添加到url
【发布时间】:2020-06-10 07:22:29
【问题描述】:

我开始使用reactJSnodejs 构建下一个网站。该网站必须至少有 2 种语言,并且应该可以以所需语言共享指向网站的链接。我很快得出结论,我需要的是具有以下 url 结构

domain.com/en-GB
domain.com/en-GB/gallery
domain.com/en-GB/contact

前端Router:

  import { BrowserRouter as Router, Switch, Route } from "react-router-dom";

  ...
  <Router>
    <React.Fragment>
      <Header />
        <Suspense fallback={<Loading />}>
          <Switch>
            <Route exact path="/">
              <Landing />
            </Route>
            <Route path="/gallery">
              <Gallery />
            </Route>
            <Route path="/about-us">
              <AboutUs />
            </Route>
            <Route path="/contact">
              <Contact />
            </Route>
            <Route>
              <PageNotFound />
            </Route>
          </Switch>
        </Suspense>
      <Footer />
    </React.Fragment>
  </Router>
  ...

前端菜单:

import { NavLink } from "react-router-dom";

...
<NavLink to="/about-us">
    {Lang.resolve("HEADER_MENU_ABOUT_US")}
</NavLink>
...

webpack 配置片段:

...
const extractTextPlugin = new ExtractTextPlugin({
  filename: "css/style.[hash:8].css",
  allChunks: true
});

module.exports = {
  ...
  output: {
    filename: "js/main.[hash:8].js"
  }
  ...
},
...

服务器路由:

...
const router = express.Router();

let landing = (req, res, next) => {
  res.sendFile(path.join(__dirname, "../../index.html")); // html build by webpack
};

router.get("/", landing);
router.get("/:view", landing);
...

我想知道reactJS 中是否已经有一些东西允许这样做,或者我需要手动附加language 部分网址,例如:&lt;Route path={_LANG_ + "/gallery"}&gt;

可能还需要对服务器路由和webpack路径进行一些调整,否则在加载css、js文件时会出现问题domain.com/en-GB/css/style.css

也许有人已经反对这个想法并且可以提供一些提示。

【问题讨论】:

    标签: javascript node.js reactjs url-routing


    【解决方案1】:

    我不确定您将如何处理每个组件的翻译,但如果您有不同的组件(根据语言),那么您的 "basenames" 将有不同的选项strong>路由器:

    <BrowserRouter basename="/calendar">
    <Link to="/today"/> // renders <a href="/calendar/today">
    <Link to="/tomorrow"/> // renders <a href="/calendar/tomorrow">
    ...
    </BrowserRouter>
    

    来自文档: https://reacttraining.com/react-router/web/api/BrowserRouter/basename-string

    类似的问题: Multiple BrowserRouter Shows Multiple Components

    【讨论】:

    • 问题是,仅仅因为你有 5 种语言,就有 5 个组件来呈现相同的东西,这是非常重复和不好的做法。语言字符串只是从翻译文件中取出并注入{Lang.resolve("TRANSLATION_KEY")},所以这个解决方案可能很差。
    • 既然您明确向我们提供了更多信息,我同意这对于您的方法来说是一个糟糕的方法。我找到了这篇文章:medium.com/prototyped/…。它使用来自 FormatJS 的 react-intl。也许它会给你一个提示?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2015-01-25
    • 2018-05-01
    • 2018-12-14
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多