Во-первых, если touched
равно false, остальная часть выражения игнорируется и ничего не равно сотне.
Если error
оценивается как true
, то error && <span>{error}</span>
является истинным (поскольку элемент React тоже правда), и <span>{error}</span>
отображается. В этом случае второй warning && <...>
не оценивается.
Если error
ложно, то warning && <span>{warning}</span>
оценивается, а если warning
верно, <span>{warning}</span>
отображается.
То, что делает c, говорит по этому поводу: https://reactjs.org/docs/conditional-rendering.html#inline -if-with-logic - оператор :
true && выражение всегда вычисляется как выражение, и ложное выражение && всегда оценивается как ложное.
Поэтому, если условие истинно, элемент сразу после && появится в выходных данных. Если оно ложно, React проигнорирует и пропустит его.
Вы можете достичь того же самого вне выражения jsx:
let element;
if (touched) {
if (error) element = <span>{error}</span>;
else if (warning) element = <span>{warning}</span>;
}
return (
<div>
<input {...input} placeholder={label} type={type} />
{element}
</div>
)