ReactJs Router 在将其包装在组件中时复制自身
ReactJs Router Duplicates itself when wrap it in component
我是 React 初学者,我正在为我的路由器使用 React 4、Redux 和 react-router-dom 包。
我有一个 App.js 文件,它将 Main 与 mapStateToProps & mapDispatchToProps 连接起来
//App.js
const App = connect(mapStateToProps, mapDispatchToProps)(Main);
我的主要组件呈现 header 并克隆 child 个元素
//Main.js
export default class Main extends React.Component {
render() {
return (
<div>
<h1>Hi I'm Header</h1>
{React.cloneElement(this.props.children, this.props)}
</div>
);
}
}
我的 child 组件包含一个简单的 Json 道具字符串化
//UserList.js
export default class UsersList extends React.Component {
render(){
return (
<pre>
{JSON.stringify(this.props, null, "")}
</pre>
);
}
}
我制作了一个 index.js 文件,其中有一个路由并包含提供程序,提供程序 child 是一个路由器,我的路由器包含其他应用程序路由
//index.js
const router = (
<Provider store={store}>
<App>
<Router history={history}>
<Switch>
<Route exact path="/" component={UsersList}/>
</Switch>
</Router>
</App>
</Provider>
);
render(router, document.getElementById('root'));
如你所见,我有一个应用程序,我的应用程序将 main 连接到 mapstatetoprops 和 mapdispatchtoprops,最后将 child 路由(UsersList 组件)提供给 parent(主要组件)并在结束它呈现 child.
当我对 child 组件道具进行字符串化时,它只显示历史、位置和其他路线道具,但它不显示我的用户道具,这是应用程序的默认状态!
当我使用 React 开发者工具时,它显示我的路由器内还有其他路由器!
Duplicated Router Screenshot
我发现当我将路由器放入某些东西(组件、元素或类似的东西)时,它会在其内部创建另一个路由器,而 child 路由器没有 parent 属性。
我也试过添加
{...this.props}
路线或
render={(props) => <UserList {props} />}
我尝试的另一种方法是使用嵌套路由,例如
const router = (
<Provider store={store}>
<Router history={history}>
<Route path="/" component={App}>
<Route exact component={UsersList}/>
<Route path="/single/:id" component={SingleUser}/>
</Route>
</Router>
</Provider>
);
但结果是这个错误:
React.cloneElement(...): The argument must be a React element, but you passed undefined.
谢谢。
由于你想将 props 从 App 组件传递到 UsersList,你需要以不同的方式重组你的路由,因为在当前的方式中,props 被传递到 Router,但 Router 不会将它们传递到路由组件
index.js
const router = (
<Provider store={store}>
<Router history={history}>
<Route component={App} />
</Router>
</Provider>
);
render(router, document.getElementById('root'));
Main.js
export default class Main extends React.Component {
render() {
return (
<div>
<h1>Hi I'm Header</h1>
<Switch>
<Route exact path="/" render={(routerProps) => <UsersList {...this.props} {...routerProps}/>}/>
</Switch>
</div>
);
}
}
我是 React 初学者,我正在为我的路由器使用 React 4、Redux 和 react-router-dom 包。
我有一个 App.js 文件,它将 Main 与 mapStateToProps & mapDispatchToProps 连接起来
//App.js
const App = connect(mapStateToProps, mapDispatchToProps)(Main);
我的主要组件呈现 header 并克隆 child 个元素
//Main.js
export default class Main extends React.Component {
render() {
return (
<div>
<h1>Hi I'm Header</h1>
{React.cloneElement(this.props.children, this.props)}
</div>
);
}
}
我的 child 组件包含一个简单的 Json 道具字符串化
//UserList.js
export default class UsersList extends React.Component {
render(){
return (
<pre>
{JSON.stringify(this.props, null, "")}
</pre>
);
}
}
我制作了一个 index.js 文件,其中有一个路由并包含提供程序,提供程序 child 是一个路由器,我的路由器包含其他应用程序路由
//index.js
const router = (
<Provider store={store}>
<App>
<Router history={history}>
<Switch>
<Route exact path="/" component={UsersList}/>
</Switch>
</Router>
</App>
</Provider>
);
render(router, document.getElementById('root'));
如你所见,我有一个应用程序,我的应用程序将 main 连接到 mapstatetoprops 和 mapdispatchtoprops,最后将 child 路由(UsersList 组件)提供给 parent(主要组件)并在结束它呈现 child.
当我对 child 组件道具进行字符串化时,它只显示历史、位置和其他路线道具,但它不显示我的用户道具,这是应用程序的默认状态!
当我使用 React 开发者工具时,它显示我的路由器内还有其他路由器!
Duplicated Router Screenshot
我发现当我将路由器放入某些东西(组件、元素或类似的东西)时,它会在其内部创建另一个路由器,而 child 路由器没有 parent 属性。
我也试过添加
{...this.props}
路线或
render={(props) => <UserList {props} />}
我尝试的另一种方法是使用嵌套路由,例如
const router = (
<Provider store={store}>
<Router history={history}>
<Route path="/" component={App}>
<Route exact component={UsersList}/>
<Route path="/single/:id" component={SingleUser}/>
</Route>
</Router>
</Provider>
);
但结果是这个错误:
React.cloneElement(...): The argument must be a React element, but you passed undefined.
谢谢。
由于你想将 props 从 App 组件传递到 UsersList,你需要以不同的方式重组你的路由,因为在当前的方式中,props 被传递到 Router,但 Router 不会将它们传递到路由组件
index.js
const router = (
<Provider store={store}>
<Router history={history}>
<Route component={App} />
</Router>
</Provider>
);
render(router, document.getElementById('root'));
Main.js
export default class Main extends React.Component {
render() {
return (
<div>
<h1>Hi I'm Header</h1>
<Switch>
<Route exact path="/" render={(routerProps) => <UsersList {...this.props} {...routerProps}/>}/>
</Switch>
</div>
);
}
}