Это должно быть просто setTimeOfDay ("AM") и для второго условного блока setTimeOfDay ("PM"). Вы делаете это слишком сложным, передавая функцию, которая возвращает строку. В то время как вы можете передать функцию, которая возвращает строку, для вашего setTimeOfDay, чтобы установить для нее строку, у вашей функции есть фундаментальная проблема в том, что вы также вручную изменяете состояние.
Обратите внимание, что в вашей функции есть "timeOfDay =" AM "". Это полностью противоречит цели setState и useState, так как вы управляете состоянием напрямую.
У традиционного setState есть вариант использования, когда он может принимать функцию, но я не верю, что useState делает.
// Correct
this.setState(function(state, props) {
return {
counter: state.counter + props.increment
};
});
И эта функция в любом случае не будет вам полезна.
Кроме того, вы используете эффект. Несмотря на то, что ваш эффект использования привязан к [dayInfo, timeOfDay, timeOfDay], он фактически никогда не изменяется, по крайней мере в показанном вами коде. Таким образом, ваш компонент Day получает изменение dayInfo только во время монтирования, а не при повторном рендеринге.
Кроме того, если я что-то упустил, поскольку ваше состояние управляется в вашем компоненте Day, а не в каждом отдельном React Фрагмент, когда вы звоните
{Array.from(Array(amountOfRows)).map((row, index) => {
return (
<React.Fragment key={index}>
<Table.Row>
<Table.Cell rowSpan="2" style={tableStyle}>
{TimeOfDaySetter(index)}
</Table.Cell>
Вы просто меняете состояние компонента Day с каждой итерацией на карте, что вызывает повторный рендеринг фрагмента реакции. И поэтому будет выполнено только последнее условие, поскольку каждый фрагмент будет перерисован. Было бы лучше передать реквизиты новому элементу компонента вместо вызова состояния на каждой итерации, сделать ваше состояние более сложным для управления каждым фрагментом или управлять своим состоянием локально в каждом компоненте.