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';
interface ProjectListProps {
projects: Project[];
}
function ProjectList ({ projects }: ProjectListProps) {
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.