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
$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
javascript programming-challenge recursion functional-programming react.js
$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.
add a comment |
$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
javascript programming-challenge recursion functional-programming react.js
$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.
add a comment |
$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
javascript programming-challenge recursion functional-programming react.js
$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
javascript programming-challenge recursion functional-programming react.js
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.
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
$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
$endgroup$
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
$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
$endgroup$
add a comment |
$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
$endgroup$
add a comment |
$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
$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
edited Feb 20 at 21:10
answered Feb 19 at 3:11
TakiTaki
3438
3438
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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