React-Router URL 在 Link Click 上导致组件重新安装(使用 useEffect(..),[] 重新初始化)
React-Router URL Causes Component Re-Mount (Re-Initialization with useEffect(..), []) on Link Click
我运行这里也提到了一个问题,React-Router re-mounts component on route change,但没有任何解决方案。
如果我有一个 Link 指向由 react-router
管理的 URL(在我的例子中是 react-router-bootstrap
),
export default function Navigation(props) {
return (
<div id="top-nav">
<Nav as="nav" aria-label="main" className="container">
<Nav.Item>
<LinkContainer to="/">
<Nav.Link><i className="fas fa-home" aria-label="Home"></i></Nav.Link>
</LinkContainer>
</Nav.Item>
<Nav.Item>
<LinkContainer to="/agreements">
<Nav.Link>Agreements</Nav.Link>
</LinkContainer>
</Nav.Item>
我的 Home
组件位于具有开关的父 Main
组件中,
export default function Main(props) {
return (
<main className="container" id="main">
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/agreements">
<Agreements />
</Route>
<Route path="/approvals">
<Approvals />
</Route>
然后我的 Home
组件 (/
) 有一个 init (mount) useEffect(..,[])
as
export default function Home(props) {
// On initialization, fetch data
useEffect(() => {
fetchPreliminaryData();
}, []);
}
然后 每次 单击主页 link,我将进入我的 Initializing/Mounting 提取。我在调试器中验证了这一点。我的目标是只在第一次加载组件时进行提取。这会影响我的应用程序的性能。有什么解决办法吗?
我会在全局状态中存储这样的东西,只有当它不存在时才获取它。但是,如果你没有为你的项目实现这样的行为,你可以将这些数据保存在父组件中,并将它作为 props 与 onChange 函数一起发送,这样在你第一次获取它时,你就将数据发送给父组件组件,它将把它作为 props 发回,并且在 useEffect 中,如果 props.preliminaryData 存在,你可以添加一个条件来获取数据。
我运行这里也提到了一个问题,React-Router re-mounts component on route change,但没有任何解决方案。
如果我有一个 Link 指向由 react-router
管理的 URL(在我的例子中是 react-router-bootstrap
),
export default function Navigation(props) {
return (
<div id="top-nav">
<Nav as="nav" aria-label="main" className="container">
<Nav.Item>
<LinkContainer to="/">
<Nav.Link><i className="fas fa-home" aria-label="Home"></i></Nav.Link>
</LinkContainer>
</Nav.Item>
<Nav.Item>
<LinkContainer to="/agreements">
<Nav.Link>Agreements</Nav.Link>
</LinkContainer>
</Nav.Item>
我的 Home
组件位于具有开关的父 Main
组件中,
export default function Main(props) {
return (
<main className="container" id="main">
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/agreements">
<Agreements />
</Route>
<Route path="/approvals">
<Approvals />
</Route>
然后我的 Home
组件 (/
) 有一个 init (mount) useEffect(..,[])
as
export default function Home(props) {
// On initialization, fetch data
useEffect(() => {
fetchPreliminaryData();
}, []);
}
然后 每次 单击主页 link,我将进入我的 Initializing/Mounting 提取。我在调试器中验证了这一点。我的目标是只在第一次加载组件时进行提取。这会影响我的应用程序的性能。有什么解决办法吗?
我会在全局状态中存储这样的东西,只有当它不存在时才获取它。但是,如果你没有为你的项目实现这样的行为,你可以将这些数据保存在父组件中,并将它作为 props 与 onChange 函数一起发送,这样在你第一次获取它时,你就将数据发送给父组件组件,它将把它作为 props 发回,并且在 useEffect 中,如果 props.preliminaryData 存在,你可以添加一个条件来获取数据。