如何在 react 中使用 useEffect 钩子在启动时运行具有默认"id"的函数?



我正在制作一个简单的博客帖子网站,用户可以在这里发布条目。

目标是:让主页在列表中显示所有博客文章,并在主页第一次加载时在其旁边显示任何一个博客文章的详细信息。当用户单击列表中的任何项时,其详细信息将替换默认的博客详细信息。Indeed基本上是如何显示职位的。

方法:我做了两个Axios调用,一个获取所有数据,另一个通过id获取数据。来自getAllData的数据显示在主页上的列表中,数据作为道具传递给HomePageListItems,这些道具被包装在

我使用useParams来获取id并在DataById中进行getDataId调用。

所以,主页有子组件HomePageListItems和DataById问题是:

  1. 函数getDataById在首页第一次加载时不工作。只有当route是"localhost/:id"即"localhost:3000/ae86140b-7ae6-457-826c-5bd324b8cb3";

  2. 因为我想要一个博客已经在第一次加载时显示:我如何让这个getDatabyId函数运行一个预设id,其中id在用户单击列表项时发生变化?

代码是:

import React, { useState, useEffect, usePrevious } from "react";
import { Link, useParams } from "react-router-dom";
import Axios from "axios";
import HomePageListItems from "./homePageListItems";
import DataById from "./dataById";
export default function HomePage(props){
<DataById/>
const [getAllData, setGetAllData] = useState()
const getData =async () => {
await  Axios.get("http://localhost:5000/get").then((response)=>{
setGetAllData(response.data)
})
.catch((error)=>{console.log(error)})
}
useEffect(()=>{
getData();
},[])
return(
<section>
<Link to = "/postJournal">Post Journal Entry</Link>
{getAllData&&getAllData.map((item)=>{
return(
<HomePageListItems
key={item.id}
idx={item.id}
name={item.name}
title={item.title}
journalEntry={item.journalEntry}
date={item.date}
file={item.file}
/>
)
})

}
{usePrevious}
<DataById/>
</section>

)
}

,

import React, { useState, useEffect, usePrevious } from "react";
import { useParams } from "react-router-dom";
import Axios from "axios";

export default function DataById(props){
console.log("DataProps",props)
const [axiosGetData, setAxiosGetData] = useState([])
const {id} = useParams()
const getDataById =async () => {
await  Axios.get(`http://localhost:5000/${id}`).then((response)=>{
setAxiosGetData(response.data[0])
console.log("Data",response.data[0])
})
.catch((error)=>{console.log(error)})
}
useEffect(()=>{
getDataById("35b48be0-0ab8-4409-a5eb-a0c4dbd0a4b3");
},[id])

return(
<>
<p> DataByID</p>
name:{axiosGetData.name}
Date:{axiosGetData.date}
Journal:{axiosGetData.journalEntry}
{usePrevious}
</>

)

}  
--
import React, { useState, useEffect, usePrevious} from "react";
import { Link} from "react-router-dom";

export default function HomePageListItems(props){
let {name,title,journalEntry,date,file,idx}=props
return(
<main className= "homepage">
<Link to={`/${idx}`} >
<section className="homepage__listContainer">
<ul className = "homepage__list">
<li className="homepage__listItemWrapper">
<div className ="homepage__listItem">
<div className = "homepage__listItemImgWrapper">
<img className = "homepage__listItemImg" alt="" src={file}/>
</div>
<h3 className= "homepage__listItemTitle">Title:{title}</h3>
<p className = "homepage__listItemAuthor">Name:{name}</p>
<p className = "homepage__listItemDescription">Description:{journalEntry}</p>
<p className = "homepage__listItemDate">Posted Date:{date}</p>
<p>Key:{idx}</p>
</div>
</li>
</ul>
</section>
</Link>
{usePrevious}  
</main>

)
}
--
import React from "react";
import "./style/App.css";
import ReactDOM from 'react-dom';
import { BrowserRouter, Switch, Router, Route } from "react-router-dom";
import HomePage from "./components/homePage"
import PostJournalEntry from "./components/postJournalEntry"
import DataByIDfrom "./components/dataById"

function App() {
return (
<div className="app">
<BrowserRouter>
<Switch>
<Route path="/:id" exact component = {HomePage}/>
<Route path="/:id" exact component = {DataByID}/>
<Route path="/postJournal" exact component = {PostJournalEntry}></Route>
<Route path="/" exact component = {HomePage}/>
</Switch>
</BrowserRouter>
</div>
);
}
export default App;

提前感谢各位!如有任何帮助,不胜感激。

这是因为getDataById不接受任何参数,它总是为axios get调用使用URL id (useParams),在useEffect中传递它的id不会做任何事情。您需要向函数添加一个参数,然后添加一些逻辑,以便它知道是使用传入值还是URL id值。您可以尝试这样做:

const getDataById = async (startupId = null) => {
await  Axios.get(`http://localhost:5000/${startupId ? startupId : id}`).then((response)=>{
setAxiosGetData(response.data[0])
console.log("Data",response.data[0])
})
.catch((error)=>{console.log(error)})
}

这样,如果你给getDataById传递一个参数,它将使用该值来调用axios,否则它将尝试使用useParams

中的id值

相关内容

最新更新