如何在React组件中使用switch语句?

我有一个React组件,在该组件的render方法内部,我有这样的东西:

render() {
    return (
        <div>
            <div>
                // removed for brevity
            </div>

           { switch(...) {} }

            <div>
                // removed for brevity
            </div>
        </div>
    );
}

现在的要点是,我有两个固定的div元素,一个在顶部,一个在底部。在中间,我想有一个switch语句,根据状态下的值,我想渲染一个不同的组件。因此,基本上,我希望两个div元素始终固定,并且每次都在中间以呈现不同的组件。我正在使用它来实现多步付款程序)。不过,正如目前的代码一样,它不起作用,因为它给了我一个错误,说这switch是意外的。有什么想法可以实现我想要的吗?

猴子Davaid神乐2020/03/18 18:34:40

您无法在渲染中进行切换。放置访问一个元素的对象文字的伪切换方法不是理想的,因为它会导致处理所有视图,并可能导致该状态下不存在的prop的依赖项错误。

这是一种很好的干净方法,不需要预先渲染每个视图:

render () {
  const viewState = this.getViewState();

  return (
    <div>
      {viewState === ViewState.NO_RESULTS && this.renderNoResults()}
      {viewState === ViewState.LIST_RESULTS && this.renderResults()}
      {viewState === ViewState.SUCCESS_DONE && this.renderCompleted()}
    </div>
  )

如果视图状态的条件不仅仅基于简单的属性(例如每行多个条件),则枚举和getViewState封装条件函数是分离此条件逻辑并清理渲染的好方法。

樱凯Mandy2020/03/18 18:34:40

这是一个完整的工作示例,使用按钮在组件之间进行切换

您可以按照以下方式设置构造函数

constructor(props)
{
    super(props);
    this.state={
        currentView: ''
    }
}

然后您可以按以下方式渲染组件

  render() 
{
    const switchView = () => {

    switch(this.state.currentView) 
    {

      case "settings":   return <h2>settings</h2>;
      case "dashboard":   return <h2>dashboard</h2>;

      default:      return <h2>dashboard</h2>
    }
  }

    return (

       <div>

            <button onClick={(e) => this.setState({currentView: "settings"})}>settings</button>
            <button onClick={(e) => this.setState({currentView: "dashboard"})}>dashboard</button>

            <div className="container">
                { switchView() }
            </div>


        </div>
    );
}

}

如您所见,我正在使用按钮在状态之间进行切换。

猪猪Stafan2020/03/18 18:34:40

我不太喜欢当前的任何答案,因为它们要么太冗长,要么要求您跳过代码以了解正在发生的事情。为什么不创建一个非常简单的开关组件,该组件根据prop测试有条件地进行渲染?例如:

const Switch = props => {
  const { test, children } = props
  return children.find(child => {
    return child.props.value === test
  })      
}

const Sample = props => {
  const someTest = true
  return (
    <Switch test={someTest}>
      <div value={false}>Will display if someTest is false</div>
      <div value={true}>Will display if someTest is true</div>
    </Switch>
  )
}

ReactDOM.render(
  <Sample/>,
  document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="react"></div>

您可以根据需要使开关简单或复杂。不要忘记对孩子及其价值道具进行更强大的检查。

StafanItachi2020/03/18 18:34:40

一种使用条件运算符表示渲染块中的​​开关情况的方式:

{this.props.someVar == 1 &&
    <SomeContent/>
|| this.props.someVar == 2 &&
    <SomeOtherContent />
|| this.props.someOtherVar == 1 &&
    <YetSomeOtherContent />
||
    <SomeDefaultContent />
}

我建议添加一些括号以确保预期结果,除非掌握运算符的优先级...

LEY老丝樱2020/03/18 18:34:40

lenkan的答案是一个很好的解决方案。

<div>
  {{ beep: <div>Beep</div>,
     boop: <div>Boop</div>
  }[greeting]}
</div>

如果您需要一个默认值,那么您甚至可以

<div>
  {{ beep: <div>Beep</div>,
     boop: <div>Boop</div>
  }[greeting] || <div>Hello world</div>}
</div>

或者,如果那对您来说不太好,那么您可以执行类似的操作

<div>
  { 
    rswitch(greeting, {
      beep: <div>Beep</div>,
      boop: <div>Boop</div>,
      default: <div>Hello world</div>
    }) 
  }
</div>

function rswitch (param, cases) {
  if (cases[param]) {
    return cases[param]
  } else {
    return cases.default
  }
}