Это ожидаемое поведение. Причина, по которой вы видите два консольных журнала, заключается в том, что первый раз RecipeList
вызывается без данных (пустой объект) и второй раз, когда данные становятся доступными. Если вы хотите отобразить его только при наличии данных, вы можете сделать что-то вроде {Object.keys(data).length > 0 && <RecipeList recipes={data}/>}
. Кстати это называется условный рендеринг.