react route - 如何使用 history.push 切换组件?只有 URL 变化
react route - How to use history.push to switch components ? Only URL changes
我有一个功能,我希望它能替换 Header
和 Footer
组件之间的组件。
Where/How 我应该将 defaultRouter
函数与 history.push
一起使用吗?我看到 只有 URL 改变了 。
Header
组件正在更新 pageIndex
。
我试图将 defaultRouter
更改为 useCallback
函数,但这根本不起作用。
这些函数的顺序是什么?
App.js
function App() {
const [searchResults, setSearchResults] = useState([]);
const [itemsAmount, setItemsAmount] = useState('');
const [pageIndex, setPageIndex] = useState();
const history = createBrowserHistory();
// let history = useHistory();
const defaultRouter = useMemo(() => {
console.log(pageIndex);
switch (pageIndex) {
case 1:
history.push({ pathname: '/search', state: searchResults });
break;
case 2:
history.push('/cart');
break;
default:
history.push('/');
break;
}
}, [pageIndex]);
return (
<div className='App'>
<Header
settingResults={setSearchResults}
itemsCartAmount={itemsAmount}
setPageIndex={setPageIndex}
/>
{defaultRouter}
<Footer />
<Router history={history}>
<Switch>
<Route exact path='/'>
<Home />
</Route>
<Route path='/search'>
<Search/>
</Route>
<Route path='/cart'>
<Cart />
</Route>
<Route component={PageNotFound} />;
</Switch>
</Router>
</div>
);
}
编辑
我刚刚从Index.js中删除了BrowserRouter
,同样的问题。
Index.js
ReactDOM.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>,
document.getElementById('root')
);
pageIndex
上方的这种方式正在更新,但 history.push
不要切换组件。
更新
请看看这个,我试图复制你的问题。
https://codesandbox.io/s/amazing-swartz-jxc5p?file=/src/App.js
您使用过 Router 两次,一次在 App.js
内作为 <Router>
,另一次在 index.js
内作为 <BrowserRouter>
。
你需要做的是;仅在 App.js 内部使用并确保将其导入为:
import {Router} from 'react-router-dom';
因为 Router 接受 history prop,而不是 BrowserRouter,并且还从 index.js
.
中删除 BrowserRouter
为了安全起见,使用 useHistory()
钩子获取历史值。
这将解决您的问题。
我认为这里发生的事情是每次更新 pageIndex
时都会创建 history
对象。理想情况下,它应该只手动创建一次。
您可以在此处找到有效的解决方案 Sandbox。
我更新了
- 创建历史对象的逻辑
- 已从应用
中删除Router
- 使用
useHistory
获取组件中的历史对象。
- 还写了
pageIndex
更新时推送变化的效果
我有一个功能,我希望它能替换 Header
和 Footer
组件之间的组件。
Where/How 我应该将 defaultRouter
函数与 history.push
一起使用吗?我看到 只有 URL 改变了 。
Header
组件正在更新 pageIndex
。
我试图将 defaultRouter
更改为 useCallback
函数,但这根本不起作用。
这些函数的顺序是什么? App.js
function App() {
const [searchResults, setSearchResults] = useState([]);
const [itemsAmount, setItemsAmount] = useState('');
const [pageIndex, setPageIndex] = useState();
const history = createBrowserHistory();
// let history = useHistory();
const defaultRouter = useMemo(() => {
console.log(pageIndex);
switch (pageIndex) {
case 1:
history.push({ pathname: '/search', state: searchResults });
break;
case 2:
history.push('/cart');
break;
default:
history.push('/');
break;
}
}, [pageIndex]);
return (
<div className='App'>
<Header
settingResults={setSearchResults}
itemsCartAmount={itemsAmount}
setPageIndex={setPageIndex}
/>
{defaultRouter}
<Footer />
<Router history={history}>
<Switch>
<Route exact path='/'>
<Home />
</Route>
<Route path='/search'>
<Search/>
</Route>
<Route path='/cart'>
<Cart />
</Route>
<Route component={PageNotFound} />;
</Switch>
</Router>
</div>
);
}
编辑
我刚刚从Index.js中删除了BrowserRouter
,同样的问题。
Index.js
ReactDOM.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>,
document.getElementById('root')
);
pageIndex
上方的这种方式正在更新,但 history.push
不要切换组件。
更新
请看看这个,我试图复制你的问题。
https://codesandbox.io/s/amazing-swartz-jxc5p?file=/src/App.js
您使用过 Router 两次,一次在 App.js
内作为 <Router>
,另一次在 index.js
内作为 <BrowserRouter>
。
你需要做的是;仅在 App.js 内部使用并确保将其导入为:
import {Router} from 'react-router-dom';
因为 Router 接受 history prop,而不是 BrowserRouter,并且还从 index.js
.
BrowserRouter
为了安全起见,使用 useHistory()
钩子获取历史值。
这将解决您的问题。
我认为这里发生的事情是每次更新 pageIndex
时都会创建 history
对象。理想情况下,它应该只手动创建一次。
您可以在此处找到有效的解决方案 Sandbox。
我更新了
- 创建历史对象的逻辑
- 已从应用 中删除
- 使用
useHistory
获取组件中的历史对象。 - 还写了
pageIndex
更新时推送变化的效果
Router