Первое решение (редактировать: альтернатива)
render() {
const statement = true;
const stuff = this.buildStuff(statement, 3); // jsx result looped in divs
return (
<div>
{
statement &&
<div>
{ stuff }
</div>
}
</div>
);
}
Альтернатива, запоминание (кэширование функций), если это ваша цель:
const memoize = require('fast-memoize');
const memoized = memoize(this.buildStuff);
...
render() {
const statement = true;
return (
<div>
{
statement &&
<div>
<p>
{memoized()}
</p>
<p>
{memoized()}
</p>
<p>
{memoized()}
</p>
</div>
}
</div>
);
}
Однако истинная сила запоминания заключается в том, что если вы кешируете на основе параметра, который вы указываете buildStuff (может быть, вы переместите оператор в buildstuff?). В вашем случае я бы просто очистил компонент и параметры для удобства чтения, а не для оптимизации чего-либо. Итак, последний вариант:
// Stuff is a component now
const Stuff = ({statement, stuff}) => {
if(!statement)
return null;
const result = stuff();
return (
<div>
<p>
{result}
</p>
<p>
{result}
</p>
<p>
{result}
</p>
</div>
)
}
render() {
return (
<div>
<Stuff statement={true} stuff={this.buildStuff} />
</div>
);
}
Преимущество, теперь вы можете передавать результат или саму функцию через реквизиты, а в нисходящем компоненте либо вызывать функцию, либо просто передавать ее результаты.
Единственный ответ на ваш вопрос в заголовке: вы не можете, JSX не шаблонизатор, как Razor.
Пояснение:
// JSX
<div id="foo">Hello world</div>
// Translates into
React.createElement("div", {id: "foo"}, "Hello world");
// JSX
<div>{ statement && <div /> }</div>
// Translates to
React.createElement("div", null, statement && React.createElement("div"));
Либо вы объявляете новую переменную с атрибутом, либо просто не можете, поскольку javascript не позволяет создавать переменные внутри параметров функций.