React.js Nested Nav BarReact.js flood game implementationReact.js components for a golf appManipulate original DOM in React.jsCountdown timer in React.jsReact.JS functional paradigmSimple webpage on React.jsReact.js defaultMemoize as containerCreating table using React.jsFiltered table in React.jsRecursive react.js navigation menu

It grows, but water kills it

Redundant comparison & "if" before assignment

Can a college of swords bard use blade flourish on an OA from dissonant whispers?

Are Captain Marvel's powers affected by Thanos' actions in Infinity War

How should I address a possible mistake to co-authors in a submitted paper

Quasinilpotent , non-compact operators

How to cover method return statement in Apex Class?

Multiplicative persistence

System.QueryException unexpected token

putting logo on same line but after title, latex

Is there a way to get `mathscr' with lower case letters in pdfLaTeX?

Why should universal income be universal?

Recommended PCB layout understanding - ADM2572 datasheet

How do I delete all blank lines in a buffer?

How much character growth crosses the line into breaking the character

Lowest total scrabble score

How do apertures which seem too large to physically fit work?

Does IPv6 have similar concept of network mask?

Pre-mixing cryogenic fuels and using only one fuel tank

What is the evidence for the "tyranny of the majority problem" in a direct democracy context?

What is the highest possible scrabble score for placing a single tile

What exactly color does ozone gas have?

What is going on with 'gets(stdin)' on the site coderbyte?

Store Credit Card Information in Password Manager?



React.js Nested Nav Bar


React.js flood game implementationReact.js components for a golf appManipulate original DOM in React.jsCountdown timer in React.jsReact.JS functional paradigmSimple webpage on React.jsReact.js defaultMemoize as containerCreating table using React.jsFiltered table in React.jsRecursive react.js navigation menu













3












$begingroup$


This was written for a coding challenge for a company I recently starting working for. I'm looking for any suggestions on how to clean up the code, as well as any issues anyone thinks may occur as it is written now. Fairly new to React.js, always looking to improve.



Currently the data is passed through the app component where I render the Nav Container (functional stateless component). The Nav container creates the classNames and passes data + classNames to the NestedNav that I've put below.



It started to feel a little sloppy while mapping twice below the render, not sure if that's a problem?



The data object example shows how I modeled my data. This example has a parent with children that also have children.



  • The parentClass is for the outer parent.

  • The nestedParentClass is for the children of the outer parent.

  • The childClass is reserved for any children of the nestedParent.

export const data = [

id: 1,
icon: <FontAwesomeIcon className='i' icon=faHeartbeat />,
title: 'SAFETY',
children: [
title: 'Reporting', children: [
id: 11, title: 'I-21 Injury Reporting', url: '/safety/report',
id: 12, title: 'ASAP Reporting', url: '/safety/asap-report',
id: 13, title: 'General ASAP Information', url: '/safety/general',
id: 14, title: 'Flight Attendant Incident Report', url: '/safety/flight-attendant-incident',
],
title: 'Agriculture and Customs', children: [
id: 15, title: 'Product Safety Data Search', url: '/safety/data-search'],
id: 16, title: 'Known Crewmember', url: '/safety/known-cremember',
id: 17, title: 'Product Safety Data Search', url: '/safety/data-search',
],
,
]


class NestedNav extends Component 
constructor(props)
super(props)
this.state =
selected: '',
nestSelect: '',
children: [],
active: '',



handleClick = (title) =>
this.setState(
selected: '',
nestSelect: '',
children: [],
active: '',
)


render()

const data, parentClass, nestedParentClass = this.props
const renderedChildElements = this.state.children
const active = this.state.active === 'true' ? 'true' : ''

const mappedChildren = (child, title) =>
let childElement
if(child)
childElement = child.map((child, i) => <li
key=i
id=child.id
className=nestedParentClass + (this.state.nestSelect === child.title ? 'nest-selected' : '')
url=child.url><Link to='/'>child.title</Link>
child.children ?
<FontAwesomeIcon
onClick=() => mappedChildren(child.children, this.state.select)
className='i button'
icon=faArrowCircleDown /> : null
</li>)
this.setState(
selected: title,
children: childElement,
active: 'true',
)

return ''


const navListItems = data.map((collection, i) => <li
key=i
id=collection.id
className=parentClass + (this.state.selected === collection.title ? 'selected' : '')
url=collection.url><i onClick=this.handleClick>collection.icon</i><Link to='/'><span>collection.title</span></Link>
collection.children ?
<FontAwesomeIcon
onClick=() => mappedChildren(collection.children, collection.title)
className='i button'
icon=faArrowCircleRight /> : null
</li>)

return (
<div className='nested-nav'>
<div className='container-two-' + active>
<h2>this.state.selected</h2>
this.state.children
</div>
<div className='container-one'>navListItems</div>
</div>
)


export default NestedNav









share|improve this question











$endgroup$




bumped to the homepage by Community 2 mins ago


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.



















    3












    $begingroup$


    This was written for a coding challenge for a company I recently starting working for. I'm looking for any suggestions on how to clean up the code, as well as any issues anyone thinks may occur as it is written now. Fairly new to React.js, always looking to improve.



    Currently the data is passed through the app component where I render the Nav Container (functional stateless component). The Nav container creates the classNames and passes data + classNames to the NestedNav that I've put below.



    It started to feel a little sloppy while mapping twice below the render, not sure if that's a problem?



    The data object example shows how I modeled my data. This example has a parent with children that also have children.



    • The parentClass is for the outer parent.

    • The nestedParentClass is for the children of the outer parent.

    • The childClass is reserved for any children of the nestedParent.

    export const data = [

    id: 1,
    icon: <FontAwesomeIcon className='i' icon=faHeartbeat />,
    title: 'SAFETY',
    children: [
    title: 'Reporting', children: [
    id: 11, title: 'I-21 Injury Reporting', url: '/safety/report',
    id: 12, title: 'ASAP Reporting', url: '/safety/asap-report',
    id: 13, title: 'General ASAP Information', url: '/safety/general',
    id: 14, title: 'Flight Attendant Incident Report', url: '/safety/flight-attendant-incident',
    ],
    title: 'Agriculture and Customs', children: [
    id: 15, title: 'Product Safety Data Search', url: '/safety/data-search'],
    id: 16, title: 'Known Crewmember', url: '/safety/known-cremember',
    id: 17, title: 'Product Safety Data Search', url: '/safety/data-search',
    ],
    ,
    ]


    class NestedNav extends Component 
    constructor(props)
    super(props)
    this.state =
    selected: '',
    nestSelect: '',
    children: [],
    active: '',



    handleClick = (title) =>
    this.setState(
    selected: '',
    nestSelect: '',
    children: [],
    active: '',
    )


    render()

    const data, parentClass, nestedParentClass = this.props
    const renderedChildElements = this.state.children
    const active = this.state.active === 'true' ? 'true' : ''

    const mappedChildren = (child, title) =>
    let childElement
    if(child)
    childElement = child.map((child, i) => <li
    key=i
    id=child.id
    className=nestedParentClass + (this.state.nestSelect === child.title ? 'nest-selected' : '')
    url=child.url><Link to='/'>child.title</Link>
    child.children ?
    <FontAwesomeIcon
    onClick=() => mappedChildren(child.children, this.state.select)
    className='i button'
    icon=faArrowCircleDown /> : null
    </li>)
    this.setState(
    selected: title,
    children: childElement,
    active: 'true',
    )

    return ''


    const navListItems = data.map((collection, i) => <li
    key=i
    id=collection.id
    className=parentClass + (this.state.selected === collection.title ? 'selected' : '')
    url=collection.url><i onClick=this.handleClick>collection.icon</i><Link to='/'><span>collection.title</span></Link>
    collection.children ?
    <FontAwesomeIcon
    onClick=() => mappedChildren(collection.children, collection.title)
    className='i button'
    icon=faArrowCircleRight /> : null
    </li>)

    return (
    <div className='nested-nav'>
    <div className='container-two-' + active>
    <h2>this.state.selected</h2>
    this.state.children
    </div>
    <div className='container-one'>navListItems</div>
    </div>
    )


    export default NestedNav









    share|improve this question











    $endgroup$




    bumped to the homepage by Community 2 mins ago


    This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.

















      3












      3








      3





      $begingroup$


      This was written for a coding challenge for a company I recently starting working for. I'm looking for any suggestions on how to clean up the code, as well as any issues anyone thinks may occur as it is written now. Fairly new to React.js, always looking to improve.



      Currently the data is passed through the app component where I render the Nav Container (functional stateless component). The Nav container creates the classNames and passes data + classNames to the NestedNav that I've put below.



      It started to feel a little sloppy while mapping twice below the render, not sure if that's a problem?



      The data object example shows how I modeled my data. This example has a parent with children that also have children.



      • The parentClass is for the outer parent.

      • The nestedParentClass is for the children of the outer parent.

      • The childClass is reserved for any children of the nestedParent.

      export const data = [

      id: 1,
      icon: <FontAwesomeIcon className='i' icon=faHeartbeat />,
      title: 'SAFETY',
      children: [
      title: 'Reporting', children: [
      id: 11, title: 'I-21 Injury Reporting', url: '/safety/report',
      id: 12, title: 'ASAP Reporting', url: '/safety/asap-report',
      id: 13, title: 'General ASAP Information', url: '/safety/general',
      id: 14, title: 'Flight Attendant Incident Report', url: '/safety/flight-attendant-incident',
      ],
      title: 'Agriculture and Customs', children: [
      id: 15, title: 'Product Safety Data Search', url: '/safety/data-search'],
      id: 16, title: 'Known Crewmember', url: '/safety/known-cremember',
      id: 17, title: 'Product Safety Data Search', url: '/safety/data-search',
      ],
      ,
      ]


      class NestedNav extends Component 
      constructor(props)
      super(props)
      this.state =
      selected: '',
      nestSelect: '',
      children: [],
      active: '',



      handleClick = (title) =>
      this.setState(
      selected: '',
      nestSelect: '',
      children: [],
      active: '',
      )


      render()

      const data, parentClass, nestedParentClass = this.props
      const renderedChildElements = this.state.children
      const active = this.state.active === 'true' ? 'true' : ''

      const mappedChildren = (child, title) =>
      let childElement
      if(child)
      childElement = child.map((child, i) => <li
      key=i
      id=child.id
      className=nestedParentClass + (this.state.nestSelect === child.title ? 'nest-selected' : '')
      url=child.url><Link to='/'>child.title</Link>
      child.children ?
      <FontAwesomeIcon
      onClick=() => mappedChildren(child.children, this.state.select)
      className='i button'
      icon=faArrowCircleDown /> : null
      </li>)
      this.setState(
      selected: title,
      children: childElement,
      active: 'true',
      )

      return ''


      const navListItems = data.map((collection, i) => <li
      key=i
      id=collection.id
      className=parentClass + (this.state.selected === collection.title ? 'selected' : '')
      url=collection.url><i onClick=this.handleClick>collection.icon</i><Link to='/'><span>collection.title</span></Link>
      collection.children ?
      <FontAwesomeIcon
      onClick=() => mappedChildren(collection.children, collection.title)
      className='i button'
      icon=faArrowCircleRight /> : null
      </li>)

      return (
      <div className='nested-nav'>
      <div className='container-two-' + active>
      <h2>this.state.selected</h2>
      this.state.children
      </div>
      <div className='container-one'>navListItems</div>
      </div>
      )


      export default NestedNav









      share|improve this question











      $endgroup$




      This was written for a coding challenge for a company I recently starting working for. I'm looking for any suggestions on how to clean up the code, as well as any issues anyone thinks may occur as it is written now. Fairly new to React.js, always looking to improve.



      Currently the data is passed through the app component where I render the Nav Container (functional stateless component). The Nav container creates the classNames and passes data + classNames to the NestedNav that I've put below.



      It started to feel a little sloppy while mapping twice below the render, not sure if that's a problem?



      The data object example shows how I modeled my data. This example has a parent with children that also have children.



      • The parentClass is for the outer parent.

      • The nestedParentClass is for the children of the outer parent.

      • The childClass is reserved for any children of the nestedParent.

      export const data = [

      id: 1,
      icon: <FontAwesomeIcon className='i' icon=faHeartbeat />,
      title: 'SAFETY',
      children: [
      title: 'Reporting', children: [
      id: 11, title: 'I-21 Injury Reporting', url: '/safety/report',
      id: 12, title: 'ASAP Reporting', url: '/safety/asap-report',
      id: 13, title: 'General ASAP Information', url: '/safety/general',
      id: 14, title: 'Flight Attendant Incident Report', url: '/safety/flight-attendant-incident',
      ],
      title: 'Agriculture and Customs', children: [
      id: 15, title: 'Product Safety Data Search', url: '/safety/data-search'],
      id: 16, title: 'Known Crewmember', url: '/safety/known-cremember',
      id: 17, title: 'Product Safety Data Search', url: '/safety/data-search',
      ],
      ,
      ]


      class NestedNav extends Component 
      constructor(props)
      super(props)
      this.state =
      selected: '',
      nestSelect: '',
      children: [],
      active: '',



      handleClick = (title) =>
      this.setState(
      selected: '',
      nestSelect: '',
      children: [],
      active: '',
      )


      render()

      const data, parentClass, nestedParentClass = this.props
      const renderedChildElements = this.state.children
      const active = this.state.active === 'true' ? 'true' : ''

      const mappedChildren = (child, title) =>
      let childElement
      if(child)
      childElement = child.map((child, i) => <li
      key=i
      id=child.id
      className=nestedParentClass + (this.state.nestSelect === child.title ? 'nest-selected' : '')
      url=child.url><Link to='/'>child.title</Link>
      child.children ?
      <FontAwesomeIcon
      onClick=() => mappedChildren(child.children, this.state.select)
      className='i button'
      icon=faArrowCircleDown /> : null
      </li>)
      this.setState(
      selected: title,
      children: childElement,
      active: 'true',
      )

      return ''


      const navListItems = data.map((collection, i) => <li
      key=i
      id=collection.id
      className=parentClass + (this.state.selected === collection.title ? 'selected' : '')
      url=collection.url><i onClick=this.handleClick>collection.icon</i><Link to='/'><span>collection.title</span></Link>
      collection.children ?
      <FontAwesomeIcon
      onClick=() => mappedChildren(collection.children, collection.title)
      className='i button'
      icon=faArrowCircleRight /> : null
      </li>)

      return (
      <div className='nested-nav'>
      <div className='container-two-' + active>
      <h2>this.state.selected</h2>
      this.state.children
      </div>
      <div className='container-one'>navListItems</div>
      </div>
      )


      export default NestedNav






      javascript programming-challenge recursion functional-programming react.js






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Feb 18 at 22:39









      Stephen Rauch

      3,77061630




      3,77061630










      asked Feb 18 at 21:18









      PnskPnsk

      162




      162





      bumped to the homepage by Community 2 mins ago


      This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.







      bumped to the homepage by Community 2 mins ago


      This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.






















          1 Answer
          1






          active

          oldest

          votes


















          0












          $begingroup$

          it's clear and readable but i would like to point out some things :



          Avoid using functions inside Render()




          A function in the render method will be created each render which is a
          slight performance hit. t's also messy if you put them in the render, which is a much > bigger reason




          Use the child.id instead of key as index when you map through an array in render() because Index as a key is an anti-pattern.



          Keep your code as DRY as possible, the initialState can be an object outside the class instead of writing it twice or more, especially if it's a big object.



          Optional : use Destructuring assignment to indicate which keys you will use in the function.



          const initialState = 
          selected: '',
          nestSelect: '',
          children: [],
          active: '',


          class NestedNav extends Component
          constructor(props)
          super(props)
          this.state = initialState


          handleClick = title =>
          this.setState( ...initialState )


          mappedChildren = (child, selectedTitle) =>
          const nestedParentClass = this.props
          let childElement

          if (child)
          childElement = child.map(( id, title, children, url ) => <li
          key=id
          id=id
          className=nestedParentClass + (this.state.nestSelect === title ? 'nest-selected' : '')
          url=url><Link to='/'>title</Link>
          children ?
          <FontAwesomeIcon
          onClick=() => this.mappedChildren(children, this.state.select)
          className='i button'
          icon=faArrowCircleDown /> : null
          </li>)
          this.setState(
          selected: selectedTitle,
          children: childElement,
          active: 'true',
          )

          return ''


          navListItems = data => data.map(( id, url, children, title, icon ) =>
          const parentClass = this.props
          return (<li
          key=id
          id=id
          className=parentClass + (this.state.selected === title ? 'selected' : '')
          url=url><i onClick=this.handleClick>icon</i><Link to='/'><span>title</span></Link>
          children ?
          <FontAwesomeIcon
          onClick=() => this.mappedChildren(children, title)
          className='i button'
          icon=faArrowCircleRight /> : null
          </li>)
          );

          render()
          const data = this.props
          const active = this.state.active === 'true' ? 'true' : ''

          return (
          <div className='nested-nav'>
          <div className='container-two-' + active>
          <h2>this.state.selected</h2>
          this.state.children
          </div>
          <div className='container-one'>this.navListItems(data)</div>
          </div>
          )


          export default NestedNav





          share|improve this answer











          $endgroup$












            Your Answer





            StackExchange.ifUsing("editor", function ()
            return StackExchange.using("mathjaxEditing", function ()
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            );
            );
            , "mathjax-editing");

            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: "196"
            ;
            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: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            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%2fcodereview.stackexchange.com%2fquestions%2f213754%2freact-js-nested-nav-bar%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












            $begingroup$

            it's clear and readable but i would like to point out some things :



            Avoid using functions inside Render()




            A function in the render method will be created each render which is a
            slight performance hit. t's also messy if you put them in the render, which is a much > bigger reason




            Use the child.id instead of key as index when you map through an array in render() because Index as a key is an anti-pattern.



            Keep your code as DRY as possible, the initialState can be an object outside the class instead of writing it twice or more, especially if it's a big object.



            Optional : use Destructuring assignment to indicate which keys you will use in the function.



            const initialState = 
            selected: '',
            nestSelect: '',
            children: [],
            active: '',


            class NestedNav extends Component
            constructor(props)
            super(props)
            this.state = initialState


            handleClick = title =>
            this.setState( ...initialState )


            mappedChildren = (child, selectedTitle) =>
            const nestedParentClass = this.props
            let childElement

            if (child)
            childElement = child.map(( id, title, children, url ) => <li
            key=id
            id=id
            className=nestedParentClass + (this.state.nestSelect === title ? 'nest-selected' : '')
            url=url><Link to='/'>title</Link>
            children ?
            <FontAwesomeIcon
            onClick=() => this.mappedChildren(children, this.state.select)
            className='i button'
            icon=faArrowCircleDown /> : null
            </li>)
            this.setState(
            selected: selectedTitle,
            children: childElement,
            active: 'true',
            )

            return ''


            navListItems = data => data.map(( id, url, children, title, icon ) =>
            const parentClass = this.props
            return (<li
            key=id
            id=id
            className=parentClass + (this.state.selected === title ? 'selected' : '')
            url=url><i onClick=this.handleClick>icon</i><Link to='/'><span>title</span></Link>
            children ?
            <FontAwesomeIcon
            onClick=() => this.mappedChildren(children, title)
            className='i button'
            icon=faArrowCircleRight /> : null
            </li>)
            );

            render()
            const data = this.props
            const active = this.state.active === 'true' ? 'true' : ''

            return (
            <div className='nested-nav'>
            <div className='container-two-' + active>
            <h2>this.state.selected</h2>
            this.state.children
            </div>
            <div className='container-one'>this.navListItems(data)</div>
            </div>
            )


            export default NestedNav





            share|improve this answer











            $endgroup$

















              0












              $begingroup$

              it's clear and readable but i would like to point out some things :



              Avoid using functions inside Render()




              A function in the render method will be created each render which is a
              slight performance hit. t's also messy if you put them in the render, which is a much > bigger reason




              Use the child.id instead of key as index when you map through an array in render() because Index as a key is an anti-pattern.



              Keep your code as DRY as possible, the initialState can be an object outside the class instead of writing it twice or more, especially if it's a big object.



              Optional : use Destructuring assignment to indicate which keys you will use in the function.



              const initialState = 
              selected: '',
              nestSelect: '',
              children: [],
              active: '',


              class NestedNav extends Component
              constructor(props)
              super(props)
              this.state = initialState


              handleClick = title =>
              this.setState( ...initialState )


              mappedChildren = (child, selectedTitle) =>
              const nestedParentClass = this.props
              let childElement

              if (child)
              childElement = child.map(( id, title, children, url ) => <li
              key=id
              id=id
              className=nestedParentClass + (this.state.nestSelect === title ? 'nest-selected' : '')
              url=url><Link to='/'>title</Link>
              children ?
              <FontAwesomeIcon
              onClick=() => this.mappedChildren(children, this.state.select)
              className='i button'
              icon=faArrowCircleDown /> : null
              </li>)
              this.setState(
              selected: selectedTitle,
              children: childElement,
              active: 'true',
              )

              return ''


              navListItems = data => data.map(( id, url, children, title, icon ) =>
              const parentClass = this.props
              return (<li
              key=id
              id=id
              className=parentClass + (this.state.selected === title ? 'selected' : '')
              url=url><i onClick=this.handleClick>icon</i><Link to='/'><span>title</span></Link>
              children ?
              <FontAwesomeIcon
              onClick=() => this.mappedChildren(children, title)
              className='i button'
              icon=faArrowCircleRight /> : null
              </li>)
              );

              render()
              const data = this.props
              const active = this.state.active === 'true' ? 'true' : ''

              return (
              <div className='nested-nav'>
              <div className='container-two-' + active>
              <h2>this.state.selected</h2>
              this.state.children
              </div>
              <div className='container-one'>this.navListItems(data)</div>
              </div>
              )


              export default NestedNav





              share|improve this answer











              $endgroup$















                0












                0








                0





                $begingroup$

                it's clear and readable but i would like to point out some things :



                Avoid using functions inside Render()




                A function in the render method will be created each render which is a
                slight performance hit. t's also messy if you put them in the render, which is a much > bigger reason




                Use the child.id instead of key as index when you map through an array in render() because Index as a key is an anti-pattern.



                Keep your code as DRY as possible, the initialState can be an object outside the class instead of writing it twice or more, especially if it's a big object.



                Optional : use Destructuring assignment to indicate which keys you will use in the function.



                const initialState = 
                selected: '',
                nestSelect: '',
                children: [],
                active: '',


                class NestedNav extends Component
                constructor(props)
                super(props)
                this.state = initialState


                handleClick = title =>
                this.setState( ...initialState )


                mappedChildren = (child, selectedTitle) =>
                const nestedParentClass = this.props
                let childElement

                if (child)
                childElement = child.map(( id, title, children, url ) => <li
                key=id
                id=id
                className=nestedParentClass + (this.state.nestSelect === title ? 'nest-selected' : '')
                url=url><Link to='/'>title</Link>
                children ?
                <FontAwesomeIcon
                onClick=() => this.mappedChildren(children, this.state.select)
                className='i button'
                icon=faArrowCircleDown /> : null
                </li>)
                this.setState(
                selected: selectedTitle,
                children: childElement,
                active: 'true',
                )

                return ''


                navListItems = data => data.map(( id, url, children, title, icon ) =>
                const parentClass = this.props
                return (<li
                key=id
                id=id
                className=parentClass + (this.state.selected === title ? 'selected' : '')
                url=url><i onClick=this.handleClick>icon</i><Link to='/'><span>title</span></Link>
                children ?
                <FontAwesomeIcon
                onClick=() => this.mappedChildren(children, title)
                className='i button'
                icon=faArrowCircleRight /> : null
                </li>)
                );

                render()
                const data = this.props
                const active = this.state.active === 'true' ? 'true' : ''

                return (
                <div className='nested-nav'>
                <div className='container-two-' + active>
                <h2>this.state.selected</h2>
                this.state.children
                </div>
                <div className='container-one'>this.navListItems(data)</div>
                </div>
                )


                export default NestedNav





                share|improve this answer











                $endgroup$



                it's clear and readable but i would like to point out some things :



                Avoid using functions inside Render()




                A function in the render method will be created each render which is a
                slight performance hit. t's also messy if you put them in the render, which is a much > bigger reason




                Use the child.id instead of key as index when you map through an array in render() because Index as a key is an anti-pattern.



                Keep your code as DRY as possible, the initialState can be an object outside the class instead of writing it twice or more, especially if it's a big object.



                Optional : use Destructuring assignment to indicate which keys you will use in the function.



                const initialState = 
                selected: '',
                nestSelect: '',
                children: [],
                active: '',


                class NestedNav extends Component
                constructor(props)
                super(props)
                this.state = initialState


                handleClick = title =>
                this.setState( ...initialState )


                mappedChildren = (child, selectedTitle) =>
                const nestedParentClass = this.props
                let childElement

                if (child)
                childElement = child.map(( id, title, children, url ) => <li
                key=id
                id=id
                className=nestedParentClass + (this.state.nestSelect === title ? 'nest-selected' : '')
                url=url><Link to='/'>title</Link>
                children ?
                <FontAwesomeIcon
                onClick=() => this.mappedChildren(children, this.state.select)
                className='i button'
                icon=faArrowCircleDown /> : null
                </li>)
                this.setState(
                selected: selectedTitle,
                children: childElement,
                active: 'true',
                )

                return ''


                navListItems = data => data.map(( id, url, children, title, icon ) =>
                const parentClass = this.props
                return (<li
                key=id
                id=id
                className=parentClass + (this.state.selected === title ? 'selected' : '')
                url=url><i onClick=this.handleClick>icon</i><Link to='/'><span>title</span></Link>
                children ?
                <FontAwesomeIcon
                onClick=() => this.mappedChildren(children, title)
                className='i button'
                icon=faArrowCircleRight /> : null
                </li>)
                );

                render()
                const data = this.props
                const active = this.state.active === 'true' ? 'true' : ''

                return (
                <div className='nested-nav'>
                <div className='container-two-' + active>
                <h2>this.state.selected</h2>
                this.state.children
                </div>
                <div className='container-one'>this.navListItems(data)</div>
                </div>
                )


                export default NestedNav






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Feb 20 at 21:10

























                answered Feb 19 at 3:11









                TakiTaki

                3438




                3438



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Code Review Stack Exchange!


                    • 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.

                    Use MathJax to format equations. MathJax reference.


                    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%2fcodereview.stackexchange.com%2fquestions%2f213754%2freact-js-nested-nav-bar%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

                    बाताम इन्हें भी देखें सन्दर्भ दिक्चालन सूची1°05′00″N 104°02′0″E / 1.08333°N 104.03333°E / 1.08333; 104.033331°05′00″N 104°02′0″E / 1.08333°N 104.03333°E / 1.08333; 104.03333

                    Why is the 'in' operator throwing an error with a string literal instead of logging false?Why can't I use switch statement on a String?Python join: why is it string.join(list) instead of list.join(string)?Multiline String Literal in C#Why does comparing strings using either '==' or 'is' sometimes produce a different result?How to initialize an array's length in javascript?How can I print literal curly-brace characters in python string and also use .format on it?Why does ++[[]][+[]]+[+[]] return the string “10”?Why is char[] preferred over String for passwords?Why does this code using random strings print “hello world”?jQuery.inArray(), how to use it right?

                    How can we generalize the fact of finite dimensional vector space to an infinte dimensional case?$k[x]$-module and cyclic module over a finite dimensional vector spaceSubspace of a finite dimensional space is finite dimensionalIf V is an infinite-dimensional vector space, and S is an infinite-dimensional subspace of V, must the dimension of V/S be finite? ExplainWhy is an infinite dimensional space so different than a finite dimensional one?base for finite dimensional vector space is not infinite dimensional vector space?Any finite-dimensional vector space is the dual space of anotherHaving Trouble Understanding Meaning Of A Finite-Dimensional Vector SpaceProve that “Every subspaces of a finite-dimensional vector space is finite-dimensional”Ring as a finite dimensional Vector space over a field KQuestion regarding basis and dimension