这是一个很好的问题,通常可以通过两种方式完成。我将简要提及它们。 当然,还有其他方法;)
道具
React 喜欢 props,所以如果你能用它解决它,那应该是你的第一个方法。
const App = () => {
const [value, setValue] = useState(...)
return (
<Router>
<Route1 render={() => <GamePage value={value} />} />
<Route2 render={() => <AnalyzePage value={value} />} />
</Router>
)
}
如果您想在 Game 或 Analyze 中更改此值,请在内部也传递 setValue。
上下文
如果路由中有非常嵌套的组件,有时人们喜欢使用上下文。
const App = () => {
const [value, setValue] = useState(...)
return (
<Context.Provider value={{ value, setValue}}>
<Router>
<Route1 render={() => <GamePage />} />
<Route2 render={() => <AnalyzePage />} />
</Router>
</Context.Provider>
)
}
const ComponentInsideGame = () => {
const { value } = useContext(Context)
...
}
全球
如果你想在 React 后面发送一些东西,例如你根本不想为这些共享数据触发渲染。您可以使用 ref 进行全局上下文。
const App = () => {
const ref = useRef({
gameConfiguration: ...,
runGame: () => {}
))
return (
<Router>
<Route1 render={() => <GamePage />} />
<Route2 render={() => <AnalyzePage />} />
</Router>
)
}
const ComponentInsideGame = () => {
const { current } = useContext(Context)
current.gameConfiguration = {...}
current.runGame()
...
}
路线状态
您提供的链接是浏览器状态的另一种方式,但这实际上不是一种反应方式,它是一种浏览器方式恕我直言。但是你知道吗,反正对你有用就好:)