📅  最后修改于: 2023-12-03 15:39:38.694000             🧑  作者: Mango
当我们在使用路由库(如React Router)时,可能需要在路由更改时执行一些特定的操作,例如获取数据或更新UI等。为了实现这个目的,我们可以将一个函数作为道具(prop)传递给路由组件,然后在路由更改时执行该函数。
我们可以在父组件中定义一个函数,然后将该函数作为道具传递给路由组件。
import React, { useState } from 'react';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
function App() {
const [count, setCount] = useState(0);
const incrementCount = () => {
setCount(count + 1);
};
return (
<Router>
<Switch>
<Route path="/page1" render={() => <Page1 incrementCount={incrementCount} />} />
<Route path="/page2" component={Page2} />
</Switch>
</Router>
);
}
function Page1(props) {
const handleClick = () => {
props.incrementCount();
};
return (
<div>
<h1>Page 1</h1>
<button onClick={handleClick}>Increment Count</button>
</div>
);
}
function Page2() {
return (
<div>
<h1>Page 2</h1>
</div>
);
}
export default App;
在上面的代码中,我们定义了一个名为incrementCount
的函数,它增加了count
变量的值。然后我们将incrementCount
函数作为道具传递给了Page1
组件。在Page1
组件中,我们定义了一个名为handleClick
的函数,该函数在按钮被点击时调用props.incrementCount
函数执行。这将增加count
变量的值,并且我们可以在任何路由组件中使用count
的现值。
我们需要在路由更改时执行传递给路由组件的函数。为此,我们可以使用useEffect
hook并且依赖于路由器的history
对象。
import React, { useEffect } from 'react';
import { useHistory } from 'react-router-dom';
function Page1(props) {
const history = useHistory();
useEffect(() => {
const unlisten = history.listen(() => {
props.incrementCount();
});
return () => {
unlisten();
};
}, [history, props]);
const handleClick = () => {
history.push('/page2');
};
return (
<div>
<h1>Page 1</h1>
<button onClick={handleClick}>Go to page 2</button>
</div>
);
}
在上面的代码中,我们调用了useHistory
hook来获取history
对象。然后我们在useEffect
hook中订阅了路由更改事件并执行传递给Page1
组件的函数。最后,我们在return
语句中取消了订阅以避免内存泄漏。
传递函数作为道具并在路由更改时执行该函数是一种在路由器中执行特定操作的有效方法。我们可以使用useEffect
hook和路由器的history
对象来实现该目的。