![](/img/trans.png)
[英]React component not re-rendering on URL parameter change when using useEffect hook to fetch data
[英]Component not re-rendering in React using a 'useEffect' hook
我正在創建一個彈出模式,它應該只出現在用戶第一次訪問網站時。 為此,我使用 useEffect 鈎子來做兩件事:1.) 檢查是否已經設置了 cookie,(如果沒有,它將設置 cookie)2.) 基於該檢查,更新isCookie 狀態為真/假。
然后我將 isCookie 狀態值作為道具傳遞給模態組件,該組件將使用 isCookie 狀態來確定是否顯示模態。
問題是:模態僅基於 useState 初始值進行渲染。 即使在 useEffect 中更新了狀態,模態也不會重新渲染。 我可以通過控制台日志確認狀態正在更新,但我不知道如何讓模態重新渲染。
useEffect 中的 cookie 檢查和放置:
const [cookie, setCookie] = useState({isCookie:true})
const newCookie = "visited=true; max-age=604800";
useEffect(() => {
if (!document.cookie.split(';').some((item) => item.trim().startsWith('visited='))) { //check to see if a cookie has been placed, if not this is a 'first visit'
setCookie({isCookie:false});
document.cookie = newCookie; //place cookie on first visit
}
}, [])
<PopUp cookie={cookie.isCookie}/>
彈窗/模態組件的相關部分:
const PopUp = (props) => {
/*if a cookie is present, the initial state of the modal is hidden, otherwise it's set to 'open' or shown*/
const initialModalState = props.cookie ? {open: false} : {open: data.markdownRemark.frontmatter.show}
const [modal, setModal] = useState(initialModalState)
}
useEffect
確實使用狀態更改重新渲染模態,但重新渲染不會重置其中渲染的組件的狀態變量(如果您想到帶有受控組件的表單,那將是可怕的。)只有重新安裝才能做到這一點.
因此,當您將 modal 設置為useState(intialModalState)
,它將始終依賴於它接收到的初始 prop 而沒有其他任何東西。
要在重新渲染發生時將 prop 同步到 state,您需要在 child 中使用useEffect
來監聽 prop 更改:
const initialModalState = props.cookie ? {open: false} : {open: data.markdownRemark.frontmatter.show}
const [modal, setModal] = useState(initialModalState)
useEffect(() => {
setModal(props.cookie ? {open: false} : {open: data.markdownRemark.frontmatter.show})
}, [props.cookie]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.