Render route conditional rendering. React router (hashrouter)












0















I'm using Hashrouter component of React Router to render my different routes in a React application. In order to avoid duplicating code, I created a couple of components called TopBar and Footer, as the name suggests it renders this two elements in the website. My problem comes when I want to add another route for an admin page which I DON'T WANT to have TopBar neither Footer. Since the path is matching with '/' it is obviously showing both components along with the AdminFrame component.



I have a couple of workaround solutions in mind but I would like to know if there's any plain and easy solution to this problem without changing any route in this structure:



<HashRouter>
<div>
<Route path="/" render={()=> (
<TopBar/>
)} />
<Route exact path="/" render={() => (
<Home />
)} />
<Route exact path="/contacto" render={() => (
<Contact />
)} />
<Route path="/" render={()=> (
<Footer/>
)} />
<Route path="/admin" render={()=> (
<AdminFrame/>
)} />
</div>
</HashRouter>


Any help appreciated.










share|improve this question



























    0















    I'm using Hashrouter component of React Router to render my different routes in a React application. In order to avoid duplicating code, I created a couple of components called TopBar and Footer, as the name suggests it renders this two elements in the website. My problem comes when I want to add another route for an admin page which I DON'T WANT to have TopBar neither Footer. Since the path is matching with '/' it is obviously showing both components along with the AdminFrame component.



    I have a couple of workaround solutions in mind but I would like to know if there's any plain and easy solution to this problem without changing any route in this structure:



    <HashRouter>
    <div>
    <Route path="/" render={()=> (
    <TopBar/>
    )} />
    <Route exact path="/" render={() => (
    <Home />
    )} />
    <Route exact path="/contacto" render={() => (
    <Contact />
    )} />
    <Route path="/" render={()=> (
    <Footer/>
    )} />
    <Route path="/admin" render={()=> (
    <AdminFrame/>
    )} />
    </div>
    </HashRouter>


    Any help appreciated.










    share|improve this question

























      0












      0








      0








      I'm using Hashrouter component of React Router to render my different routes in a React application. In order to avoid duplicating code, I created a couple of components called TopBar and Footer, as the name suggests it renders this two elements in the website. My problem comes when I want to add another route for an admin page which I DON'T WANT to have TopBar neither Footer. Since the path is matching with '/' it is obviously showing both components along with the AdminFrame component.



      I have a couple of workaround solutions in mind but I would like to know if there's any plain and easy solution to this problem without changing any route in this structure:



      <HashRouter>
      <div>
      <Route path="/" render={()=> (
      <TopBar/>
      )} />
      <Route exact path="/" render={() => (
      <Home />
      )} />
      <Route exact path="/contacto" render={() => (
      <Contact />
      )} />
      <Route path="/" render={()=> (
      <Footer/>
      )} />
      <Route path="/admin" render={()=> (
      <AdminFrame/>
      )} />
      </div>
      </HashRouter>


      Any help appreciated.










      share|improve this question














      I'm using Hashrouter component of React Router to render my different routes in a React application. In order to avoid duplicating code, I created a couple of components called TopBar and Footer, as the name suggests it renders this two elements in the website. My problem comes when I want to add another route for an admin page which I DON'T WANT to have TopBar neither Footer. Since the path is matching with '/' it is obviously showing both components along with the AdminFrame component.



      I have a couple of workaround solutions in mind but I would like to know if there's any plain and easy solution to this problem without changing any route in this structure:



      <HashRouter>
      <div>
      <Route path="/" render={()=> (
      <TopBar/>
      )} />
      <Route exact path="/" render={() => (
      <Home />
      )} />
      <Route exact path="/contacto" render={() => (
      <Contact />
      )} />
      <Route path="/" render={()=> (
      <Footer/>
      )} />
      <Route path="/admin" render={()=> (
      <AdminFrame/>
      )} />
      </div>
      </HashRouter>


      Any help appreciated.







      reactjs react-router react-router-dom






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 22 '18 at 23:49









      Robert VeraRobert Vera

      62




      62
























          1 Answer
          1






          active

          oldest

          votes


















          0














          If the Topbar and Footer is shown only on the homepage, you might consider just putting TopBar and Footer somewhere in the Home component instead. If you still need the Topbar and Footer i'd go with a Switch to organize the routes better:



          <HashRouter>
          <div>
          <Route exact path="/" render={()=> (
          <TopBar/>
          )} />
          <Route exact path="/" render={()=> (
          <Footer/>
          )} />
          <Switch>
          <Route path="/contacto" render={() => (
          <Contact />
          )} />
          <Route path="/admin" render={()=> (
          <AdminFrame/>
          )} />
          <Route path="/" render={() => (
          <Home />
          )} />
          </Switch>
          </div>
          </HashRouter>


          Switch renders only the first matching route.






          share|improve this answer



















          • 1





            Thanks Shawn, I finally changed the approach. placing TopBar and Footer in each component needed.

            – Robert Vera
            Jan 20 at 10:35











          • Awesome im glad to hear :D

            – Shawn Andrews
            Jan 20 at 17:59











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53439184%2frender-route-conditional-rendering-react-router-hashrouter%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          If the Topbar and Footer is shown only on the homepage, you might consider just putting TopBar and Footer somewhere in the Home component instead. If you still need the Topbar and Footer i'd go with a Switch to organize the routes better:



          <HashRouter>
          <div>
          <Route exact path="/" render={()=> (
          <TopBar/>
          )} />
          <Route exact path="/" render={()=> (
          <Footer/>
          )} />
          <Switch>
          <Route path="/contacto" render={() => (
          <Contact />
          )} />
          <Route path="/admin" render={()=> (
          <AdminFrame/>
          )} />
          <Route path="/" render={() => (
          <Home />
          )} />
          </Switch>
          </div>
          </HashRouter>


          Switch renders only the first matching route.






          share|improve this answer



















          • 1





            Thanks Shawn, I finally changed the approach. placing TopBar and Footer in each component needed.

            – Robert Vera
            Jan 20 at 10:35











          • Awesome im glad to hear :D

            – Shawn Andrews
            Jan 20 at 17:59
















          0














          If the Topbar and Footer is shown only on the homepage, you might consider just putting TopBar and Footer somewhere in the Home component instead. If you still need the Topbar and Footer i'd go with a Switch to organize the routes better:



          <HashRouter>
          <div>
          <Route exact path="/" render={()=> (
          <TopBar/>
          )} />
          <Route exact path="/" render={()=> (
          <Footer/>
          )} />
          <Switch>
          <Route path="/contacto" render={() => (
          <Contact />
          )} />
          <Route path="/admin" render={()=> (
          <AdminFrame/>
          )} />
          <Route path="/" render={() => (
          <Home />
          )} />
          </Switch>
          </div>
          </HashRouter>


          Switch renders only the first matching route.






          share|improve this answer



















          • 1





            Thanks Shawn, I finally changed the approach. placing TopBar and Footer in each component needed.

            – Robert Vera
            Jan 20 at 10:35











          • Awesome im glad to hear :D

            – Shawn Andrews
            Jan 20 at 17:59














          0












          0








          0







          If the Topbar and Footer is shown only on the homepage, you might consider just putting TopBar and Footer somewhere in the Home component instead. If you still need the Topbar and Footer i'd go with a Switch to organize the routes better:



          <HashRouter>
          <div>
          <Route exact path="/" render={()=> (
          <TopBar/>
          )} />
          <Route exact path="/" render={()=> (
          <Footer/>
          )} />
          <Switch>
          <Route path="/contacto" render={() => (
          <Contact />
          )} />
          <Route path="/admin" render={()=> (
          <AdminFrame/>
          )} />
          <Route path="/" render={() => (
          <Home />
          )} />
          </Switch>
          </div>
          </HashRouter>


          Switch renders only the first matching route.






          share|improve this answer













          If the Topbar and Footer is shown only on the homepage, you might consider just putting TopBar and Footer somewhere in the Home component instead. If you still need the Topbar and Footer i'd go with a Switch to organize the routes better:



          <HashRouter>
          <div>
          <Route exact path="/" render={()=> (
          <TopBar/>
          )} />
          <Route exact path="/" render={()=> (
          <Footer/>
          )} />
          <Switch>
          <Route path="/contacto" render={() => (
          <Contact />
          )} />
          <Route path="/admin" render={()=> (
          <AdminFrame/>
          )} />
          <Route path="/" render={() => (
          <Home />
          )} />
          </Switch>
          </div>
          </HashRouter>


          Switch renders only the first matching route.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 22 '18 at 23:59









          Shawn AndrewsShawn Andrews

          965617




          965617








          • 1





            Thanks Shawn, I finally changed the approach. placing TopBar and Footer in each component needed.

            – Robert Vera
            Jan 20 at 10:35











          • Awesome im glad to hear :D

            – Shawn Andrews
            Jan 20 at 17:59














          • 1





            Thanks Shawn, I finally changed the approach. placing TopBar and Footer in each component needed.

            – Robert Vera
            Jan 20 at 10:35











          • Awesome im glad to hear :D

            – Shawn Andrews
            Jan 20 at 17:59








          1




          1





          Thanks Shawn, I finally changed the approach. placing TopBar and Footer in each component needed.

          – Robert Vera
          Jan 20 at 10:35





          Thanks Shawn, I finally changed the approach. placing TopBar and Footer in each component needed.

          – Robert Vera
          Jan 20 at 10:35













          Awesome im glad to hear :D

          – Shawn Andrews
          Jan 20 at 17:59





          Awesome im glad to hear :D

          – Shawn Andrews
          Jan 20 at 17:59


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53439184%2frender-route-conditional-rendering-react-router-hashrouter%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Wiesbaden

          Marschland

          Dieringhausen