ReactRouter链接渲染#/而不是/

ReactRouter Link rendering #/ instead of /

本文关键字:链接 ReactRouter      更新时间:2023-09-26

我有以下使用ReactRouter的组件:

'use strict'
import React from 'react'
import Container from '../../Elements/Container.jsx'
import Menu from '../../Collections/Menu.jsx'
import Item from '../../Elements/Item.jsx'
import {Link} from 'react-router'
const Sidebar = ( ) => {
    return (
        <Menu className='vertical purple inverted sidebar left'>
        <Item><Link to='/home'>Home</Link></Item>
        <Item><Link to='/roadmap'>Roadmap</Link></Item>
        <Item><Link to='/beta'>Beta</Link></Item>
        <Item><Link to='/about'>Sobre</Link></Item>
    </Menu>
    )
}
export default Sidebar

当我运行我的应用程序并查看源时,Link组件分别呈现为localhost:3000/#/localhost:3000/#/roadmap,而不是localhost:3000/localhost:3000/roadmap,这是意外的行为。它可能是什么?

注意:我使用同构,它似乎与这种意外行为有关。我在我的浏览器控制台上得到了这个:

警告:React试图重用容器中的标记,但校验和无效。这通常意味着您正在使用服务器渲染和在服务器上生成的标记不是客户端正在等待。React注入了新的标记来补偿有效,但您已经失去了服务器渲染的许多好处。相反,要弄清楚为什么生成的标记在客户端或服务器:

(client) "><a class="" href="#/" data-reactid=".2
(server) "><a class="" href="/" data-reactid=".27

注意2:根据要求,以下是我的路由器代码:

路由.js

'use strict'
import React from 'react'
import {browserHistory, Router, Route, IndexRedirect} from 'react-router'
import Page from './Page.jsx'
import Home from './Home.jsx'
import Roadmap from './Roadmap.jsx'
import Beta from './Beta.jsx'
const routesA = (
    <Router history={browserHistory>
        <Route path='/' component={Page}>
            <Route path='home' component={Home} />
            <Route path='roadmap' component={Roadmap} />
            <Route path='beta' component={Beta} />
            <Route path='about' component={undefined} />
            <IndexRedirect to='home' />
        </Route>
    </Router>
)
const routesB = {
    path: '/',
    history: browserHistory,
    component: Page,
    indexRedirect: {to: '/home'},
    childRoutes: [
        {path:'/home', component: Home},
        {path:'/roadmap', component: Roadmap},
        {path:'/beta', component: Beta},
        {path:'/about', component: undefined}
    ]
}
export default routesA

客户端:

'use strict'
import React from 'react'
import ReactDOM from 'react-dom'
import routes from './components/Pages/Main/routes.js'
ReactDOM.render(routes, document.getElementById('site'))

服务器端:


'use strict'
import express from 'express'
import React from 'react'
import {renderToString} from 'react-dom/server'
import {RoutingContext, match,browserHistory} from 'react-router'
import createLocation from 'history/lib/createLocation'
import routes from '../app/components/Pages/Main/routes.js'
let server = express()
server.use((request, response) => {
    let l = createLocation(request.url)
    match({routes, location: l}, (error, redirectLocation, renderProps) => {
        if(error)
            response.send(500, error.message)
        else if(redirectLocation)
            response.redirect(302, redirectLocation.pathname + redirectLocation.search)
        else if (renderProps)
            response.render('index', {title: 'Teste', reactOutput: renderToString(<RoutingContext {...renderProps} />)})
        else
            response.send(404, 'Not found!')
    })
})
export default server

注意3:
我发现,如果我使用routes.jsroutesA(JSX语法),链接将返回哈希(#/),但如果我使用routesB(纯数组),链接会按预期返回(/)。如何使用JSX语法并返回正确的URL?

您使用的是什么版本的react路由器?

如果你仍在使用1.0.x,请在stackoverflow上查看这个答案,并在他们的GitHub上查看这个问题。

我碰巧也遇到了这个问题,发现我仍然在使用1.0.3,这是npm上的最新版本。

然而,GitHub和docs上最新版本的react路由器适用于2.0.x.

您可以使用以下npm命令将react router版本更新为测试版(当前为2.0.0-rc4):npm install --save react-router@beta