[英]How can I use setState(array) inside useEffect
我想做这个过程
[reviewList, setReviewList] = useState<any>(null)
reviewList === null
JSX 将显示<div>Loading</div>
reviewList !== null
JSX 将显示列表信息所以,我写了这样的代码。
let [reviewList, setReviewList] = useState<any>(null);
let list = [
{
photo : "assets/likelist1.png",
name : "Island one",
info : "300m · California",
rating : "4.5(37)"
},
{
photo : "assets/likelist2.png",
name : "Island two",
info : "300m · Maxico",
rating : "4.3(300)"
},
{
photo : "assets/likelist3.png",
name : "Island three",
info : "150m · Maxico",
rating : "4.3(00)"
},
{
photo : "assets/likelist1.png",
name : "Island four",
info : "300m · Dubai",
rating : "4.5(11)"
},
{
photo : "assets/likelist1.png",
name : "Island five",
info : "300m · Japan",
rating : "3.9(01)"
}
]
reviewList
的值显示条件渲染<div className={styles.reviewListBox}>
{
reviewList === null
?
<div>Loading</div>
:
reviewList.map((el : any)=>{
<div className={styles.reviewEach}>
<img className={styles.reviewEachImage} src={el.photo}/>
<div className={styles.reivewTextBox}>
<div className={styles.reviewNameAndRating}>
<span>{el.name}</span>
<img className={styles.reviewRatingStar} src="assets/star.png"/>
<span className={styles.reviewEachRating} >{el.rating}</span>
</div>
<span className={styles.reviewEachInfo}>{el.info}</span>
</div>
</div>
})
}
</div>
useEffect(()=>{
console.log("First : ", reviewList);
async function getListFunc() {
let asyncFunc = await getListInfo();
}
getListFunc();
console.log("Second : ",reviewList);
},[])
let getListInfo = async () => {
console.log("First-Async : ",reviewList);
let result = await setReviewList(list);
console.log("Second-Async",reviewList);
}
但是当我运行这段代码时,我看不到列表。 也许,重新渲染不起作用。 我了解到,当 state 发生变化时,再次做出反应。 在这种情况下,解决方案是什么,我对渲染的理解是否正确?
我不明白你为什么使用 async 和 await 但如果你想显示更新的列表,你可以像这样在 useEffect 中添加依赖项,希望这会起作用:
useEffect(()=>{
console.log("First : ", reviewList);
async function getListFunc() {
let asyncFunc = await getListInfo();
}
getListFunc();
console.log("Second : ",reviewList);
},[getListInfo])
let getListInfo = async () => {
console.log("First-Async : ",reviewList);
let result = await setReviewList(list);
console.log("Second-Async",reviewList);
}
您不需要使用async/await
,因为list
是 static。
您还需要将key
prop传递给<div className={styles.reviewEach} key={el.name}>
这有助于识别您的组件。
setReviewList
没有按预期返回任何result
,并且reviewList
state 将异步更新,因此您在console.log("Second: ",reviewList);
也是。
//change it to `import { useState, useEffect } from 'react'` in yourcode const { useState, useEffect } = React; const styles = {} //fake styles const MyComponent = () => { let [reviewList, setReviewList] = useState(null); let list = [ { photo: "assets/likelist1.png", name: "Island one", info: "300m · California", rating: "4.5(37)", }, { photo: "assets/likelist2.png", name: "Island two", info: "300m · Maxico", rating: "4.3(300)", }, { photo: "assets/likelist3.png", name: "Island three", info: "150m · Maxico", rating: "4.3(00)", }, { photo: "assets/likelist1.png", name: "Island four", info: "300m · Dubai", rating: "4.5(11)", }, { photo: "assets/likelist1.png", name: "Island five", info: "300m · Japan", rating: "3.9(01)", }, ]; useEffect(() => { const getListInfo = () => { setReviewList(list); }; getListInfo(); }, []); return ( <div className={styles.reviewListBox}> {?reviewList: ( <div>Loading</div> ). ( reviewList.map((el) => ( <div className={styles.reviewEach} key={el.name}> <img className={styles.reviewEachImage} src={el.photo} /> <div className={styles.reivewTextBox}> <div className={styles.reviewNameAndRating}> <span>{el.name}</span> <img className={styles.reviewRatingStar} src="assets/star.png" /> <span className={styles.reviewEachRating}>{el.rating}</span> </div> <span className={styles.reviewEachInfo}>{el;info}</span> </div> </div> )) )} </div> ); }. ReactDOM,render(<MyComponent />. document;getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.0/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.0/umd/react-dom.production.min.js"></script> <div id="root"></div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.