javascript - Reactjs - 路由期间道具不改变
问题描述
我有一个BrowserRouter
基于Route
. 这些组件中的大多数都具有相似的标记。
所以,我创建了一个Wrapper
组件,它将接收道具,并{children}
在提供时渲染它。这在'sWrapper
中被调用。Route
import React, {Component} from 'react'
import Context from '../../provider'
import {
BrowserRouter,
Route,
Redirect,
Switch,
} from "react-router-dom"
import {
Container,
Row,
Col,
} from 'reactstrap'
import Profile from './ContentComponent/Profile'
import Subreddit from './ContentComponent/Subreddit'
import PostExpanded from './ContentComponent/PostExpanded'
import InfoComponent from './InfoComponent'
import SwitchTab from './ContentComponent/Subreddit/SwitchTab'
import NewPost from './ContentComponent/assets/NewPost'
import './style.css'
class Wrapper extends React.Component {
componentDidMount() {
this.props.setActiveTab(this.props.activeTab);
}
render() {
{console.log('Wrapper props: ', this.props)}
return (
<Row>
<Col md='8' id='content-block'>
<SwitchTab />
{this.props.children}
</Col>
<Col md='4' id='info-block'>
<InfoComponent info={this.props.info} {...this.props}/>
</Col>
</Row>
)
}
}
export default class BodyComponent extends Component {
render() {
return (
<BrowserRouter>
<Context.Consumer>
{context => {
return (
<Container>
<Switch>
<Route
exact
path='/'
render={() =>
<Redirect to='r/home/' />
}
/>
<Route
exact
path='/r/home/'
render={() =>
<Wrapper
setActiveTab={context.toggleTab}
activeTab={'1'}
info='home'
/>
}
/>
<Route
exact
path='/r/popular/'
render={() =>
<Wrapper
setActiveTab={context.toggleTab}
activeTab={'2'}
info='popular'
/>
}
/>
<Route
exact
path='/r/all/'
render={() =>
<Wrapper
setActiveTab={context.toggleTab}
activeTab={'3'}
info='all'
/>
}
/>
<Route
exact
path='/u/:username/'
render={(props) => {
return (
<Wrapper
setActiveTab={context.toggleTab}
activeTab={'4'}
info='user'
user={props.match.params.username}
>
<Profile username={props.match.params.username} />
</Wrapper>
)
}}
/>
<Route
exact
path = '/r/:subreddit/new/'
render={(props) => {
return (
<Wrapper
setActiveTab={context.toggleTab}
activeTab={'4'}
info='subreddit'
subreddit={props.match.params.subreddit}
>
<NewPost />
</Wrapper>
)
}}
/>
<Route
exact
path = '/r/:subreddit/post/:postid/'
render={(props) => {
return (
<Wrapper
setActiveTab={context.toggleTab}
activeTab={'4'}
info='subreddit'
subreddit={props.match.params.subreddit}
>
<PostExpanded
subreddit={props.match.params.subreddit}
postid={props.match.params.postid}
/>
</Wrapper>
)
}}
/>
<Route
exact
path='/r/:subreddit/'
render={(props) => {
return (
<Wrapper
setActiveTab={context.toggleTab}
activeTab={'4'}
info='subreddit'
subreddit={props.match.params.subreddit}
>
<Subreddit subreddit={props.match.params.subreddit} />
</Wrapper>
)
}}
/>
<Route
exact
path = '/new/'
render={(props) => {
return (
<Wrapper
setActiveTab={context.toggleTab}
activeTab={'4'}
info='new'
>
<NewPost />
</Wrapper>
)
}}
/>
</Switch>
</Container>
)
}}
</Context.Consumer>
</BrowserRouter>
)
}
}
我在这里面临多个问题,我认为它们都可以一次解决,我不知道如何?
当我 使用以下方式更改URL时, Wrapper 道具没有改变:
props.history.push
<NavItem> <NavLink className={classnames({ active: context.activeTab === '1' })} onClick={() =>{ context.toggleTab('1'); this.props.history.push('/r/home/') }} > Home </NavLink> </NavItem> <NavItem> <NavLink className={classnames({ active: context.activeTab === '2' })} onClick={() => { context.toggleTab('2'); this.props.history.push('/r/popular/') }} > Popular </NavLink> </NavItem>
解决方案
我想我在浏览我的代码时遇到了问题。所以,当我想props.history.push
在我的HeaderComponent
. 我遇到了错误,所以我用它包装BrowserRouter
并导出withRouter()
它使我能够使用props.history.push
所以,在不知不觉中我创建了 2 BrowserRouter
:
<React.Fragment>
<BrowserRouter>
<NavbarComponent />
<TabComponent />
</BrowserRouter>
<BrowserRouter>
<Switch>
<Route ... />
<Route ... />
</Switch>
</BroserRouter>
</React.Fragment>
因此,我正在更改URL,TabComponent
并希望它能够更改我Route
的 's 并修改内容。
拥有一个全局BrowserRouter
(不要认为全局是正确的词,但是)解决了这个问题。
<React.Fragment>
<BrowserRouter>
<NavbarComponent />
<TabComponent />
<Switch>
<Route ... />
<Route ... />
</Switch>
</BroserRouter>
</React.Fragment>
推荐阅读
- node.js - 在 renderStatic 期间反应头盔混合场
- deep-learning - 除了 Keras 和 Spacy,我可以使用 Stanford Core NLP 进行深度学习吗?
- c# - 使用 Ajax 渲染局部视图的问题
- reactjs - 用打字稿反应 Redux
- android - Android Studio 应用显示问题
- idris - 让 Idris 相信递归调用的整体性
- ajax - 尝试导入 json 时如何修复 django 中的 ImportError?
- unity3d - 如何在 ARCore 生成的平面上沿相机视图方向移动对象/预制件
- c - 如何在 C 中按如下方式打印模式?
- html5-canvas - fabric.js 在保持深度的同时移动图像?