我试图使滑块组件从API获取数据,但我不知道如何先获取数据,然后将其馈送到组件。据我所知,在我的实现中,组件试图在从API中提取数据之前呈现。
const [slides, setSlides] = useState([]);
const [currentIndex, setCurrentIndex] = useState(0);
useEffect(() => {
const dataFetch = async () => {
const data = await (
await fetch("http://localhost:5000/api/data")
).json();
setSlides(data);
};
dataFetch();
}, []);
const prevSlide = () => {
const isFirstSlide = currentIndex === 0;
const newIndex = isFirstSlide ? slides.length - 1 : currentIndex - 1;
setCurrentIndex(newIndex);
};
const nextSlide = () => {
const isLastSlide = currentIndex === slides.length - 1;
const newIndex = isLastSlide ? 0 : currentIndex + 1;
setCurrentIndex(newIndex);
};
const goToSlide = (slideIndex) => {
setCurrentIndex(slideIndex);
};
return (
<div>
<div style={{ backgroundImage: `url(${slides[currentIndex].url})` }}>
<h1>{slides[currentIndex].name}</h1>
<p>{slides[currentIndex].description}</p>
</div>
{/* Left Arrow */}
<div>
<BsChevronCompactLeft onClick={prevSlide} size={30} />
</div>
{/* Right Arrow */}
<div>
<BsChevronCompactRight onClick={nextSlide} size={30} />
</div>
<div>
{slides.map((slide, slideIndex) => (
<div key={slideIndex} onClick={() => goToSlide(slideIndex)}>
<RxDotFilled />
</div>
))}
</div>
</div>
);
}
1条答案
按热度按时间hmmo2u0o1#
当第一次呈现时(在
useEffect
被调用之前),slides
是一个空数组。访问空数组中的项将返回undefined
,并且无法从中读取属性url
。您可以在现有的
return
语句no render nothing的正上方添加像if (slides.length === 0) return null
或if (!slides[currentIndex]) return null
这样的子句,或者您可以返回一些加载动画。一般来说,请记住React是如何工作的:首先,它以初始值
states
呈现组件。然后,将调用useEffect
。如果它修改了组件的状态(或者任何状态),它将被重新呈现--这一次可能会加载值。