Вы правы в том, что он "не успевает вмонтироваться". Функция setState работает асинхронно, и промис не будет дожидаться ее выполнения перед вызовом следующего .then в цепочке, так что у нас нет никаких гарантий на то, что состояние обновится к следующему использованию стейта. В таких случаях обычно используют коллбэк, который передается в setState вторым аргументом и вызывается после обновления состояния, вызванного этим методом, однако в нашем случае, я думаю, можно обновить все за один раз.
getRate() {
fetch('https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5')
.then(data => {
return data.json()
})
.then(data => {
let res = {};
for (let i = 0; i < this.currency.length; i++) {
res[this.currency[i]] = data[i];
}
let obj = Object.entries(res).map((item, number) => {
return (
<div className="rates-info" key={number.toString()}>
<div className="rates-info_name" >
<p>{item[1].ccy}</p>
</div>
<div className="rates-info_value">
<div className="info_value-buy">
<p>Покупка</p>
<p>{item[1].buy}</p>
</div>
<div className="info_value-buy">
<p>Продажа</p>
<p>{item[1].sale}</p>
</div>
</div>
</div>
)
})
this.setState({ currencyRate: { res }, div: obj });
});
}