【发布时间】:2019-07-25 23:28:03
【问题描述】:
locationHistory 在以下代码中始终是一个空数组:
export function LocationHistoryProvider({ history, children }) {
const [locationHistory, setLocationHistory] = useState([])
useEffect(() => history.listen((location, action) => {
console.log('old state:', locationHistory)
const newLocationHistory = locationHistory ? [...locationHistory, location.pathname] : [location.pathname]
setLocationHistory(newLocationHistory)
}), [history])
return <LocationHistoryContext.Provider value={locationHistory}>{children}</LocationHistoryContext.Provider>
}
console.log 始终记录 []。我尝试在常规的 react 类中做完全相同的事情,并且效果很好,这让我认为我使用了错误的钩子。
任何建议将不胜感激。
更新:删除useEffect ([history]) 的第二个参数可以修复它。但为什么?目的是不需要在每次重新渲染时重新运行此效果。因为它不应该是。我认为这就是效果器的工作方式。
添加一个空数组也会破坏它。似乎 [locationHistory] 必须作为第二个参数添加到 useEffect 以阻止它中断(或根本没有第二个参数)。但我很困惑为什么这会阻止它破裂? history.listen 应该在位置更改时运行。为什么useEffect每次locationHistory变化都需要重新运行一次,以避免出现上述问题?
附:在这里玩一下:https://codesandbox.io/s/react-router-ur4d3?fontsize=14(感谢 lissitz 在那里完成了大部分腿部工作)
【问题讨论】:
-
嗯,真奇怪:s
-
@lissitz 我刚刚意识到您复制了错误的代码。您没有在正确的位置包含 [history] 变量。当我完全删除 [history] 参数时,它开始起作用。所以感谢您意外地为我找到了它:D 我仍然不知道为什么包含它会破坏它。
标签: reactjs react-hooks