Условный рендеринг навигации в действии - PullRequest
0 голосов
/ 21 апреля 2019

Я создаю простое приложение реакции, используя React v16.7 и MDB (Material Design для Bootstrap). react-router-dom управляет моей системой маршрутизации. Я хочу, чтобы моя навигационная панель была прозрачной на домашней странице, а на других страницах - темной. Мой код выглядит следующим образом:

App.js

class App extends Component {

state = {
    collapseID: ""
}

toggleCollapse = collapseID => () =>
    this.setState(prevState => ({
        collapseID: prevState.collapseID !== collapseID ? collapseID : ""
    }));

closeCollapse = collapseID => () =>
    this.state.collapseID === collapseID && this.setState({ collapseID: "" });

render() {

    const overlay = (
        <div
            id="sidenav-overlay"
            style={{ backgroundColor: "transparent" }}
            onClick={this.toggleCollapse("mainNavbarCollapse")}
        />
    );

    const { collapseID } = this.state;

    return (
        <Router>
            <div className="flyout">
                <MDBNavbar color="elegant-color-dark" dark expand="md" fixed="top" scrolling transparent>
                    <MDBContainer>
                        <MDBNavbarBrand href="/">
                            <img src={Logo} height="50" alt="Logo" />
                        </MDBNavbarBrand>
                        <MDBNavbarToggler onClick={this.toggleCollapse("mainNavbarCollapse")} />
                        <MDBCollapse id="mainNavbarCollapse" isOpen={this.state.collapseID} navbar>
                            <MDBNavbarNav right>
                                <MDBNavItem>
                                    <MDBNavLink exact to="/" onClick={this.closeCollapse("mainNavbarCollapse")} >
                                        Home
                                    </MDBNavLink>
                                </MDBNavItem>
                                <MDBNavItem>
                                    <MDBNavLink onClick={this.closeCollapse("mainNavbarCollapse")} to="/about" >
                                        About
                                    </MDBNavLink>
                                </MDBNavItem>
                                <MDBNavItem>
                                    <MDBNavLink onClick={this.closeCollapse("mainNavbarCollapse")} to="/products">
                                        Products
                                    </MDBNavLink>
                                </MDBNavItem>
                                <MDBNavItem>
                                    <MDBNavLink onClick={this.closeCollapse("mainNavbarCollapse")} to="/trading">
                                        Trading
                                    </MDBNavLink>
                                </MDBNavItem>
                                <MDBNavItem>
                                    <MDBNavLink onClick={this.closeCollapse("mainNavbarCollapse")} to="/contact">
                                        Contact
                                    </MDBNavLink>
                                </MDBNavItem>
                            </MDBNavbarNav>
                        </MDBCollapse>
                    </MDBContainer>
                </MDBNavbar>
                {collapseID && overlay}
                <main style={{ marginTop: "0" }}>
                    <Routes />
                </main>
            </div>
        </Router>
    );
  }
}

export default App;

Routes.js

class Routes extends React.Component {
render() {
    return (
        <Switch>
            <Route exact path="/" component={Home} />
            <Route exact path="/about" component={About} />
            <Route exact path="/products" component={Products} />
            <Route exact path="/trading" component={Trading} />
            <Route exact path="/contact" component={Contact} />
            <Route
                render = {function () {
                    return <h1 className="text-center m-5">Page Not Found</h1>;
                }}
            />
        </Switch>
    );
  }
}

export default Routes;

В App.js, как вы можете видеть, <MDBNavbar color="elegant-color-dark" dark expand="md" fixed="top" scrolling transparent> имеет атрибут transparent. Я хочу это только на домашней странице. На других страницах это будет выглядеть так: <MDBNavbar color="elegant-color-dark" dark expand="md" fixed="top" scrolling>.

Я пытался использовать states и props, но безуспешно. Как я могу решить эту проблему?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2019

Вы можете использовать withRouter HOC от реагирующего маршрутизатора (https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/withRouter.md), чтобы получить location в реквизитах в NavBar, извлеченных в качестве отдельного компонента. Это будет более или менее давать это (минус реквизиты, отсутствующие в NavBar):

               const NavBar = ({location, collapseID, closeCollapse, toggleCollapse}) => <MDBNavbar color={location.pathname === "home"? "elegant-color-dark": ""} dark expand="md" fixed="top" scrolling transparent>
                    <MDBContainer>
                        <MDBNavbarBrand href="/">
                            <img src={Logo} height="50" alt="Logo" />
                        </MDBNavbarBrand>
                        <MDBNavbarToggler onClick={toggleCollapse("mainNavbarCollapse")} />
                        <MDBCollapse id="mainNavbarCollapse" isOpen={collapseID} navbar>
                            <MDBNavbarNav right>
                                <MDBNavItem>
                                    <MDBNavLink exact to="/" onClick={closeCollapse("mainNavbarCollapse")} >
                                        Home
                                    </MDBNavLink>
                                </MDBNavItem>
                                <MDBNavItem>
                                    <MDBNavLink onClick={closeCollapse("mainNavbarCollapse")} to="/about" >
                                        About
                                    </MDBNavLink>
                                </MDBNavItem>
                                <MDBNavItem>
                                    <MDBNavLink onClick={closeCollapse("mainNavbarCollapse")} to="/products">
                                        Products
                                    </MDBNavLink>
                                </MDBNavItem>
                                <MDBNavItem>
                                    <MDBNavLink onClick={closeCollapse("mainNavbarCollapse")} to="/trading">
                                        Trading
                                    </MDBNavLink>
                                </MDBNavItem>
                                <MDBNavItem>
                                    <MDBNavLink onClick={closeCollapse("mainNavbarCollapse")} to="/contact">
                                        Contact
                                    </MDBNavLink>
                                </MDBNavItem>
                            </MDBNavbarNav>
                        </MDBCollapse>
                    </MDBContainer>
                </MDBNavbar>

const NavBarWithRouter = withRouter(NavBar) 

class App extends Component {

state = {
    collapseID: ""
}

toggleCollapse = collapseID => () =>
    this.setState(prevState => ({
        collapseID: prevState.collapseID !== collapseID ? collapseID : ""
    }));

closeCollapse = collapseID => () =>
    this.state.collapseID === collapseID && this.setState({ collapseID: "" });

render() {

    const overlay = (
        <div
            id="sidenav-overlay"
            style={{ backgroundColor: "transparent" }}
            onClick={this.toggleCollapse("mainNavbarCollapse")}
        />
    );

    const { collapseID } = this.state;

    return (
        <Router>
            <div className="flyout">
                <NavBarWithRouter toggleCollapse={this. toggleCollapse} closeCollapse={this.closeCollapse} collapseID={collapseID} />
                {collapseID && overlay}
                <main style={{ marginTop: "0" }}>
                    <Routes />
                </main>
            </div>
        </Router>
    );
  }
}

export default App;

0 голосов
/ 21 апреля 2019

Вы можете использовать window.location.pathname и сопоставить его с маршрутом домашней страницы, чтобы условно пропустить реквизит.

Определите объект реквизита, который вы хотите передать, предпочтительно в componentDidMount из App.js:

let homePageProps = {};
if (window.location.pathname === "/") {
  homePageProps.transparent = "transparent";
}

Тогда распространите это.

<MDBNavbar color="elegant-color-dark" dark expand="md" fixed="top" scrolling {...homePageProps}>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...