【发布时间】:2020-10-15 13:50:30
【问题描述】:
我正在尝试通过 props 将以下数据传递给 Slide.js 来制作幻灯片应用。
const SLIDES = [
{
title: "Today's workout plan",
text: "We're gonna do 3 fundamental exercises."
},
{
title: "First, 10 push-ups",
text: "Do 10 reps. Remember about full range of motion. Don't rush."
},
{
title: "Next, 20 squats",
text: "Squats are important. Remember to keep your back straight."
},
{
title: "Finally, 15 sit-ups",
text: "Slightly bend your knees. Remember about full range of motion."
},
{
title: "Great job!",
text: "You made it, have a nice day and see you next time!"
}
];
我的子组件Slide.js有如下代码
import React, { useState, useEffect } from "react";
function Slides({ slides }) {
const [slideShow, setSlide] = useState(slides);
useEffect(() => {
setSlide(slideShow[0]);
console.log("slides", slideShow[0]);
}, []);
return (
<div>
<div id="navigation" className="text-center">
<button data-testid="button-restart" className="small outlined">
Restart
</button>
<button data-testid="button-prev" className="small">
Prev
</button>
<button data-testid="button-next" className="small">
Next
</button>
</div>
{slideShow.map((slide, i) => (
<div id={i} className="card text-center">
<h1 data-testid="title">{slide.title}</h1>
<p data-testid="text">{slide.text}</p>
</div>
))}
</div>
);
}
export default Slides;
我认为使用setSlide(slideShow[0]) 只会在应用程序初始加载后呈现对象数组中的第一项。但我明白了
TypeError: slideShow.map is not a function
但是当我console.log("slides", slideShow[0])我输出时
slides {title: "Today's workout plan", text: "We're gonna do 3 fundamental exercises."}
如果我将代码更改为
setSlide(slideShow.slice(0, 1));
应用程序仅显示数组中的第一个对象,但如果我 console.log("slides", slideShow),即使我认为我应该收到切片版本,我也会得到整个对象数组。
我的map 函数是否没有引用slideShow[0] 以导致错误发生?
【问题讨论】:
-
当你
setSlide(slideShow[0])你的slideShow不再是一个可以被映射的数组,它是一个对象。在您提供给我们的代码中,根本没有理由使用useEffect(或useState)挂钩 -
React 中的状态变化是异步的。您不能在下一行
console.log看到更改。在函数主体中记录状态 -
我的地图函数是否没有引用 slideShow[0] 导致错误发生?,是的。在
useEffect你正在做setSlide(slideShow[0])这将是一个对象。因此,如果您使用setSlide([{...slideShow[0]}])而不是setSlide(slideShow[0]),那么它不会破坏应用程序。
标签: javascript reactjs react-hooks use-state