我如何使用 React (JSX) 编写 else if 结构 - 三元表达式不够表达

How can I write an else if structure using React (JSX) - the ternary is not expressive enough

我想在 React 中写等价物:

if (this.props.conditionA) {
    <span>Condition A</span>
} else if (this.props.conditionB) {
    <span>Condition B</span>
} else {
    <span>Neither</span>
}

所以也许

render() {
    return (<div>
        {(function(){
            if (this.props.conditionA) {
                return <span>Condition A</span>
            } else if (this.props.conditionB) {
                return <span>Condition B</span>
            } else {
                return <span>Neither</span>
            }
        }).call(this)}
    </div>)
}

但这似乎过于复杂。有没有更好的方法?

确实不是这样。

var element;
if (this.props.conditionA) {
    element = (<span>Condition A</span>)
} else if (this.props.conditionB) {
    element = (<span>Condition B</span>)
} else {
    element = (<span>Neither</span>)
} 
...
    {element}

如果不需要 <div>,只需 return <span> 元素:

render() {
  if (this.props.conditionA) {
    return <span>Condition A</span>;
  } else if (this.props.conditionB) {
    return <span>Condition B</span>;
  } else {
    return <span>Neither</span>;
  }
}

您甚至可以将最后一个 return 语句移出 else 块。


通常,您不必将所有内容都嵌入到 JSX 中。预先计算值非常好,就像您在其他地方所做的那样:

render() {
  let content;
  if (this.props.conditionA) {
    content = <span>Condition A</span>;
  } else if (this.props.conditionB) {
    content = <span>Condition B</span>;
  } else {
    content = <span>Neither</span>;
  }

  return <div>{content}</div>;
}

只要您需要/想要使用语句,就必须这样做。

计算值,绑定到一个变量,然后输出更好。如果您 do 想要复杂的内联逻辑,您可以使用 &&||:

render() {
    return (<div>
        {
          this.props.conditionA && <span>Condition A</span>
          || this.props.conditionB && <span>Condition B</span>
          || <span>Neither</span>
        }
    </div>)
}

编辑:

正如其他人指出的那样,您也可以删除包装 div 并仍然使用这种方法:

render() {
  return (
    this.props.conditionA && <span>Condition A</span>
    || this.props.conditionB && <span>Condition B</span>
    || <span>Neither</span>
  );
}

为什么说三元表达力不够?

render() {
  return <span>
    {this.props.conditionA ? "Condition A" 
      : this.props.conditionB ? "Condition B" 
      : "Neither"}
  </span>;
}

如果你的条件像你表达的那么简单,我觉得你还是可以像上面@SkinnyJ说的那样用三元的。它非常优雅,但如果有很多这些条件需要检查,我会引起你的关注。还有另一种方法可以解决这个问题:使用 switch 语句。

const props = {
  conditionA: "this is condition a"
};

let value;

switch (Object.keys(props)[0]) {
  case "conditionA":
    value = "Condition A";
    break;
  case "conditionB":
    value = "Condition B";
    break;
  default:
    value = "Neither";
}

console.log(value);

这里有几个假设。该对象不为 null,并且它只有一个 属性。

但如果这些都是真的,那么对于像这样的场景,switch 可能会更高效。您可能对此感兴趣:

Javascript switch vs if else

如果有人仍然面临这个问题,请将下面一行粘贴到您的 eslintrc.js 文件中。

"no-nested-ternary" : "off" 

这将允许您开始在 jsx 代码中使用嵌套三元。