I have objects, some of these objects have different properties when the map renders empty elements for me https://ibb.co/BGnB0xL How can I remove these empty elements? maybe you need to use filter or something else?
JavaScript_Lessons_Objects.js
import React from "react";
import jsStyle from "./css/JavasCript_Lesson.module.css";
import {faDotCircle} from "@fortawesome/free-solid-svg-icons/faDotCircle";
const one = "Robby";
function JavaScriptLessonObject() {
return (
[
{
title: [<div><span className={jsStyle.title}>JSON OBJECTS</span></div>],
},
{
titleName: "JS Introduction",
iconName: faDotCircle,
description: [
<span className="yourClass">{one}</span>,
` advanced diverted domestic sex repeated bringing you old.`
],
},
{
titleName: "JS Where To",
iconName: faDotCircle,
description: [
<span className="yourClass">{one}</span>,
` advanced diverted domestic sex repeated bringing you old.1`
],
},
{
title: [<div><span className={jsStyle.title}>JSON OBJECTS</span></div>],
},
{
titleName: "JS Output",
iconName: faDotCircle,
description: [
<span className="yourClass">{one}</span>,
` advanced diverted domestic sex repeated bringing you old.`
],
},
]
);
}
export default JavaScriptLessonObject;
Lesson.jsx
import React from 'react';
import less from "./css/lesson.module.css";
import "./css/betaLesson.css";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Navbar } from "../../../Navbar/Navbar";
export class Lessons extends React.Component {
constructor(props) {
super(props);
this.state = {
indexDescription: 0,
}
}
render() {
const listLessons = this.props.lesson.map((item, index) => {
return (
<div key={index}>
<li style={{background: "#ffa50070"}}>
<div>
{item.title ? item.title : <p style={{background: 'indianred'}}>empty elements'</p>}
</div>
</li>
<li onClick={() => { this.setState({ indexDescription: index }) }}>
<div className={less.sidebar_list}>
<div>
<FontAwesomeIcon className={less.item_icon} icon={item.iconName} />
</div>
<div className={less.titleName}>
<div>
<p>{item.titleName}</p>
</div>
</div>
</div>
</li>
</div>
);
});
return (
<>
<div className="abc">
<div className={less.wrapper}>
<div>
<div className={less.sidebar}>
<div>
<ul>
{listLessons}
</ul>
</div>
</div>
</div>
</div>
</div>
</>
);
}
}
I think the problem is clear when I added to the heading object: [<div> <span className = {jsStyle.title}> JSON OBJECTS </span> </div>]
, I got empty paragraphs. I specially set the color orange to make it easier to navigate, besides, I added some code at the end. Please pay attention to this { !!item.title && <li>more code here</li>}
and here is the result https://ibb.co/JRKY2dx I need to get rid of Blank paragraphs
Advertisement
Answer
If you are simply trying to conditionally render the list item with the item title you don’t have to use a ternary.
Inline If with Logical && Operator
{item.title && (
<li style={{background: "#ffa50070"}}>
<div>
{item.title}
</div>
</li>
)}
And since it seems that titleName
also conditionally renders a list item
{item.titleName && (
<li onClick={() => { this.setState({ indexDescription: index }) }}>
<div className={less.sidebar_list}>
<div>
<FontAwesomeIcon className={less.item_icon} icon={item.iconName} />
</div>
<div className={less.titleName}>
<div>
<p>{item.titleName}</p>
</div>
</div>
</div>
</li>
)}
To also remove a bit of DOM noise (and not inject empty divs on the off-hand case that no list items are rendered), I also suggest returning the list items (li
) in a React Fragment
.
const listLessons = this.props.lesson.map((item, index) => {
return (
<Fragment key={index}>
</Fragment>
);
};