Reactjs 在同一级别上管理另一个渲染的组件
我有以下代码:Reactjs 在同一级别上管理另一个渲染的组件,reactjs,Reactjs,我有以下代码: class Header extends Component { render() { return( <ul> <li><a onClick={() => this.props.onViewChange('home')}>Home</a></li> <li><a onClick={() => this.props.onViewC
class Header extends Component {
render() {
return(
<ul>
<li><a onClick={() => this.props.onViewChange('home')}>Home</a></li>
<li><a onClick={() => this.props.onViewChange('login')}>Login</a></li>
<li><a onClick={() => this.props.onViewChange('register')}>Register</a></li>
<li><a onClick={() => this.props.onViewChange('profile')}>Profile</a></li>
</ul>
)
}
}
class App extends Component {
constructor(props) {
super(props)
this.state = ({ view: "home" })
}
render()
{
return (
<div className="app">
<Header onViewChange={(view) => this.setState({ view: view })} />
<Main view={this.state.view} />
</div>
)
}
}
class Main extends Component {
constructor(props) {
super(props)
this.state = { view: props.view }
}
render() {
switch (this.state.view) {
case "home":
return <Home />
case "login":
return <Login />
case "register":
return <Register />
case "profile":
return <Profile />
}
}
}
类头扩展组件{
render(){
返回(
- this.props.onViewChange('home')}>home
- this.props.onViewChange('login')}>login
- this.props.onViewChange('register')}>register
- this.props.onViewChange('profile')}>profile
)
}
}
类应用程序扩展组件{
建造师(道具){
超级(道具)
this.state=({view:“home”})
}
render()
{
返回(
this.setState({view:view})}/>
)
}
}
类主扩展组件{
建造师(道具){
超级(道具)
this.state={view:props.view}
}
render(){
开关(this.state.view){
案例“家”:
返回
案例“登录”:
返回
“登记册”一案:
返回
案例“简介”:
返回
}
}
}
如您所见,我有一个
,其中包含一个
和一个
管理正在呈现的视图,并且
具有更改当前视图的导航。如果我在
中添加组件WillReceiveProps
,那么这段代码的编写方式只会起作用,但我发现它是一种反模式,甚至被弃用
管理这种情况的更好方法是什么
注意事项:
- 我暂时不使用React路由器或Redux。我想知道在香草中应该怎么做
- 我知道我可以管理在
中直接呈现哪个视图。这只是我问题的一个简化版本,我的兴趣在于知道如何在同一级别的组件之间传递信息 - 我想找到一个解决方案,使我能够从多个位置控制视图,甚至是从同一
组件内部主
- 一种解决方案如下:
class Main extends Component {
render() {
switch (this.props.view) {
case "home":
return <Home />
case "login":
return <Login />
case "register":
return <Register />
case "profile":
return <Profile />
}
}
}
类主扩展组件{
render(){
切换(this.props.view){
案例“家”:
返回
案例“登录”:
返回
“登记册”一案:
返回
案例“简介”:
返回
}
}
}
您还可以将回调传递给
,这将更改
中的视图状态。在这种情况下,视图状态将只存在于一个位置,即
,您不必像现在这样在
中复制它。因为复制状态通常是不建议的,这就是为什么需要组件将接收props
,正如您所指出的,这是反模式的。但是,如果我想从Main
内部更改视图,我将无法这样做,不是吗?(我应该把它包括在问题中。我会加上它)@Enriquemorennotent为什么不,你可以。只需将回调传递给Main
,这会更改App
中的视图状态,不是吗?您的意思是将方法传递给Main
,以向上控制状态?像这样this.setState({view:view)}>
Main中,如果我想更改视图和其他一些主绑定状态,该怎么办?我应该一个接一个地调用回调函数和设置状态吗?@EnriqueMorenoTent我不知道你的意思,但如果你想以一种方式改变状态,那就是父函数将回调函数传递给子函数,就像你现在使用的App和header一样。你的代码是正确的,除了不应该在Main
中将道具复制到状态之外。那样做没有好处。将道具复制到状态通常是一种反模式