Перенести верстку інтернет-магазину зі старого ванільного проекту у новий React-додаток (створений у ПР №14 за допомогою Vite). Навчитися декомпозувати UI (ділити інтерфейс на незалежні шматочки) та передавати дані через props.
components.Header.jsx.ProductCard.jsx з використанням props.ProductList.jsx.App.jsx вниз по дереву.Увага: Ми знаходимося у новому проекті на базі React + Vite. Ваш старий index.html залишився в минулому, ми переносимо його суть у компоненти.
src створіть папку components.style.css у папку src (замініть існуючий index.css) і переконайтеся, що він підключений в main.jsx.src/components/Header.jsx.class замінюється на className!
export function Header() {
return (
<header className="header">
<div className="logo">TechShop React</div>
<nav className="main-nav">
<ul>
<li>
<a href="#">Головна</a>
</li>
</ul>
</nav>
<div className="user-actions">
<button className="btn btn-cart">
Кошик <span>(0)</span>
</button>
</div>
</header>
);
}
src/components/ProductCard.jsx.props (або деструктурований об’єкт).
export function ProductCard({ title, price, image }) {
return (
<article className="product-card">
<img src={image} alt={title} style= />
<h3>{title}</h3>
<p className="price">{price} грн</p>
<button className="btn btn-buy">Купити</button>
</article>
);
}
App.jsx. Видаліть звідти демо-вміст Vite.products (як ви робили у ПР №9).Відобразіть Header та відрендерете список карток за допомогою .map():
import { Header } from "./components/Header";
import { ProductCard } from "./components/ProductCard";
const mockProducts = [
{
id: 1,
title: "Телефон",
price: 10000,
image: "https://via.placeholder.com/150",
},
{
id: 2,
title: "Ноутбук",
price: 30000,
image: "https://via.placeholder.com/150",
},
];
function App() {
return (
<div className="app-container">
<Header />
<main className="page-layout">
<h2>Популярні товари</h2>
{/* Контейнер сітки */}
<div className="products-grid">
{/* Рендеринг */}
{mockProducts.map((product) => (
<ProductCard
key={product.id}
title={product.title}
price={product.price}
image={product.image}
/>
))}
</div>
</main>
</div>
);
}
export default App;
npm run dev). Сайт повинен виглядати як старий, але тепер він розбитий на логічні React-компоненти.Migrate TechShop UI to React components.Проєкт перенесено на сучасний фреймворк. Замість “локшини” коду в одному HTML-файлі, ми маємо чітку структуру компонент = файл, що дозволяє легко перевикористовувати ProductCard будь-де.
className замість class у JSX-файлах React? На що перетворюється JSX під капотом під час збірки?key під час використання .map() у React (наприклад key={product.id}) і чому React видає “червону” помилку в консолі, якщо його не вказати?props. Чи може дочірній компонент (напр. ProductCard) самостійно змінити свою назву (властивість title), передану йому від батька?title, price, image у функції function ProductCard({ title, price, image })? Як цей синтаксис називається у JS?import) перед тим, як вставляти як <Header /> у файл App.jsx? Як JS дізнається їхнє місцезнаходження?