Я использую асинхронный вызов API для извлечения некоторых данных шаблона из родительской записи. (Дочерние компоненты будут переключаться в зависимости от выбора, сделанного другими дочерними элементами.)
Данные шаблона довольно велики, поэтому я хочу получить их только один раз. Кроме того, я пытался передать только минимальные реквизиты, требуемые каждому ребенку. Некоторым нужны только имена шаблонов, другим нужен соответствующий групповой массив. Поэтому я пытаюсь сделать работу в родительском элементе. Кажется, у меня возникла путаница с установкой состояния.
Редактировать
Я звоню useEffect
без параметров, чтобы он выполнялся при загрузке. Я ожидаю, что первый setTemplates()
установит переменную состояния templates
, чтобы я мог использовать ее при следующем вызове setTemplateChoices()
и установить состояние templateChoices
в одно и то же время.
// working version
import React, { useState, useEffect } from 'react'
export default function ParentComponent() {
const [templates, setTemplates] = useState([])
const [templateChoices, setTemplateChoices] = useState([])
// this will actually be fetched from within the `useEffect()` call -
// I'm just putting it here to show structure and make it testable
const defaultTemplates = [
{ id: 1, name: 'Form 1', }, // plus - groups: [ {}, {} ... ], etc.
{ id: 2, name: 'Form 2', }, // plus - groups: [ {}, {} ... ], etc.
{ id: 3, name: 'Form 3', }, // plus - groups: [ {}, {} ... ], etc.
]
useEffect(() => {
setTemplates(defaultTemplates)
}, [])
return (
<div>
<h2>Templates</h2>
{templates.map(template => (
<p>{template.name}</p>
))}
</div>
)
}
Но это не так:
// non-working version
import React, { useState, useEffect } from 'react'
export default function ParentComponent() {
const [templates, setTemplates] = useState([])
const [templateChoices, setTemplateChoices] = useState([])
const defaultTemplates = [
{ id: 1, name: 'Form 1' },
{ id: 2, name: 'Form 2' },
{ id: 3, name: 'Form 3' },
]
useEffect(() => {
setTemplates(defaultTemplates)
setTemplateChoices(templates.map(template => template.name))
}, [])
return (
<div>
<h2>Template Choices</h2>
{templateChoices.map(choice => (
<p>{choice}</p>
))}
<p>Children go here depending on step</p>
</div>
)
}
Я пытался использовать asyn c и немедленное выполнение безрезультатно:
useEffect(() => {
async function doWork() {
await setTemplates(defaultTemplates)
await setTemplateChoices(templates.map(template => template.name))
}
doWork()
}, [])
Я даже пытался отделиться их в два вызова useEffect:
useEffect(() => {
setTemplates(defaultTemplates)
}, [])
useEffect(() => {
setTemplateChoices(templates.map(template => template.name))
}, [templates])
Все еще нет радости. Почему не устанавливается templateChoices
?