Not to mention that if a section of markup gets too big, you can break that down to it's own method that returns tiny snippets so you can have really simple methods that end up creating the more complex end result i.e.
_renderXOrY = (thing) => {
return thing.isX ? <X thing={thing} /> : <Y thing={thing} />
}
//inside the render method
<div>
{listOfThings.map(thing => this._renderXOrY(thing))}
</div>
I personally prefer this because when creating the top level of a component, I largely don't care about the individual elements of a list, but rather am structuring how that list will be contained etc.
And let's not discount then the value that JSX brings of being able to easily unit test that your conditional logic renders the correct output easily (Jest + Enzyme = easiest tests I've ever had to write, bar simple functional checks).