Мне было интересно, есть ли какие-то большие вещи, которые мне не хватает
TLDR: setLinksArray
не обновляет linksArray
в текущем рендере, но в следующем рендере.
При условии, что переменные инициализируются следующим образом:
const [linksArray, setLinksArray] = useState([])
Подсказка в ключевом слове const
, linksArray
- это константа в пределах 1рендеринга (и этот факт не изменится с let
, потому что это просто, как работает useState
).
Идея setLinksArray()
состоит в том, чтобы сделать следующее постоянное значение в следующем рендере.
Таким образом, цикл for
будет похож на:
setLinksArray([...[], session0])
setLinksArray([...[], session1])
setLinksArray([...[], session2])
, и вы получите linksArray = [session2]
в следующем рендере.
Лучший способсохранить разумность - это вызывать любую функцию setState
только один раз для каждого состояния в рендере (хотя вы можете иметь несколько состояний), самое маленькое изменение в вашем коде:
function sessionToState(session) {
let formattedArray = []
for (let i = 0; i < session.length; i++) {
formattedArray.push({ url: session[i] })
}
setLinksArray(formattedArray)
}
Кроме того, если вам нужно выполнитьпобочный эффект (как вызов API) после того, как все функции setState
выполнят свою работу, т.е. после рендеринга NEXT вам потребуется useEffect
:
useEffect(() => {
...do something with updated linksArray...
}, [linksArray])
Глубокое погружение см. https://overreacted.io/react-as-a-ui-runtime