undefined this.props.children 当使用 React router 和 webpack 获取异步组件时
undefined this.props.children when getting async component with react router and webpack
我正在使用 React、Redux 和 React Router 等来构建和示例应用程序。
我正在尝试异步加载应用程序的不同部分。我将我的应用程序分成了鸭子,我正在按照这个例子 https://github.com/insin/react-examples/tree/master/code-splitting-redux-reducers
我正在使用:
react-router 2.0.1
webpack 1.12.13
webpack-dev-middleware 1.5.1
webpack-hot-middleware 2.6.4
我的路线:
import App from './components/layouts/app'
import Home from './components/common/home'
import Login from './containers/login'
import Register from './containers/register'
export default function configureRoutes(reducerRegistry) {
return(
<Route component={App}>
<Route path='/' component={Home} />
<Route path='/login' component={Login}/>
<Route path='/register' component={Register}/>
<Route path='/admin' getComponent={(location, cb) => {
require.ensure([], require => {
reducerRegistry.register({admin: require('./modules/admin')})
if (process.env.NODE_ENV !== 'production') {
if (module.hot) {
module.hot.accept('./modules/admin', () => {
reducerRegistry.register({admin: require('./modules/admin')})
})
}
}
cb(null, require('./containers/admin'))
})
}}/>
</Route>
)}
我的管理组件:
import React, { PropTypes, Component } from 'react'
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import { load } from '../modules/admin'
class Admin extends Component {
componentDidMount() {
this.props.load()
}
render() {
const { message, isFetching } = this.props
return (
<div>
<p>{message}</p>
<p>This module was loaded via chunk </p>
{isFetching && <p>Doing some fake loading ...</p>}
</div>
)
}
}
Admin.propTypes = {
message: PropTypes.string.isRequired,
isFetching: PropTypes.bool.isRequired,
load: PropTypes.string.isRequired
}
function mapStateToProps(state) {
return state.admin
}
function mapDispatchToProps(dispatch) {
return bindActionCreators({ load }, dispatch)
}
export default connect(mapStateToProps, mapDispatchToProps)(Admin)
问题是 /admin
,app
组件的 this.props.children
未定义,所以我的组件永远不会被渲染。
在转到 /admin
后,我还能够检查状态是否不包括管理员。
我可以看到正在请求和响应所请求的块,它确实包含减速器和组件。但是它们没有被应用。
您知道从哪里开始寻找吗?我不在他们身边
提前致谢
我正在使用带有导入和导出的 ES6 模块,但 webpack 使用 ES5、commonJS 模块,因此 require
请求使用包含 default
和我正在导出的所有其他属性的对象的答案来自那个模块。
所以我必须将 require('./x')
请求更改为 require('./x').default
才能使其正常工作
export default function configureRoutes(reducerRegistry) {
return(
<Route component={App}>
<Route path='/' component={Home} />
<Route path='/login' component={Login}/>
<Route path='/register' component={Register}/>
<Route path='/admin' getComponent={(location, cb) => {
require.ensure([], require => {
const reducer = require('./modules/admin').default
const component = require('./containers/admin').default
reducerRegistry.register({admin: reducer})
if (process.env.NODE_ENV !== 'production') {
if (module.hot) {
module.hot.accept('./modules/admin', () => {
reducerRegistry.register({admin: reducer})
})
}
}
cb(null, component)
})
}}/>
</Route>
)}
我正在使用 React、Redux 和 React Router 等来构建和示例应用程序。
我正在尝试异步加载应用程序的不同部分。我将我的应用程序分成了鸭子,我正在按照这个例子 https://github.com/insin/react-examples/tree/master/code-splitting-redux-reducers
我正在使用:
react-router 2.0.1
webpack 1.12.13
webpack-dev-middleware 1.5.1
webpack-hot-middleware 2.6.4
我的路线:
import App from './components/layouts/app'
import Home from './components/common/home'
import Login from './containers/login'
import Register from './containers/register'
export default function configureRoutes(reducerRegistry) {
return(
<Route component={App}>
<Route path='/' component={Home} />
<Route path='/login' component={Login}/>
<Route path='/register' component={Register}/>
<Route path='/admin' getComponent={(location, cb) => {
require.ensure([], require => {
reducerRegistry.register({admin: require('./modules/admin')})
if (process.env.NODE_ENV !== 'production') {
if (module.hot) {
module.hot.accept('./modules/admin', () => {
reducerRegistry.register({admin: require('./modules/admin')})
})
}
}
cb(null, require('./containers/admin'))
})
}}/>
</Route>
)}
我的管理组件:
import React, { PropTypes, Component } from 'react'
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import { load } from '../modules/admin'
class Admin extends Component {
componentDidMount() {
this.props.load()
}
render() {
const { message, isFetching } = this.props
return (
<div>
<p>{message}</p>
<p>This module was loaded via chunk </p>
{isFetching && <p>Doing some fake loading ...</p>}
</div>
)
}
}
Admin.propTypes = {
message: PropTypes.string.isRequired,
isFetching: PropTypes.bool.isRequired,
load: PropTypes.string.isRequired
}
function mapStateToProps(state) {
return state.admin
}
function mapDispatchToProps(dispatch) {
return bindActionCreators({ load }, dispatch)
}
export default connect(mapStateToProps, mapDispatchToProps)(Admin)
问题是 /admin
,app
组件的 this.props.children
未定义,所以我的组件永远不会被渲染。
在转到 /admin
后,我还能够检查状态是否不包括管理员。
我可以看到正在请求和响应所请求的块,它确实包含减速器和组件。但是它们没有被应用。
您知道从哪里开始寻找吗?我不在他们身边
提前致谢
我正在使用带有导入和导出的 ES6 模块,但 webpack 使用 ES5、commonJS 模块,因此 require
请求使用包含 default
和我正在导出的所有其他属性的对象的答案来自那个模块。
所以我必须将 require('./x')
请求更改为 require('./x').default
才能使其正常工作
export default function configureRoutes(reducerRegistry) {
return(
<Route component={App}>
<Route path='/' component={Home} />
<Route path='/login' component={Login}/>
<Route path='/register' component={Register}/>
<Route path='/admin' getComponent={(location, cb) => {
require.ensure([], require => {
const reducer = require('./modules/admin').default
const component = require('./containers/admin').default
reducerRegistry.register({admin: reducer})
if (process.env.NODE_ENV !== 'production') {
if (module.hot) {
module.hot.accept('./modules/admin', () => {
reducerRegistry.register({admin: reducer})
})
}
}
cb(null, component)
})
}}/>
</Route>
)}