我如何使用 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 代码中使用嵌套三元。
我想在 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 代码中使用嵌套三元。