Извините за другие ответы, но пустой массив неверен. Вы можете прочитать эту 49-минутную статью Дэна Абрамова (создателя Redux и React Hooks) о том, почему это так.
https://overreacted.io/a-complete-guide-to-useeffect/
Я полагаю, что вы можете решить свою проблему, комбинируя все ваши хуки useState, например:
export default function Posts() {
const [state, setState] = useState({posts: [],
isLoaded: false,
error: null })
useEffect( () => {
Api.getPosts()
.then( response => {
const [errata, data] = response
if (errata) {
setState({ ...state,
isLoaded: true,
posts: [],
error: data })
} else {
setState({ ...state,
isLoaded: true,
posts: [data],
error: null })
}
})
}, [state.isLoaded] )
убедитесь, что вы переходите в предыдущее состояние с синтаксисом распространения, иначе ваше предыдущее состояние не будет сохранено.
Альтернативный способ использования условного выражения в useEffect и передача всего состояния в качестве зависимости для использованияEffect
export default function Posts() {
const [state, setState] = useState({posts: [],
isLoaded: false,
error: null })
useEffect( () => {
if(!state.isLoaded) {
Api.getPosts()
.then( response => {
const [errata, data] = response
if (errata) {
setState({ ...state,
isLoaded: true,
posts: [],
error: data })
} else {
setState({ ...state,
isLoaded: true,
posts: [data],
error: null })
}
})
}
}, [state] )