首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用react路由器和react-swipeable -views在选项卡更改时更改url

使用react路由器和react-swipeable -views在选项卡更改时更改url
EN

Stack Overflow用户
提问于 2020-11-03 15:16:58
回答 2查看 860关注 0票数 0

我有一个使用material-ui tabsreact-swipeable-views的react组件。我遇到的问题是,当切换标签时,显示的url不会改变,我注意到这是react-swipeable-views逻辑。我还想应用react-router,以便在保留react-swipeable-view逻辑的同时更改选项卡上的urls。

下面是我的代码的一部分,还有一些额外的细节:

代码语言:javascript
复制
import SwipeableViews from 'react-swipeable-views';
import Tabs from '@material-ui/core/Tabs';
import Tab from '@material-ui/core/Tab';

export default function TasksViewTabs(props) {
        const task = props.match.params.taskid
        const classes = useStyles();
        const [value, setValue] = React.useState(0);
    
        const handleChange = (event, newValue) => {
            console.log('new value', newValue)
            setValue(newValue);
        };
    
        const handleChangeIndex = (index) => {
            setValue(index);
        };
    
        console.log('value', value)
    
        return (
            <>
                    <Tabs value={value} onChange={handleChange} classes={{indicator: classes.indicator}}>
                        <Tab className={value === 0? classes.active_tabStyle : null} label="Runs" {...a11yProps(0)} />
                        <Tab className={value === 1? classes.active_tabStyle : null} label="Tasks" {...a11yProps(1)} />
                        <Tab className={value === 2? classes.active_tabStyle : null} label="Settings" {...a11yProps(2)} />
                    </Tabs>
                <SwipeableViews index={value} onChangeIndex={handleChangeIndex}>
                        <RunApp value={value} index={0} taskid={task} />
                        <TaskApp value={value} index={1} taskid={task} />
                        <SettingsApp value={value} index={2} taskid={task} />
                </SwipeableViews>
            </>
        );
    }

默认的url显示如下,当视图改变时它不会改变:localhost:3000/clusters/<task:id>,但是我有三个标签(runstaskssettings),它们控制着react-swipeable-views。我希望url在选项卡更改时分别显示为(localhost:3000/clusters/<task:id>/runslocalhost:3000/clusters/<task:id>/taskslocalhost:3000/clusters/<task:id>/settings)。

我如何才能做到这一点,并保留反应滑动逻辑?

谢谢

只是以防万一,url是从包含表的组件的history.push加载的。仅当单击表行时。

代码语言:javascript
复制
  rowClicked = (params) => {
    return (
      history.push({
        pathname: `/clusters/${params.data.md5_hash}`
      })
    )
  }

谢谢,我希望这对您有所帮助:)

EN

回答 2

Stack Overflow用户

发布于 2020-11-03 20:36:43

经过研究,我找到了这个问题的答案。用于路由更改的最好的react swipeable库是react-swipeable-routes,所以我从react-swipeable-views更改为react -swipeable-views,并应用了react路由的使用,它的效果非常好。

代码语言:javascript
复制
//import SwipeableViews from 'react-swipeable-views'; //don't use this
import SwipeableRoutes from "react-swipeable-routes"; //use this
import Tabs from '@material-ui/core/Tabs';
import Tab from '@material-ui/core/Tab';
export default function FullWidthTabs(props) {
    const task = props.match.params.taskid
    // const theme = useTheme();
    const classes = useStyles();
    const [value, setValue] = React.useState(0);

    const handleChange = (event, newValue) => {
        console.log('new value', newValue)
        setValue(newValue);
    };

    const handleChangeIndex = (index) => {
        setValue(index);
    };

    console.log('value', value)

    return (
        <>
            <HeaderContent>
                <Breadcrumbs />
                <ProfileMenu/>
            </HeaderContent>
            <Router> //use react-router
            <ToolBarContent>
//add routes in tabs
                <Tabs value={value} onChange={handleChange} classes={{indicator: classes.indicator}} style={{display: 'flex', justifyContent: 'space-between'}}>
                    <Tab to= {`clusters/${task}/runs`} className={value === 0? classes.active_tabStyle : null} label="Runs" {...a11yProps(0)}/>
                    <Tab to= {`clusters/${task}/tasks`} className={value === 1? classes.active_tabStyle : null} label="Tasks" {...a11yProps(1)}/>
                    <Tab to= {`clusters/${task}/settings`} className={value === 2? classes.active_tabStyle : null} label="Settings" {...a11yProps(2)}/>
                </Tabs>
            </ToolBarContent>
//the magic happens here
            <SwipeableRoutes  index={value} onChangeIndex={handleChangeIndex}>
            <Route path={`clusters/${task}/runs`} component={() => <RunApp value={value} index={0} taskid={task} />}/>
            <Route path={`clusters/${task}/tasks`} component={() => <TaskApp value={value} index={0} taskid={task} />}/>
            <Route path={`clusters/${task}/settings`} component={() => <SettingsApp value={value} index={0} taskid={task} />}/>
          </SwipeableRoutes>
          </Router>
        </>
    );
}
票数 1
EN

Stack Overflow用户

发布于 2020-11-03 16:07:27

假设您有一个Route来匹配路径"/clusters/:taskId“

代码语言:javascript
复制
<Route path="/clusters/:taskId" component={TasksViewTabs} />

则此路由可以匹配任何前缀为"/clusters/:taskId“的路由,即

  • "/clusters/:taskId/runs"
  • "/clusters/:taskId/tasks"
  • "/clusters/:taskId/settings"

您可以更新handleChangeIndex,以便在索引更改时也必须导航到匹配子路由。

创建选项卡/路由配置

代码语言:javascript
复制
const tabConfig = [
  {
    component: RunApp,
    label: 'Runs',
    link: 'runs',
  },
  {
    component: TaskApp,
    label: 'Tasks',
    link: 'tasks',
  },
  {
    component: SettingsApp,
    label: 'Settings',
    link: 'settings',
  },
];

更新渲染以将tabConfig映射到选项卡

代码语言:javascript
复制
return (
  <>
    <Tabs
      value={value}
      onChange={handleChange}
      classes={{ indicator: classes.indicator }}
    >
      {tabConfig.map(({ label }, i) => (
        <Tab
          key={i}
          className={value === i ? classes.active_tabStyle : null}
          label={label}
          { ...a11yProps(i) }
        />
      ))}
    </Tabs>
    <SwipeableViews
      index={value}
      onChangeIndex={handleChangeIndex}
    >
      {tabConfig.map(({ component: Component}, i) => (
        <Component key={i} value={value} index={i} taskid={task} />
      ))}
    </SwipeableViews>
  </>
);

更新handleChangeIndex以进行一些导航。

代码语言:javascript
复制
const { history, match } = props;
const { params: { taskid: task } } = match;

...

const handleChangeIndex = (index) => {
  setValue(index);
  history.replace(`/clusters/:taskId/${tabConfig[index].link}`);
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64658288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档