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.