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.tsx
.Implement a
ProjectCard
as a function (not class) component that meets the following specifications:- Takes a
project
object as aprop
.Note: If using TypeScript you will need to create an interface to define the properties that come into the component.
- 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.tsx
import { Project } from './Project';import React from 'react';function formatDescription(description: string): string {return description.substring(0, 60) + '...';}interface ProjectCardProps {project: Project;}function ProjectCard(props: ProjectCardProps) {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>);}export default ProjectCard;- Takes a
Render the reusable component
Open the file
src\projects\ProjectList.tsx
.Render the
ProjectCard
component passing it theproject
as aprop
.src\projects\ProjectList.tsx
import React from 'react';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>;}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.