Когда я веду консольный журнал полученных данных, они отображаются как неопределенные, но они появляются при обновлении.
У меня есть эта функция в react для получения данных из моего django API:
const [filterData, setFilterData] = useState([]);
const fetchFilterData = async () => {
const filter_url = 'http://127.0.0.1:8000/api/filters/'
try {
const response = await fetch(filter_url)
const result = await response.json();
setFilterData(result)
} catch (error) {
console.error('error fetching data: ', error);
}
}
и когда я пытаюсь console.log вывести данные, то сначала они отображаются как undefined
, но если я что-то изменю в коде (например, добавлю пробел или новую строку) и сохраню, то найденные данные появятся и все будет работать нормально, но проблема в том, что я не могу вывести эти данные или передать их как prop в другие компоненты
Вот useEffect
крючок:
useEffect(() => {
fetchData();
fetchFilterData();
}, []);
и я пробовал регистрировать данные несколькими способами, но безрезультатно, сначала всегда возвращается undefined
. Вот несколько способов, которые я пробовал:
import React from 'react'
import './Home.css'
// import { listOfHouses } from './mock-data'
import { useState, useEffect, useRef } from 'react'
import PopupTextBox from '../../Components/PopupTextBox/PopupTextBox'
import DropDown from '../../Components/DropDown/DropDown'
export default function Home() {
const [data, setData] = useState([]);
const [filterData, setFilterData] = useState([]);
const [order, setOrder] = useState('asc');
const fetchData = async () => {
const houseList_url = 'http://127.0.0.1:8000//api/listings?price__lt=&price__gt=&apartment__block_name=&apartment__floor=&apartment__type=&apartment__view=&status=&type=';
const result = await fetch(houseList_url);
result.json().then(json => setData(json));
// console.log(data)
}
const fetchFilterData = async () => {
const filter_url = 'http://127.0.0.1:8000/api/filters/'
try {
const response = await fetch(filter_url)
const result = await response.json();
setFilterData(result)
} catch (error) {
console.error('error fetching data: ', error);
}
if(filterData) {console.log(filterData)} else {console.log("data is not defined")};
}
useEffect(() => {
fetchData();
fetchFilterData().then(console.log(filterData));
}, []);
const sorting = (col) => {
if (order === 'asc') {
const sorted = [...data].sort((a, b) =>
a[col].toLowerCase() > b[col].toLowerCase() ? 1 : -1);
setOrder('desc');
setData(sorted);
}
if (order === 'desc') {
const sorted = [...data].sort((a, b) =>
a[col].toLowerCase() < b[col].toLowerCase() ? 1 : -1);
setOrder('asc');
setData(sorted);
}
}
return (
<div className='h-full grid grid-rows-[max-content_1fr]'>
<div className='h-28 bg-blue-500 text-center'>
<button className='button bg-teal-700' onClick={fetchData}>fetch</button>
<div>
{filterData && <DropDown people={filterData.all_blocks} />}
</div>
</div>
<div className='bg-white'>
<table className='table-auto w-full'>
<thead className='bg-gray-300'>
, , , , , , , ,
редактирование: вот более полный фрагмент кода, который я выполняю
это было потому, что const [fitlerData, setFilterData] = useState([])
и не const [fitlerData, setFilterData] = useState()
что означает, что когда я делал что-то вроде {filterData && <DropDown people={filterData.all_blocks} />}
, он передавал пустой список и не ждал, пока данные действительно будут получены.
Теперь код выглядит примерно так:
export default function Home() {
const [data, setData] = useState([]);
const [filterData, setFilterData] = useState();
const [order, setOrder] = useState('asc');
const fetchData = async () => {
const houseList_url = 'http://127.0.0.1:8000//api/listings?price__lt=&price__gt=&apartment__block_name=&apartment__floor=&apartment__type=&apartment__view=&status=&type=';
const result = await fetch(houseList_url);
result.json().then(json => setData(json));
}
const fetchFilterData = async () => {
const filter_url = 'http://127.0.0.1:8000/api/filters/'
try {
const response = await fetch(filter_url)
const result = await response.json();
setFilterData(result)
} catch (error) {
console.error('error fetching data: ', error);
}
}
useEffect(() => {
fetchData();
fetchFilterData();
}, []);
useEffect(() => {
filterData ? console.log(filterData) : console.log('loading...')
}, [filterData]);
const sorting = (col) => {
if (order === 'asc') {
const sorted = [...data].sort((a, b) =>
a[col].toLowerCase() > b[col].toLowerCase() ? 1 : -1);
setOrder('desc');
setData(sorted);
}
if (order === 'desc') {
const sorted = [...data].sort((a, b) =>
a[col].toLowerCase() < b[col].toLowerCase() ? 1 : -1);
setOrder('asc');
setData(sorted);
}
}
const handleRefresh = () => {
fetchData();
fetchFilterData();
}
return (
<div className='h-full grid grid-rows-[max-content_1fr]'>
<div className='h-28 bg-blue-500 text-center'>
<button className='button bg-teal-700' onClick={handleRefresh}>fetch</button>
<div>
{filterData
? <Fragment>
<DropDown items={filterData.all_blocks} />
</Fragment>
: <div>loading...</div>
}
</div>
</div>
Я ненавижу JavaScript :)