Answer the question
In order to leave comments, you need to log in
Why is it not updated when trying to update the state from useEffect?
Why doesn't it update when I try to update tabsFields
from useEffect
?
// Apollo Client запрос к GraphQL серверу
const { data, error, loading } = useQuery(GET_ORG(props.match.params.essenceId))
// State который не обновляется
const [tabsFields, setTabsFields] = useState()
// отслеживаю изменение state
useEffect(() => {
if (data !== undefined) {
// перебираю массив контактных лиц
data.org.contactPersons.map(i => {
const ID = nanoid(8) // использую либу nanoid для генерации ID
let obj = {}
obj[i._id + '~' + ID + '^name'] = i.name
i.phone.map((j, idx) => {
obj[i._id + '~' + ID + '^phone-' + idx] = j
})
i.eMail.map((j, idx) => {
obj[i._id + '~' + ID + '^eMail-' + idx] = j
})
setTabsFields({...tabsFields, obj})
})
}
}, [data])
// Apollo Client запрос к GraphQL серверу
const { data, error, loading } = useQuery(GET_ORG(props.match.params.essenceId))
// State который не обновляется
const [tabsFields, setTabsFields] = useState({})
// отслеживаю изменение state
useEffect(() => {
if (data !== undefined) {
// перебираю массив контактных лиц
data.org.contactPersons.map(i => {
const ID = nanoid(8) // использую либу nanoid для генерации ID
let obj = {...tabsFields}
obj[i._id + '~' + ID + '^name'] = i.name
i.phone.map((j, idx) => {
obj[i._id + '~' + ID + '^phone-' + idx] = j
})
i.eMail.map((j, idx) => {
obj[i._id + '~' + ID + '^eMail-' + idx] = j
})
setTabsFields(obj)
})
}
}, [data])
Answer the question
In order to leave comments, you need to log in
Nikita, you shouldn't have put setTabsFields inside the map loop. setTabsFields is a synchronous function. Every time you run the map loop and call setTabsFields , you have let obj = {...tabsFields} not a new object with the current tabsFields state. In your case, this is always a new object, but with the same data that was in tabsFields at the time the loop was executed.
Do something like this:
useEffect(() => {
// const obj = {...tabsFields}
// Сдесь скорее всего всегда пустой объект начальный должен быть, иначе в нем могут остаться уже неактуальные данные.
const obj = {}
if (data !== undefined) {
// перебираю массив контактных лиц
data.org.contactPersons.map(i => {
const ID = nanoid(8) // использую либу nanoid для генерации ID
obj[i._id + '~' + ID + '^name'] = i.name
i.phone.map((j, idx) => {
obj[i._id + '~' + ID + '^phone-' + idx] = j
})
i.eMail.map((j, idx) => {
obj[i._id + '~' + ID + '^eMail-' + idx] = j
})
})
}
// Устанавливаем конечный набор полей в стейт
setTabsFields(obj)
}, [data])
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question