从 v3 迁移到 v4 react-router 时出现错误

Posted

技术标签:

【中文标题】从 v3 迁移到 v4 react-router 时出现错误【英文标题】:Getting an error when migrating from v3 to v4 react-router 【发布时间】:2017-10-04 17:20:31 【问题描述】:

我决定使用 react-router v4 而不是 v3 并更改我的路径,以便它们与路由器和 redux 的 v4 一起使用,但我收到以下错误(我使用 export default 导出所有组件并且没有忘记导出任何事物)。我的代码有什么问题?

元素类型无效:应为字符串(用于内置组件) 或类/函数(用于复合组件)但得到:未定义。你 可能忘记从定义它的文件中导出您的组件。

我试图打开这个 v3 路由器代码,它有效:

<Router history=history>
  <Route path="/" component=App>
    <IndexRoute component=UserGrid></IndexRoute>
    <Route path="/login" component=Login></Route>
    <Route path="/users/:userId" component=UserPage></Route>
    <Route path="/registration" component=RegistrationPage></Route>
    <Route path="/topSecret" component=requireAuth(SecretComponent)></Route>
  </Route>
</Router>

像这样进入 v4 代码:

const history = createBrowserHistory()

const router = (
  <Provider store=store>
    <BrowserRouter history=history>
        <App>
          <Route exact path="/" component=UserGrid></Route>
          <Route path="/login" component=Login></Route>
          <Route path="/users/:userId" component=UserPage></Route>
          <Route path="/registration" component=RegistrationPage></Route>
          <Route path="/topSecret" component=requireAuth(SecretComponent)></Route>
        </App>
    </BrowserRouter>
  </Provider>
)

ReactDOM.render(
  router,
  document.getElementById('root')
)

App.js:

class App extends React.Component 
    render() 
        return (
            <div>
                <NavBar />
                React.cloneElement(this.props.children, this.props)
            </div>
        )
    


function mapStateToProps (state) 
  return 
    session: state.session,
    users: state.users
  


function mapDispatchToProps (dispatch) 
  return bindActionCreators(actionCreators, dispatch)



export default connect(mapStateToProps, mapDispatchToProps)(App)

商店:

import applyMiddleware, createStore from 'redux'
import createLogger from 'redux-logger'
import  connectRouter, routerMiddleware  from 'connected-react-router'
import thunk from 'redux-thunk'
import  createBrowserHistory  from 'history'
import rootReducer from '../reducers/rootReducer'
import async from '../middlewares/async'
import authUser from '../actions/actionCreators'

const history = createBrowserHistory()

const initialState = 
  bla-bla


const store = createStore(
  connectRouter(history)(rootReducer),
  initialState,
  applyMiddleware(
    async,
    thunk,
    routerMiddleware(history),
    createLogger()
  )
)

export default store

【问题讨论】:

【参考方案1】:

我在 App 中删除了 React.cloneElement(this.props.children, this.props)(将 props 传递给它的孩子的容器)并用 this.props.children 替换它,并将需要状态的组件单独连接到商店,这解决了我的问题。但我仍然想知道为什么它不适用于React.cloneElement(this.props.children, this.props)

【讨论】:

以上是关于从 v3 迁移到 v4 react-router 时出现错误的主要内容,如果未能解决你的问题,请参考以下文章

从 Ionic v1 迁移到 Ionic v3 或 v4?

markdown 在iOS 11或更高版本上将数据从V3迁移到V4

react-router v3和v4区别

浅入浅出 react-router v4 实现嵌套路由

webpack v3 结合 react-router v4 做 dynamic import — 按需加载(懒加载)

powershell 迁移Web应用程序中所有Web的SharePoint UI(v3到v4)。