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
      中将道具复制到状态之外。那样做没有好处。将道具复制到状态通常是一种反模式