Тема: Реалізація стрічки новин або списку об’єктів. Робота з реальними даними, впровадження списків та ключів.
Мета: Реалізувати компонент “Стрічка новин” (News Feed) або “Список товарів”, використовуючи масив об’єктів (JSON). Навчитися використовувати метод map() для генерації інтерфейсу та зрозуміти важливість пропа key для алгоритму Reconciliation.
Технологічний стек: React, Vite, CSS Modules, JSON.
Post (або ProductCard), використовуючи базові атоми з Лабораторної №1 (Card, Button, Typography).App.jsx за допомогою методу масивів .map().key) для кожного елемента списку.Оскільки ми ще не підключаємо зовнішній API (це тема Лабораторної №6), ми створимо локальний файл з даними.
src створіть файл data.js.id.src/data.js:
export const postsData = [
{
id: 1,
author: "User123",
avatar: "https://placehold.co/50",
content: "Це мій перший пост у новій соціальній мережі! React - це круто.",
date: "2 год тому",
likes: 5,
},
{
id: 2,
author: "Admin",
avatar: "https://placehold.co/50",
content:
"Сьогодні ми вивчаємо Lists & Keys. Не забувайте про унікальні ключі!",
date: "4 год тому",
likes: 12,
},
{
id: 3,
author: "Student_KP",
avatar: "https://placehold.co/50",
content: "Лабораторна робота №2 виконується успішно.",
date: "1 день тому",
likes: 2,
},
];
Використаємо компонент Card з попередньої роботи як контейнер.
src/components/molecules/Post/Post.jsx та Post.module.css.props (author, content, date тощо).Post.jsx:
import Button from "../../atoms/Button/Button"; // З Лаб 1
import Card from "../Card/Card"; // З Лаб 1
import styles from "./Post.module.css";
const Post = ({ author, content, date, avatar }) => {
return (
<Card>
<div className={styles.header}>
<img src={avatar} alt="avatar" className={styles.avatar} />
<div className={styles.info}>
<span className={styles.author}>{author}</span>
<span className={styles.date}>{date}</span>
</div>
</div>
<p className={styles.content}>{content}</p>
<div className={styles.actions}>
{/* Використовуємо кнопку з Лаб 1 */}
<Button variant="secondary">Лайк</Button>
<Button variant="primary">Коментувати</Button>
</div>
</Card>
);
};
export default Post;
Post.module.css:
.header {
display: flex;
align-items: center;
margin-bottom: 12px;
}
.avatar {
border-radius: 50%;
margin-right: 10px;
}
.info {
display: flex;
flex-direction: column;
}
.author {
font-weight: bold;
}
.date {
font-size: 0.8em;
color: #666;
}
.content {
margin-bottom: 16px;
line-height: 1.5;
}
.actions {
display: flex;
gap: 10px;
border-top: 1px solid #eee;
padding-top: 10px;
}
Імпортуємо масив даних і використаємо метод .map().
App.jsx:
import Post from "./components/molecules/Post/Post";
import { postsData } from "./data";
import styles from "./App.module.css"; // Припустимо, що ви створили контейнер для стрічки
function App() {
return (
<div className={styles.appContainer}>
<h1 style=>Стрічка новин</h1>
<div className={styles.feed}>
{postsData.map((post) => (
<Post
key={post.id} // КРИТИЧНО ВАЖЛИВО!
author={post.author}
content={post.content}
date={post.date}
avatar={post.avatar}
/>
// Або можна використати spread operator: <Post key={post.id} {...post} />
))}
</div>
</div>
);
}
export default App;
key у списках React? (Відповідь пов’язана з ідентифікацією елементів при Reconciliation).index) як ключ? (Це може призвести до помилок при зміні порядку елементів або їх видаленні).for) та декларативним (map)?{...item}).lab_02.md винести фрагмент коду з App.jsx, де використовується метод .map().lab_02.md дати пояснення, що станеться, якщо видалити атрибут key (перевірте в консолі розробника).lab_02.md дати відповіді на контрольні питання.