Почему активная вкладка перенаправляется на первую вкладку в React Material

Я успешно перенаправил вкладку в зависимости от маршрутов. Моя проблема в том, что когда я нахожусь на второй и последующих вкладках, когда я обновляю браузер, активная подсветка на вкладках возвращается к первой вкладке?

Почему это происходит? Пожалуйста, проверьте мой код ниже

function TabPanel(props) {
  const { children, value, index, ...other } = props;

  return (
    <div
      role="tabpanel"
      hidden={value !== index}
      id={`scrollable-auto-tabpanel-${index}`}
      aria-labelledby={`scrollable-auto-tab-${index}`}
      {...other}
    >
      {value === index && (
        <Box pt={4}>
          <div>{children}</div>
        </Box>
      )}
    </div>
  );
}

TabPanel.propTypes = {
  children: PropTypes.node,
  index: PropTypes.any.isRequired,
  value: PropTypes.any.isRequired,
};

function a11yProps(index) {
  return {
    id: `scrollable-auto-tab-${index}`,
    'aria-controls': `scrollable-auto-tabpanel-${index}`,
  };
}

const useStyles = makeStyles((theme) => ({
  root: {
    flexGrow: 1,
    maxWidth: 640,
  },
}));

export default function Settings() {
  const classes = useStyles();
  const [value, setValue] = React.useState(0);

  const handleChange = (event, newValue) => {
    setValue(newValue);
  };

  return (
    <div>
      <AppBar position="static" color="inherit" className={classes.root}>
        <Tabs
          value={value}
          onChange={handleChange}
          indicatorColor="primary"
          textColor="primary"
          variant="scrollable"
          scrollButtons="auto"
          aria-label="scrollable auto tabs example"
        >
          <Tab label="Users" component={Link} to="/users" {...a11yProps(0)} />
          <Tab label="Products" component={Link} to="/products" {...a11yProps(1)} />
          <Tab label="Sales" component={Link} to="/sales" {...a11yProps(2)} />
        </Tabs>
      </AppBar>
      <TabPanel value={value} index={0}>
        <Users />
      </TabPanel>
      <TabPanel value={value} index={1}>
        <Products />
      </TabPanel>
      <TabPanel value={value} index={2}>
        <Sales />
      </TabPanel>
    </div>
  );

person Joseph    schedule 18.08.2020    source источник
comment
Я думаю, что так это работает, как и у меня тоже.   -  person Kundan    schedule 18.08.2020
comment
Вы должны создать минимально воспроизводимый пример (лучше на codeandbox)   -  person hgb123    schedule 18.08.2020


Ответы (1)


Итак, вы хотите отобразить один и тот же компонент на разных маршрутах.

 <BrowserRouter>
        <Route path={"/"} exact component={TabComponent} />
        <Route path={"/users"} exact component={TabComponent} />
        <Route path={"/products"} exact component={TabComponent} />
        <Route path={"/sales"} exact component={TabComponent} />
   </BrowserRouter>

и вы хотите, чтобы вкладка оставалась активной в зависимости от пути маршрута, вы можете добиться этого, проверив имя пути в useEffect.

  useEffect(() => {
    const pathname = props.history.location.pathname;
    switch (pathname) {
      default:
        setValue(0);
        break;
      case "/users":
        setValue(0);
        break;
      case "/products":
        setValue(1);
        break;
      case "/sales":
        setValue(2);
        break;
    }

  }, [props.history.location.pathname]);

Вот рабочий пример: https://codesandbox.io/s/floral-rgb-6o55s?fontsize=14&hidenavigation=1&theme=dark

person Ubeyt Demir    schedule 18.08.2020
comment
Привет! К сожалению, это не работает. Мне не нужны для этого параметры запроса. Просто нормальный Линк подойдет - person Joseph; 18.08.2020
comment
Тогда, вероятно, вы хотите отображать один и тот же компонент на каждом маршруте, правильно? если это так, вы можете проверить имя пути в соответствующем маршруте и установить активную вкладку в соответствии с именем пути, - person Ubeyt Demir; 18.08.2020
comment
Я хочу визуализировать компонент ‹Пользователи /›, если я нажимаю меню пользователей, если я нажимаю меню продуктов, я визуализирую компонент ‹Продукты /› - person Joseph; 18.08.2020
comment
Что ж, вам следует как-то сохранить if activeTab, если вы хотите видеть недавнюю вкладку при обновлении. В противном случае это будет значение по умолчанию, потому что в useState оно имеет значение 0, поэтому при каждом рендеринге оно будет равно нулю. Вы можете сохранить значение activeTab в запросе, имени пути, локальном хранилище ... - person Ubeyt Demir; 18.08.2020
comment
Если вам не нужно иметь разные пути на каждой вкладке, лучше сохранять activeTab в запросе, потому что вы не будете повторно отображать весь компонент. Это рабочий пример. codeandbox.io/s/floral-rgb-6o55s?file = / src / App.js - person Ubeyt Demir; 18.08.2020
comment
Если вам нужно изменить путь на каждой вкладке, вы должны использовать этот компонент вкладки в каждом компоненте маршрутов, проверить имя пути и установить activeTab в useEffect - person Ubeyt Demir; 18.08.2020
comment
Спасибо. Можете ли вы удалить queryParams, просто хотел выглядеть примерно так localhost:3000/users. Спасибо - person Joseph; 18.08.2020
comment
Позвольте нам продолжить это обсуждение в чате. - person Ubeyt Demir; 18.08.2020
comment
Привет. Я ответил в чате - person Joseph; 18.08.2020
comment
Я ответил еще раз в чате - person Joseph; 18.08.2020
comment
Эй, не могли бы вы проверить это сейчас? - person Ubeyt Demir; 18.08.2020
comment
Хороший. Но вы заметили задержку в активном выделении меню? - person Joseph; 18.08.2020
comment
да, по умолчанию 0, и когда компонент получает реквизиты, он меняется на то, что когда-либо было, поэтому это совершенно нормально - person Ubeyt Demir; 18.08.2020