ドットインストールで学習して重要だと思った部分をまとめていきます。
<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}円 × {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: 800 },
];
const total =
menus[0].price * counts[0] +
menus[1].price * counts[1] +
menus[2].price * counts[2];
const decrementMenu = (menuId) => {
if (counts[menuId] > 0) {
// [0, 0, 0] -> [-1, 0, 0]
const newCounts = [...counts];
newCounts[menuId]--;
setCounts(newCounts);
}
};
const incrementMenu = (menuId) => {
// [0, 0, 0] -> [1, 0, 0]
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}円</p>
</>
);
};
const container = document.querySelector('#container');
const root = ReactDOM.createRoot(container);
root.render(<App />);
}
</script>
</body>
メモ
- querySelectorでdivが読み込まれる
- createRootでrootにする
- 大元のAppコンポーネントとメニューの雛形のMenuコンポーネントを作成する
- Appコンポーネント
- Menuコンポーネントにprops(properties)として渡すもの
- 各項目のデータ
- 数字の変更のための計算式
- 合計金額を求める式
- Menuコンポーネントにprops(properties)として渡すもの
- Menuコンポーネント
- 数字の変更と各項目の雛形を決めている
- Appコンポーネント
- 最後に<></>で囲まれた部分で画面に表示する
- 異なるコンポーネント行ったり来たりするので難しく感じる
- 下記の*の部分のように、関数が始まるコンポーネントと関数の処理が行われるコンポーネントが異なるのが紛らわしい。
- AppコンポーネントはMenuコンポーネントをうまく利用していいとこどりしているイメージ
- 画面に表示する部分から逆算すると以下にようになる
- 項目一つ一つを画面に表示するにはmenuItems関数が処理される
- menuItemsはpropsを使ってMenuコンポーネントに値を渡している
- 渡された値を元にMenuコンポーネント内で数字の変更を開始する *
- 数字の処理がAppコンポーネントにある関数で行われる *
- Appコンポーネントで処理が行われた数字がMenuコンポートに渡され、各項目として表示される
- 処理が行われた数字は合計にも使えるので、Appコンポーネントで合計金額が処理され表示される