在 React JSX 中使用 if 语句

IT技术 javascript reactjs
2021-03-21 13:26:40

你能像这样在 JSX 中使用 if 语句吗?

    var chartGraphContent =
        <div className={"chartContent"}>
            if(this.state.modalityGraph['nca'] > 0){
                <div className={"chart-container"}>
                    <Chart
                        chartType="ColumnChart"
                        data = { this.state.modalityGraph?this.state.modalityGraph.chartData['units']:emptyDataRows }
                        options={chartOptions}
                        graph_id="modalitiesChart"
                        width="100%"
                        height="250px"
                    /> 
                </div>
            }
        </div>;

类似上面的东西?是否可以根据条件使用 JSX?

3个回答

使用条件渲染,并且由于您没有 else-case,&&为了简洁起见,您可以使用代替三元运算符:

它有效,因为在 JavaScript 中,true && expression始终计算为expression,并且false && expression始终计算为false

因此,如果条件为真,则 && 之后的元素将出现在输出中。如果为 false,React 将忽略并跳过它。

因此:

   <div className={"chartContent"}>
        {this.state.modalityGraph['nca'] > 0 &&
            <div className={"chart-container"}>
                <Chart
                    chartType="ColumnChart"
                    data = { this.state.modalityGraph?this.state.modalityGraph.chartData['units']:emptyDataRows }
                    options={chartOptions}
                    graph_id="modalitiesChart"
                    width="100%"
                    height="250px"
                /> 
            </div>
        }
    </div>

这只会在条件为真时呈现 JSX。如果它是假的,React 将不会渲染任何东西。请记住,您必须使用 将内联 JavaScript 表达式包装在 JSX 中{ … },您不能将它放在 JSX 中。

直接使用 if/else 语句是 JSX 会导致它被逐字呈现为文本,这是不希望的。你也不能在内联 JavaScript 表达式中使用它们,因为 if语句不是表达式,所以这不起作用

{
  if(x) y
}
@Rajesh Falsey 表达式中的值永远不会呈现,除了 0 IIRC。
2021-04-22 13:26:40
如果值为 0 会怎样。它会打印什么? false?
2021-05-14 13:26:40
我从来没有试过这个,所以想确认一下。我总是喜欢使用三元运算符{ condition ? jsx : null }
2021-05-15 13:26:40

根据DOC

if-else 语句在 JSX 中不起作用。这是因为 JSX 只是函数调用和对象构造的语法糖。


我们不能if-else在 JSX 中直接使用statement 或任何其他语句,只允许使用表达式。

JSX 中的表达式

你可以通过用花括号将任何 JavaScript 表达式嵌入到 JSX 中。

要放置我们需要使用的任何表达式{},因此不要if使用&&运算符或ternary operator用于条件渲染。

通过使用三元运算符

var chartGraphContent =
<div className={"chartContent"}>
    {
        this.state.modalityGraph['nca'] > 0 ?
            <div className={"chart-container"}>
                <Chart
                    chartType="ColumnChart"
                    data = { this.state.modalityGraph?this.state.modalityGraph.chartData['units']:emptyDataRows }
                    options={chartOptions}
                    graph_id="modalitiesChart"
                    width="100%"
                    height="250px"
                /> 
            </div>
        :null
    }
</div>;

通过使用&& 运算符

var chartGraphContent =
<div className={"chartContent"}>
    {
        this.state.modalityGraph['nca'] > 0 &&
            <div className={"chart-container"}>
                <Chart
                    chartType="ColumnChart"
                    data = { this.state.modalityGraph?this.state.modalityGraph.chartData['units']:emptyDataRows }
                    options={chartOptions}
                    graph_id="modalitiesChart"
                    width="100%"
                    height="250px"
                /> 
            </div>
    }
</div>;
没有对你投反对票,你的答案也是正确的,但@Andrew Li 首先有一个类似的答案。非常感谢。(PS。这有时是一个过于纯粹的网站,人们无缘无故地投票)
2021-05-04 13:26:40
@morne没问题,这就是我问原因的原因,很高兴你得到了解决方案:)
2021-05-19 13:26:40

最好与三元运算符一起使用,通过这样做,您还可以else向代码中添加块。

试试这个:

var chartGraphContent =
        <div className={"chartContent"}>
            {this.state.modalityGraph['nca'] > 0 ?
                <div className={"chart-container"}>
                    <Chart
                        chartType="ColumnChart"
                        data = { this.state.modalityGraph?this.state.modalityGraph.chartData['units']:emptyDataRows }
                        options={chartOptions}
                        graph_id="modalitiesChart"
                        width="100%"
                        height="250px"
                    /> 
                </div>
                : "<span>Else Block</span>"
            }
        </div>;

更新(另一种方法)

如果情况更复杂和更大,您也可以调用内联函数来返回模板,这样您就可以避免代码变得混乱。这是一个例子。

var ifBlockCode = function ifBlockCode(){
    return (
        <div className={"chart-container"}>
            <Chart
                chartType="ColumnChart"
                data = { this.state.modalityGraph?this.state.modalityGraph.chartData['units']:emptyDataRows }
                options={chartOptions}
                graph_id="modalitiesChart"
                width="100%"
                height="250px"
            /> 
        </div>
    )
}

var elseBlockCode = function elseBlockCode(){
    return (
        <span>Else Block</span>
    )
}
var chartGraphContent =
<div className={"chartContent"}>
    {this.state.modalityGraph['nca'] > 0 ?
        {this.ifBlockCode} : {this.elseBlockCode}
    }
</div>;
谢谢帕迪普耆那教。本来可以正常工作,但 Andrew Li 的第一个答案也是正确的。虽然点赞。
2021-04-21 13:26:40