index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My React App</title>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="container"></div>
<script type="text/babel">
'use strict';
{
const Menu = (props) => {
const decrement = () => {
props.onDecrement(props.menuId);
};
const increment = () => {
props.onIncrement(props.menuId);
};
return (
<li>
<button onClick={decrement}>-</button>
<button onClick={increment}>+</button>
{props.name} ({props.price}G ☓ {props.count}個)
</li>
);
};
const App = () => {
const [counts, setCounts] = React.useState([0, 0, 0]);
const menus = [
{ id: 0, name: 'ポーション', price: 400 },
{ id: 1, name: 'ハイポーション', price: 500 },
{ id: 2, name: 'エリクサー', price: 300 },
];
const total =
(menus[0].price * counts[0]) +
(menus[1].price * counts[1]) +
(menus[2].price * counts[2]);
const decrementMenu = (menuId) => {
if(counts[menuId] > 0){
const newCounts = [...counts];
newCounts[menuId]--;
setCounts(newCounts);
}
};
const incrementMenu = (menuId) => {
const newCounts = [...counts];
newCounts[menuId]++;
setCounts(newCounts);
};
const menuItems = menus.map((menu) => {
return (
<Menu
key={menu.id}
menuId={menu.id}
count={counts[menu.id]}
name={menu.name}
price={menu.price}
onDecrement={decrementMenu}
onIncrement={incrementMenu}
/>
);
});
return (
<>
<h1>メニュー</h1>
<ul className="menus">
{menuItems}
</ul>
<p>合計: {total}G</p>
</>
);
};
const container = document.querySelector('#container');
const root = ReactDOM.createRoot(container);
root.render(<App />);
}
</script>
</body>
</html>
style.css
@charset "utf-8";
body{
margin: 0;
}
#container{
width: 400px;
margin: auto;
}
h1{
margin: 16px 0 0 0;
font-size: 20px;
text-align: center;
}
.menus{
margin: 0;
padding: 0;
list-style-type: none;
}
.menus > li{
border: 1px solid #ccc;
padding: 8px;
border-radius: 8px;
margin-top: 16px;
}
.menus button{
margin-right: 8px;
width: 24px;
}
p{
margin: 0;
text-align: right;
}