React重新渲染但未显示正确的组件

React re-rendering but not displaying correct component

本文关键字:组件 显示 新渲染 React      更新时间:2023-09-26

我有一个Profile组件,它应该根据用户操作(单击标记)呈现不同的组件。我有正在传递的信息和正在更新的正确组件的状态。但是,当重新渲染Profile组件时,它仍然渲染相同的组件,而不是新选择的组件。

class Profile extends Component {
  constructor(props){
    super(props);
    this.state = {
      currentComponent: 'sales'
    }
    this.changeComponent = this.changeComponent.bind(this);
  }
  changeComponent(component){
    console.log('You are trying to change component!');
    console.log(this);
    this.setState({currentComponent: component});
  }
  render(){
      let component;
      switch(this.state.currentComponent){
        case 'sales':
          component =  <Sales />;
          break;
        case 'income':
          component = <Income />;
        default:
          component =  <Sales />;
      }
      const menuItems = [
        {
          text: 'Sales'
        },
        {
          text: 'Team'
        },
        {
          text: 'Income'
        },
        {
          text: 'Edit'
        }
      ]
      console.log(this.state);
      return <div id="profileWrap">
        <div id="profileMenu">
          <NavMenu menuItems={menuItems} currentComponent={this.state.currentComponent} changeComponent={this.changeComponent}/>
        </div>
        {component}
      </div>
  }
}

我的Sales/Income组件只是

import React, {Component} from 'react';
import {Link} from 'react-router';
class Sales extends Component {
  render(){
      return(<h1>This is Sales!</h1>)
  }
}
export default Sales;

用CCD_ 5代替CCD_。

正如您所看到的,在Profile组件内部,当我访问该函数时,我会记录我的工作人员当时认为this是什么(这两个似乎都是正确的),并且我还会在重新渲染时记录状态,这确实显示了正在使用的正确状态。我的switch语句有什么问题吗?

编辑

将switch语句更改为if/elseif语句后,一切都正常。为什么switch导致它不更新?

您的switch语句中缺少break

  switch(this.state.currentComponent){
    case 'sales':
      component =  <Sales />;
      break;
    case 'income':
      component = <Income />;
      break; // <-- need this here or will fall through to default.
    default:
      component =  <Sales />;
  }

更新:您还可以通过将组件添加到menuItems数组来避免这一切。

 this.state = { currentComponent: <Sales /> }
 ...
 const menuItems = [
    {
      text: 'Sales'
      component: <Sales />
    },
    ...
  ]

然后在渲染中:{ this.state.currentComponent }