哪种是处理嵌套条件渲染的最佳方法?

Which is the best approach to handle nested conditional rendering?

我最近安装了 eslint-config-airbnb 并决定使用他们的风格指南来审查一个项目。由于不建议嵌套三元运算符,我发现自己正在转换以下块:

<div>
  { index === 0 ? <StatusButton big programmed statusText="Programmed" />
  : index === 1 ? <StatusButton big confirmed statusText="Confirmed" />
  : <StatusButton big soldOut statusText="Sold Out" />; }
</div>

转化为:

<div>
    {(() => {
      if (index === 0) {
        return (
          <StatusButton
            big
            programmed
            statusText="Programmato"
          />
        );
      }
      if (index === 1) {
        return (
          <StatusButton big confirmed statusText="Confermato" />
        );
      }
      return <StatusButton big soldOut statusText="Sold Out" />;
    })()}
</div>

规则 no-nested-ternary 的原因是使用 if 代码应该更容易阅读,但老实说,我认为那不是真的。由于我对 JS 的经验相对较少,所以我想了解您的观点。谢谢。

只需使用 switch case 语句。 即

switch (index) {
case 0:
  return <StatusButton...

case 1:
  return <StatusButton...

default:
  return <StatusButton...
}

您可以通过多种方式呈现,

选项 - 1

const getStatusButton = (index) => {
  switch (index) {
    case 0: {
      return <StatusButton big programmed statusText="Programmato" />;
    }
    case 1: {
      return <StatusButton big confirmed statusText="Confermato" />;
    }
    default: {
      return <StatusButton big soldOut statusText="Sold Out" />;
    }
  }
};

所以渲染的时候可以调用这个函数

{
  getStatusButton(index);
}

选项 - 2

有一个功能可以给你不同的道具

const getStatusButtonProps = (index) => {
  switch (index) {
    case 0: {
      return {
        programmed: true,
        statusText: "Programmato",
      };
    }
    case 1: {
      return {
        confirmed: true,
        statusText: "Confermato",
      };
    }
    default: {
      return {
        soldOut: true,
        statusText: "Sold Out",
      };
    }
  }
};

现在您可以只使用一个状态按钮

<StatusButton big {...getStatusButtonProps(index)} />

这个怎么样

<div>
    <StatusButton
        big 
        programmed={index === 0}
        confirmed={index === 1}
        soldOut={index !== 0 || index !== 1}
        statusText={getStatusText(index)} />
</div>


getStatusText = (index) => {
    switch(index) {
        case 0: return "Programmed";
        case 1: return "Confirmed";
        default: return "Sold Out"
    }
}