Собери составной
ProductCardиз трёх маленьких компонентов:Title,Price,BuyButton. Логика — в пропсах, без состояния.
Композиция компонентов — основа React. Мелкие части проще тестировать и переиспользовать, а из них удобно собирать крупные.
Title, Price, BuyButton.ProductCard.Отобрази карточку товара с заголовком, ценой и кнопкой.
// … existing code …
Финальный результат должен быть таким:
// … existing code …
<article className="product-card">
<Title>{title}</Title>
<Price value={price} currency={currency} />
<BuyButton onClick={onBuy} />
</article>import React from 'react';
import './styles.css';
export function Title({ children }) {
return <h3 className="product-title">{children}</h3>;
}
export function Price({ value, currency = '₽' }) {
return <p className="product-price">{value} {currency}</p>;
}
export function BuyButton({ label = 'Купить', onClick }) {
return <button className="action-button" onClick={onClick}>{label}</button>;
}
export function ProductCard({ title, price, currency = '₽', onBuy }) {
return (
<article className="product-card">
<Title>{title}</Title>
<Price value={price} currency={currency} />
<BuyButton onClick={onBuy} />
</article>
);
}
export default function App() {
function handleBuy(product) {
alert(`Покупка: ${product}`);
}
const product = { title: 'Кофе', price: 299 };
return (
<main className="challenge-container">
<section>
<ProductCard
title={product.title}
price={product.price}
currency="₽"
onBuy={() => handleBuy(product.title)}
/>
</section>
</main>
);
}Почему это работает: Мелкие компоненты инкапсулируют ответственность, а ProductCard лишь их компонует. Тестируемость и переиспользование повышаются.
Собери составной
ProductCardиз трёх маленьких компонентов:Title,Price,BuyButton. Логика — в пропсах, без состояния.
Композиция компонентов — основа React. Мелкие части проще тестировать и переиспользовать, а из них удобно собирать крупные.
Title, Price, BuyButton.ProductCard.Отобрази карточку товара с заголовком, ценой и кнопкой.
// … existing code …
Финальный результат должен быть таким:
// … existing code …
<article className="product-card">
<Title>{title}</Title>
<Price value={price} currency={currency} />
<BuyButton onClick={onBuy} />
</article>import React from 'react';
import './styles.css';
export function Title({ children }) {
return <h3 className="product-title">{children}</h3>;
}
export function Price({ value, currency = '₽' }) {
return <p className="product-price">{value} {currency}</p>;
}
export function BuyButton({ label = 'Купить', onClick }) {
return <button className="action-button" onClick={onClick}>{label}</button>;
}
export function ProductCard({ title, price, currency = '₽', onBuy }) {
return (
<article className="product-card">
<Title>{title}</Title>
<Price value={price} currency={currency} />
<BuyButton onClick={onBuy} />
</article>
);
}
export default function App() {
function handleBuy(product) {
alert(`Покупка: ${product}`);
}
const product = { title: 'Кофе', price: 299 };
return (
<main className="challenge-container">
<section>
<ProductCard
title={product.title}
price={product.price}
currency="₽"
onBuy={() => handleBuy(product.title)}
/>
</section>
</main>
);
}Почему это работает: Мелкие компоненты инкапсулируют ответственность, а ProductCard лишь их компонует. Тестируемость и переиспользование повышаются.
Редактор кода намеренно скрыт на мобильном.
Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.
📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.
💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!