Итак, я использую хук useEffect для извлечения своих данных из базы данных, и после того, как я получу эти данные, я хочу установить его как useState для заголовка и postBody, но это не работает, потому что хук useEffect запускается «последний», как я могу исправить это?
Код:
const [cPost, setCPost] = useState([]);
const postId = id.match.params.id;
useEffect(() => {
axios.get('http://localhost:5000/posts/'+postId)
.then(posts => {
setCPost(posts.data);
console.info("SAS");
})
}, []);
const [title, setTitle] = useState(cPost.title);
const [postBody, setPostBody] = useState(cPost.postBody);
В качестве временного и быстрого решения вы можете использовать такой обходной путь:
const [cPost, setCPost] = useState();
const [title, setTitle] = useState();
const [postBody, setPostBody] = useState();
const postId = id.match.params.id;
useEffect(() => {
axios.get('http://localhost:5000/posts/'+postId)
.then(post => {
setCPost(post.data);
console.info("SAS");
})
}, []);
useEffect(() => {
if (cPost) {
setTitle(cPost.title);
setPostBody(cPost.postBody);
}
}, [cPost]);
Или второй вариант:
const [cPost, setCPost] = useState();
const [title, setTitle] = useState();
const [postBody, setPostBody] = useState();
const postId = id.match.params.id;
useEffect(() => {
axios.get('http://localhost:5000/posts/'+postId)
.then(post => {
setCPost(post.data);
setTitle(post.title);
setPostBody(post.postBody);
console.info("SAS");
})
}, []);
Но в будущем я бы рекомендовал делать side effects лайк API запросы и другие с помощью специальных библиотек или создавать hook для выполнения API запросов.
Например redux-saga или redux-thunk.
И используйте менеджер состояний, например redux или mobx.
P.S. и подумайте, нужно ли хранить title и body отдельно в компоненте state. У меня есть сильное подозрение, что вам это не нужно.