Интересно, есть ли способ, которым мы можем отображать маршруты на основе вложенных маршрутов для каждой вкладки.
Например, когда мы перейдем к
http://localhost:3000/base/a
http://localhost:3000/base/b
Мы ожидаем, что у нас будет base
компонент, который обеспечивает вид компоновки и основанный на том, что tab
мы щелкаем по нему, должен отобразить nested route
компонент.
Приведенный ниже пример работает без использования реакции-маршрутизатора для рендеринга компонента вкладки.
Ниже приведена конфигурация маршрута
<Route path={"/base:scope" } exact={true} { component: BaseComponent } />
НижеКомпонент будет отображать страницу с вкладками
import { Layout, Tabs, Row, Col } from 'antd';
import { Link, NavLink, Route, Switch } from 'react-router-dom';
export class BaseComponent extends React.Component {
public state = {
collapsed: false,
};
private onCollapse = collapsed => {
this.setState({ collapsed });
}
get tabs() {
const { collaborators, integration, settings, configuration, billing, tokens, referrals } = this.props;
return [
{
key: 'a',
tab: 'a',
component: ComponentA,
path: '/base/a',
},
{
key: 'b',
tab: 'b',
component: ComponentB,
path: '/base/b',
},
];
}
public componentWillReceiveProps(props) {
if (!_.isEqual(_.get(this.props, 'match.url'), _.get(props, 'match.url'))) {
this.setState({ key: _.get(props, 'match.url') });
}
}
public render() {
const { renderer, router } = this.context;
const { onLogOut, match, user, profile } = this.props;
return (
<React.Fragment>
<Header className={renderer.renderRule(styles.header, this.props)}>
<div className={renderer.renderRule(styles.title, this.props)}>
Account Settings
</div>
</Header>
<Content>
<div className={renderer.renderRule(styles.container, this.props)}>
<Tabs
animated={false}
defaultActiveKey={match.url}
onChange={key => router.history.push(key)}
className={`${renderer.renderRule(styles.tabs)}`}
>
{_.map(this.tabs, (record, index) => (
<TabPane
key={record.path}
className={renderer.renderRule(styles.pane)}
tab={<span>{record.tab}</span>}
>
{React.createElement(record.component, null, null)}
</TabPane>
))}
</Tabs>
</div>
</Content>
</React.Fragment >
);
}
}
Ожидание:
Мы хотим написать, чтобы быть более специфичным для реагирующего маршрутизатора, например
<Routes path={"/base"} exact={false} component={ComponentBase} />
<Routes path={"/base/a"} exact={true} component={ComponentBase} />
<Routes path={"/base/b"} exact={true} component={ComponentBase} />
Но в этом случае мы не знаем, как отобразить страницу, так как реагирующий маршрутизатор не обрабатывает страницу, поэтому мы замечаем вкладки, но не отображаем содержимое.
Вот модифицированный компонент без содержимого рендеринга, так как мы ожидаем, что Reaction-router выполнит рендеринг компонента.
export class BaseComponent extends React.Component {
public state = {
collapsed: false,
};
private onCollapse = collapsed => {
this.setState({ collapsed });
}
get tabs() {
const { collaborators, integration, settings, configuration, billing, tokens, referrals } = this.props;
return [
{
key: 'a',
tab: 'a',
path: '/base/a',
},
{
key: 'b',
tab: 'b',
path: '/base/b',
},
];
}
public componentWillReceiveProps(props) {
if (!_.isEqual(_.get(this.props, 'match.url'), _.get(props, 'match.url'))) {
this.setState({ key: _.get(props, 'match.url') });
}
}
public render() {
const { renderer, router } = this.context;
const { onLogOut, match, user, profile } = this.props;
return (
<React.Fragment>
<Header className={renderer.renderRule(styles.header, this.props)}>
<div className={renderer.renderRule(styles.title, this.props)}>
Account Settings
</div>
</Header>
<Content>
<div className={renderer.renderRule(styles.container, this.props)}>
<Tabs
animated={false}
defaultActiveKey={match.url}
onChange={key => router.history.push(key)}
className={`${renderer.renderRule(styles.tabs)}`}
>
{_.map(this.tabs, (record, index) => (
<TabPane
key={record.path}
className={renderer.renderRule(styles.pane)}
tab={<span>{record.tab}</span>}
>
</TabPane>
))}
</Tabs>
</div>
</Content>
</React.Fragment >
);
}
}