导航到新页面时,BottomNavigation 不更新

Posted

技术标签:

【中文标题】导航到新页面时,BottomNavigation 不更新【英文标题】:BottomNavigation does not update when navigating to new page 【发布时间】:2021-11-15 10:23:09 【问题描述】:

我在为我的网站构建底部导航栏时遇到了这个问题:

所以它有 3 个按钮,主页、个人资料、匹配项。我想在它们之间切换。但是,我注意到,当我单击配置文件按钮时,页面切换到配置文件选项卡,但该按钮仍保持在相同的主页位置,直到我双击它。于是我调试了一下,发现了这个问题:

显然,当我单击按钮时,它仍然停留在同一路径上?这是我的底部导航代码:

import * as React from 'react';
import  Paper  from '@mui/material';
import BottomNavigation from '@mui/material/BottomNavigation';
import BottomNavigationAction from '@mui/material/BottomNavigationAction';
import ForumIcon from '@mui/icons-material/Forum';
import  Link  from 'react-router-dom';
import  withRouter  from 'react-router';

import HomeIcon from '@mui/icons-material/Home';
import PersonIcon from '@mui/icons-material/Person';

function BottomNav(props) 
  const [value, setValue] = React.useState(1);

  console.log('current path', props.location.pathname);

  const handleChange = () => 
    if(props.location.pathname == '/match')
      setValue(0);
    

    if(props.location.pathname == '/')
      setValue(1);
    

    if(props.location.pathname == '/profile')
      setValue(2);
    

    console.log('value is', value, 'on path', props.location.pathname);
  

  return (
    <Paper sx= position: 'fixed', bottom: 0, left: 0, right: 0  elevation=3>
      <BottomNavigation
        value=value
        onChange=handleChange
        showLabels
      >
        <BottomNavigationAction 
        component=Link
        to="/match" 
        label="Matches" 
        icon=<ForumIcon /> />

        <BottomNavigationAction 
        component=Link
        to="/" 
        label="Home" 
        icon=<HomeIcon /> />

        <BottomNavigationAction 
        component=Link
        to="/profile" 
        label="Profile" 
        icon=<PersonIcon /> />
      </BottomNavigation>
    </Paper>
  );


export default withRouter(BottomNav);

这是包含导航栏的组件:

import React from "react";
import  Route, Switch  from "react-router-dom";
import Login from "../../Auth/Login";
import Logout from "../../Auth/Logout";
import Register from "../../Auth/Register";
import Dashboard from "../../Dashboard";
import Landing from "../../Landing";
import Profile from "../../Profile";
import Home from "../../Home"
import  Role  from "../Authentication";
import ProtectedRoute from "../Authentication/ProtectedRoute";
import ErrorRoute from "./ErrorRoute";
import CreateListing from '../../Listing/CreateListing';
import UpdateListing from '../../Listing/UpdateListing';
import ListingList from '../../Listing';
import ListingDisplay from '../../Listing/ListingDisplay';
import Forgot from "../../Auth/Forgot";
import AddBio from "../../Profile/AddBio";
import Match from "../../Match/Match";
import BottomNav from "../Navigation/BottomNav";

const Router = () => (
  <>
  <Switch>
    <Route exact path="/login" component=Login />
    <Route exact path="/logout" component=Logout />
    <Route exact path="/register" component=Register />
    <Route exact path="/forgot" component=Forgot />
    <Route exact path="/landing" component=Landing />
    /* Protected */
    <ProtectedRoute exact roles=[Role.Admin] path="/dashboard" component=Dashboard />
    <ProtectedRoute exact roles=[Role.Flatee] path="/addbio" component=AddBio />
    <ProtectedRoute exact roles=[Role.Flat] path="/newlisting" component=CreateListing />
    <ProtectedRoute exact path="/" component=Home />
    <ProtectedRoute exact roles=[Role.Flat] path="/updatelisting" component=UpdateListing />
    <ProtectedRoute exact roles=[Role.Flat] path="/listings" component=ListingList />
    <ProtectedRoute exact path="/listing/display" component=ListingDisplay />
    <ProtectedRoute exact path="/profile" component=Profile />
    <ProtectedRoute exact path="/match" component=Match />
    <Route component=ErrorRoute />
  </Switch>
  <BottomNav/>
  </>
);

export default Router;

【问题讨论】:

【参考方案1】:

这是因为当handleChange回调触发时,你还在当前路由上,在react-router导航到新页面之前,所以location.pathname没有设置新路由。 setState() 设置当前索引变量,所以没有任何变化

const handleChange = () => 
  if(props.location.pathname == '/match')
    setValue(0);
  

  // when you're on home page and click the profile tab, setState(1) is called
  // which is meaningless
  if(props.location.pathname == '/')
    setValue(1);
  

  if(props.location.pathname == '/profile')
    setValue(2);
  

  console.log('value is', value, 'on path', props.location.pathname);

当 react-router 导航到新页面时,BottomNav 将被重新渲染,您应该根据更新后的props.location.pathname 获取索引:

function getPageIndex(route) 
  switch (route) 
    case '/match': return 0;
    case '/': return 1;
    case '/profile': return 2;
    default: return 0;
  

function BottomNav(props) 
  const value = getPageIndex(props.location.pathname);

  return (
    <Paper sx= position: 'fixed', bottom: 0, left: 0, right: 0  elevation=3>
      <BottomNavigation value=value showLabels>
        <BottomNavigationAction 
          component=Link
          to="/match" 
          label="Matches" 
          icon=<ForumIcon /> />
        ...
      </BottomNavigation>
    </Paper>
  );

【讨论】:

在这种情况下,handleChange 函数会是什么? 哦,神经,我把它整理出来了!非常感谢!

以上是关于导航到新页面时,BottomNavigation 不更新的主要内容,如果未能解决你的问题,请参考以下文章

React Material UI BottomNavigation 组件路由问题

BottomNavigation popBackStack() 导航到 startDestination 而不是上一个片段

单击图标时无法导航到新页面

BottomNavigation 在带有组件导航的片段中不起作用

导航到新页面时防止颤动块状态更改

当在颤动中点击网格时如何导航到新页面?