Javascript React Hook useffect从本地json文件获取数据以创建详细信息页面
我正在构建一个细节页面,以显示json文件中所选对象的细节。 (单击一个缩略图图像,将您带到视频页面,其中包括视频的详细信息) 到目前为止,我有1)数据文件2)主页,您可以在其中选择要查看更多信息的项目3)显示信息的页面 但是,我无法在详细信息页面上显示任何json数据。我尝试过使用“match”方法,我使用了Request.URL(),这两种方法都不起作用,但我认为正确的方法是使用useEffect挂钩(如果我错了,请纠正我) 这就是我目前使用的useEffect路线: pages/FeaturedVideo.js:Javascript React Hook useffect从本地json文件获取数据以创建详细信息页面,javascript,json,reactjs,react-hooks,Javascript,Json,Reactjs,React Hooks,我正在构建一个细节页面,以显示json文件中所选对象的细节。 (单击一个缩略图图像,将您带到视频页面,其中包括视频的详细信息) 到目前为止,我有1)数据文件2)主页,您可以在其中选择要查看更多信息的项目3)显示信息的页面 但是,我无法在详细信息页面上显示任何json数据。我尝试过使用“match”方法,我使用了Request.URL(),这两种方法都不起作用,但我认为正确的方法是使用useEffect挂钩(如果我错了,请纠正我) 这就是我目前使用的useEffect路线: pages/Featu
import videos from '../../data/data.json'
const FeaturedVideo = () => {
const [videos, setVideos] = useState(null);
useEffect(() => {
let url = "/src/data/data.json";
fetch(url)
.then(res => res.json())
.then(videos => setVideos(videos))
}, []);
return(
<div>
<p>The video and it's details will go here </p>
{videos.id.map((video) =>{
<div key={video.id} {...videos}></div>
})}
</div>
)
}
export default FeaturedVideo;
视频的:id以以下方式包括在路径中:
[
{
"id": 2,
"firstLogo": "Minecraft",
"thumbnail": "Thumbnail",
"available": "Unlock 12/6",
"sample": "https://www.youtube.com/watch?v=c_dG_HxHMVI"
},
{
"id": 3,
"firstLogo": "Batman",
"thumbnail": "Thumbnail",
"available": "Unlock 12/13",
"sample": "https://www.youtube.com/watch?v=c_dG_HxHMVI"
}
]
<Router>
<Navbar/>
<Switch>
<Route path="/:videoID">
<FeaturedVideo/>
</Route>
<Route exact path="/">
<Home />
</Route>
</Switch>
<Footer />
</Router>
```re
```再
您使用useEffect挂钩是正确的。您希望在组件装载时加载此数据
假设URL返回JSON,您可以简单地:
fetch(url)
.then(res => res.json().then(videos => setVideos(videos)));
这段代码有几个问题:
{videos.id.map((视频)=>{
})}
videos
变量最初是null
,然后(在获取之后)是一个数组。数组没有id
属性,访问null
属性是非法操作。您可能希望首先确保这是一个数组,而不是null
,然后还要删除“.id”部分
.map()
返回任何内容!是的,您为数组的每个项创建了一个JSX元素,但是在这之后它们将被销毁而不使用
{视频和视频.map((视频)=>(
))}
另一个问题是变量的可见性:
从“/path/to/data.json”导入视频;
//后来
const[videos,setVideos]=useState(null);
第一个变量videos
(导入的变量)不再可见,它是由第二个变量获得的
您可以重命名第二个变量以防止阴影,也可以完全删除第一个变量,因为它未使用
我可以看到的下一件事是,代码无法决定它实际上要完成什么。一方面,路由器为特定的视频提供一个ID,这意味着我们试图只显示一个视频。然而,另一方面,
FeaturedVideo
组件几乎完全适合显示所有视频的列表
但从名称和整体设置来看,很明显,您试图显示的是一个视频,而不是整个列表
看起来您正在使用react路由器
。如果这是真的,那么在FeaturedVideo
中,您需要访问路由器提供的视频ID。假设它是v5+,您可以使用useParams
hook来实现:
import React,{useState,useffect}来自“React”;
从“react router”导入{useParams};
const[video,setVideo]=useState(null);/'“视频”,而不是“视频”
const{videoID}=useParams();
useffect(()=>{
fetch(“/src/data/data.json”)
.然后((res)=>res.json())
.然后((视频)=>videos.filter((视频)=>{
返回video.id==videoID;
}))
。然后((匹配)=>setVideo(匹配[0]);
}, []);
//此处的'video'变量包含'null'或第一个匹配的数组项。
//使用上面的建议呈现它。
参考资料:
- (请参见说明部分)
{videos.map((video)=>{return})
而且您的'/'
(主路径)应该位于动态路径之前'/:videoId'
您好!非常感谢您的回复。我以前试过,但也没有成功,但至少这仍然为我指明了正确的方向。我在回购协议的其他部分映射得很好,但是我在使用映射方法时收到的错误。“期望一个赋值或函数调用,而不是看到一个表达式没有未使用的表达式”,这对我们来说没有任何意义me@CarolinaKlein看我上面的评论,那是因为你没有返回任何东西。。。