Lab 8: More Reusable Components
Objectives
- Create another reusable component
- Render the reusable component
Steps
Create another reusable component
Create the file
src\projects\ProjectCard.js
.Implement a
ProjectCard
as a function (not class) component that meets the following specifications:- Takes a
project
object as aprop
. - Cut the
<div className="card">...</div>
from theProjectList
component and use it as the JSX for theProjectCard
component. - Add a function to format the description to 60 characters and call it when rendering the description.
src\projects\ProjectCard.js
import { Project } from './Project';
import React from 'react';
import PropTypes from 'prop-types';
function formatDescription(description) {
return description.substring(0, 60) + '...';
}
function ProjectCard(props) {
const { project } = props;
return (
<div className="card">
<img src={project.imageUrl} alt={project.name} />
<section className="section dark">
<h5 className="strong">
<strong>{project.name}</strong>
</h5>
<p>{formatDescription(project.description)}</p>
<p>Budget : {project.budget.toLocaleString()}</p>
</section>
</div>
);
}
ProjectCard.propTypes = {
project: PropTypes.instanceOf(Project).isRequired,
};
export default ProjectCard;- Takes a
Render the reusable component
Open the file
src\projects\ProjectList.js
.Render the
ProjectCard
component passing it theproject
as aprop
.src\projects\ProjectList.js
import React from 'react';
import PropTypes from 'prop-types';
import { Project } from './Project';
+ import ProjectCard from './ProjectCard';
function ProjectList ({ projects }) {
const items = projects.map(project => (
<div key={project.id} className="cols-sm">
- <div className="card">
- <img src={project.imageUrl} alt={project.name} />
- <section className="section dark">
- <h5 className="strong">
- <strong>{project.name}</strong>
- </h5>
- <p>{project.description}</p>
- <p>Budget : {project.budget.toLocaleString()}</p>
- </section>
- </div>
+ <ProjectCard project={project}></ProjectCard>
</div>
));
return <div className="row">{items}</div>;
}
ProjectList.propTypes = {
projects: PropTypes.arrayOf(PropTypes.instanceOf(Project)).isRequired
};
export default ProjectList;Verify the project data displays correctly (it should still look the same as it did in the last lab except for the ... after the description) in the browser.