【问题标题】:How to use switch cases inside JSX: ReactJS如何在 JSX 中使用 switch case:ReactJS
【发布时间】:2018-07-06 17:14:57
【问题描述】:

我在我的 react 应用程序中导入了四个组件。我如何有条件地渲染其中一个组件(基于道具)。这就是我想做的事情

<ReactSVGPanZoom
      //switch(this.props.Selected){
      // case '1': render <ComponentOne/>; break;
      // case '2': render <ComponentTwo/>; break;
      // case '3': render <ComponentThree/>; break;
      // case '4': render <ComponentFour/>; break;
      // default: render <ComponentOne/>
        }
</ReactSVGPanZoom>

【问题讨论】:

    标签: reactjs switch-statement conditional-rendering


    【解决方案1】:

    直接是不允许的,因为我们不能在 JSX 里面放任何语句。您可以做一件事,将代码(切换逻辑)放入函数中并调用该函数,然后从中返回正确的组件。

    检查文档:Embedding Expressions in JSX

    像这样:

    <ReactSVGPanZoom
        {this.renderComponent()}
    </ReactSVGPanZoom>
    
    
    renderComponent(){
        switch(this.props.Selected){
            case '1': return <ComponentOne/>;
            case '2': return <ComponentTwo/>;
            case '3': return <ComponentThree/>;
            case '4': return <ComponentFour/>;
            default: return <ComponentOne/>
        }
    }
    

    建议:

    breakreturn 之后不需要。

    【讨论】:

      【解决方案2】:

      您可以从开关中获取组件(在函数中或render 中的内联)并将其渲染为ReactSvgPanZoom 的子级,如下所示:

      getComponent(){
        switch(this.props.Selected){
          case '1': 
            return <ComponentOne/>;
          case '2': 
            return <ComponentTwo/>; 
          // .. etc
          default: 
            return <ComponentOne/>
        }
      }
      render() {
          return (<ReactSVGPanZoom>
              {this.getComponent()}
            </ReactSVGPanZoom>);
        }
      

      【讨论】:

        【解决方案3】:

        您可以创建一个 const 并在需要时使用它:

        import React from "react";
        
        export const myComponents = {
          Component1: <Component1 />,
          Component2: <Component2 />,
          Component3: <Component3 />,
          Component4: <Component4 />,
        }
        

        现在在您的主要组件中:

        import React from "react";
        import {myComponents} from "./const";
        
        ...
        render() {
          return (
            <div>
              {myComponents[this.props.Selected]}
            </div>
          )
        }
        

        https://codesandbox.io/s/mzn5x725vx

        【讨论】:

        • 我试图找到一个更好的解决方案。但是意识到我已经在使用 @max li 已经建议的东西了。所以我认为这是上述问题的最佳答案。
        【解决方案4】:

        为此目的有一个构造:Do Expression

        你可以这样使用它:

        <ReactSVGPanZoom
            {do {
                switch (this.props.Selected) {
                    case '1': <ComponentOne/>; break;
                    case '2': <ComponentTwo/>; break;
                    case '3': <ComponentThree/>; break;
                    case '4': <ComponentFour/>; break;
                    default: <ComponentOne/>;
                }
            }}
        </ReactSVGPanZoom>
        

        请记住,不要在 do 表达式中使用 return,并且 do 表达式中的最后一个表达式将是返回值。所以即使你在 switch 后加上一个分号,它也会毁掉一切。

        【讨论】:

          【解决方案5】:
          render() {
            return (
              <div>
                {
                  (() => {
                    switch(this.props.value) {
                      case 1:
                        return this.myComponentMethod();
                        break;
                      case 2: 
                        return () => { return <AnotherComponent/> }; 
                        break;
                      case 3:
                        return <div>1</div>; 
                      break;
                      default: return null; break;
                    }
                  }).call(this)
                }
              </div>
            )
          }
          

          【讨论】:

          • 不确定这个解决方案,基本上它会创建一个新函数并在每次渲染组件时自行调用它,这通常是不需要的
          • 添加开关到专用功能
          • 它实际上不是一个真实的例子,专用功能绝对是最好的解决方案。我的代码只是以奇特的方式显示它是可能的
          【解决方案6】:
          export default function FunctionName(props) {
            return (
              <div>
                {
                  (() => {
                    switch (props.value) {
                      case 1:
                        return <p>Case 1<;
                        break;
                      case 2:
                        return () => { return <AnotherComponent /> };
                        break;
                      case 3:
                        return <div>1</div>;
                        break;
                      default: return null; break;
                    }
                  })
                }
              </div>
            )
          }
          

          【讨论】:

            猜你喜欢
            • 2021-07-10
            • 2020-05-31
            • 2015-04-08
            • 1970-01-01
            • 2012-05-07
            • 1970-01-01
            • 2018-07-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多