Я изучал React через JHipster , стандартный генератор для Angular / React и Spring-Boot.
Веб-приложение создается с использованием Typescript вместо Javascript, поэтому точка входа выглядит следующим образом.
app.tsx импортирует реагирующий компонент с именем AppRoutes , указанный ниже.
То, что я не мог понять из кода, это: компонент (или элемент?) Ports.tsx экспортирует переменную Routes . И файл называется rout.tsx .
Как это возможно, что код импортирует AppRoutes и он работает?
import 'react-toastify/dist/ReactToastify.css';
import './app.scss';
import React from 'react';
import { connect } from 'react-redux';
import { Card } from 'reactstrap';
import { HashRouter as Router } from 'react-router-dom';
import { ToastContainer, ToastPosition, toast } from 'react-toastify';
import { IRootState } from 'app/shared/reducers';
import { getSession } from 'app/shared/reducers/authentication';
import { getProfile } from 'app/shared/reducers/application-profile';
import Header from 'app/shared/layout/header/header';
import Footer from 'app/shared/layout/footer/footer';
import { hasAnyAuthority } from 'app/shared/auth/private-route';
import ErrorBoundary from 'app/shared/error/error-boundary';
import { AUTHORITIES } from 'app/config/constants';
import AppRoutes from 'app/routes';
export interface IAppProps extends StateProps, DispatchProps {}
export class App extends React.Component<IAppProps> {
componentDidMount() {
this.props.getSession();
this.props.getProfile();
}
render() {
const paddingTop = '60px';
return (
<Router>
<div className="app-container" style={{ paddingTop }}>
<ToastContainer
position={toast.POSITION.TOP_LEFT as ToastPosition}
className="toastify-container"
toastClassName="toastify-toast"
/>
<ErrorBoundary>
<Header
isAuthenticated={this.props.isAuthenticated}
isAdmin={this.props.isAdmin}
ribbonEnv={this.props.ribbonEnv}
isInProduction={this.props.isInProduction}
isSwaggerEnabled={this.props.isSwaggerEnabled}
accountName={this.props.accountName}
/>
</ErrorBoundary>
<div className="container-fluid view-container" id="app-view-container">
<Card className="jh-card">
<ErrorBoundary>
<AppRoutes />
</ErrorBoundary>
</Card>
<Footer />
</div>
</div>
</Router>
);
}
}
const mapStateToProps = ({ authentication, applicationProfile }: IRootState) => ({
isAuthenticated: authentication.isAuthenticated,
isAdmin: hasAnyAuthority(authentication.account.authorities, [AUTHORITIES.ADMIN]),
ribbonEnv: applicationProfile.ribbonEnv,
isInProduction: applicationProfile.inProduction,
isSwaggerEnabled: applicationProfile.isSwaggerEnabled,
accountName: authentication.account.firstName
});
const mapDispatchToProps = { getSession, getProfile };
type StateProps = ReturnType<typeof mapStateToProps>;
type DispatchProps = typeof mapDispatchToProps;
export default connect(
mapStateToProps,
mapDispatchToProps
)(App);
import React from 'react';
import { Switch } from 'react-router-dom';
import Loadable from 'react-loadable';
import Login from 'app/modules/login/login';
import Register from 'app/modules/account/register/register';
import Activate from 'app/modules/account/activate/activate';
import PasswordResetInit from 'app/modules/account/password-reset/init/password-reset-init';
import PasswordResetFinish from 'app/modules/account/password-reset/finish/password-reset-finish';
import Logout from 'app/modules/login/logout';
import Home from 'app/modules/home/home';
import Entities from 'app/entities';
import PrivateRoute from 'app/shared/auth/private-route';
import ErrorBoundaryRoute from 'app/shared/error/error-boundary-route';
import { AUTHORITIES } from 'app/config/constants';
// tslint:disable:space-in-parens
const Account = Loadable({
loader: () => import(/* webpackChunkName: "account" */ 'app/modules/account'),
loading: () => <div>loading ...</div>
});
const Admin = Loadable({
loader: () => import(/* webpackChunkName: "administration" */ 'app/modules/administration'),
loading: () => <div>loading ...</div>
});
// tslint:enable
const Routes = () => (
<div className="view-routes">
<ErrorBoundaryRoute path="/login" component={Login} />
<Switch>
<ErrorBoundaryRoute path="/logout" component={Logout} />
<ErrorBoundaryRoute path="/register" component={Register} />
<ErrorBoundaryRoute path="/activate/:key?" component={Activate} />
<ErrorBoundaryRoute path="/reset/request" component={PasswordResetInit} />
<ErrorBoundaryRoute path="/reset/finish/:key?" component={PasswordResetFinish} />
<PrivateRoute path="/admin" component={Admin} hasAnyAuthorities={[AUTHORITIES.ADMIN]} />
<PrivateRoute path="/account" component={Account} hasAnyAuthorities={[AUTHORITIES.ADMIN, AUTHORITIES.USER]} />
<PrivateRoute path="/entity" component={Entities} hasAnyAuthorities={[AUTHORITIES.USER]} />
<ErrorBoundaryRoute path="/" component={Home} />
</Switch>
</div>
);
export default Routes;