javascript - 在服务器端的 react-router 中使用 basename

标签 javascript reactjs react-router server-side-rendering

我从 /clientpanel 为我的网站提供服务我服务器上的目录。所以我的网址是 http://xxx.yy/clientpanel .这是我的客户端代码:

const history = useRouterHistory(createHistory)({
    basename: "/clientpanel"
});

render(
    <Router history={history} routes={routes}/>,
    document.getElementById("root")
);

在客户端,一切正常。所有网址都相对于 /clientpanel ,但我对如何在服务器上进行这项工作有疑问。这是我的服务器端代码:

const history = useRouterHistory(createMemoryHistory)({
    basename: "/clientpanel"
});

match({ routes, location: req.url, history}, (error, redirectLocation, renderProps) => {
    if (renderProps) {
        const html = renderToString(
            <RouterContext {...renderProps}/>
        );

        res.send(renderFullPage(html))
    }
});

在第一页加载时,我需要省略 /clientpanel在 url 中进行这项工作,但在先单击 <Link> 后在客户端进行/clientpanel被添加到开头。如何使其在客户端和服务器端工作一致?

最佳答案

我终于让它可以使用以下代码:

const basename = '/foo'
const location = req.url.replace(basename, '')
// createMemoryHistory from the history package
const history = useRouterHistory(() => createMemoryHistory(location))({ basename })

match({ history, routes, location }, (error, redirectLocation, renderProps) => {

编辑

更好的是:

const basename = '/foo'
const location = req.url.replace(basename, '')
// createMemoryHistory from the react-router package
const history = createMemoryHistory({ entries: [location], basename })

match({ history, routes, location }, (error, redirectLocation, renderProps) => {

关于javascript - 在服务器端的 react-router 中使用 basename,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40528489/

相关文章:

javascript - 如何在 Javascript 中循环十六进制?

javascript - 如何在成功和错误这两种情况下有效地调用 setState?

javascript - Meteor:迭代集合内的对象

javascript - webpack-dev-server - 浏览器不刷新

javascript - React.js - 从 JSON 模式创建输入元素

javascript - jsx 中的模板文字

reactjs - 如何在不重新加载整个页面的情况下进行路由?

javascript - Knockout Js 和 Typeahead

reactjs - React + Redux + Router - 我应该为所有页面/组件使用一种状态/存储吗?

javascript - 更新 URL 而不刷新页面