質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1285閲覧

React 商品の小計をmapループから取得できない

orori

総合スコア42

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/05/01 07:49

編集2020/05/01 08:12

ショッピングカートにある商品の一覧表を表示するため、Reactの関数型コンポーネントをつかってみました。

商品(item)の価格(item#price)の合計も同時に取得したいので、
mapでItemsをループで表示し、関数で合計値を計算するようにしました。

最初は逐一stateにいれていくようにしたのですが、reactの非同期処理をmap内で扱うとエラーがでました。
ググってみるとまずは同期処理で小計を得てその後にstateにいれるとよいとありました。

以下のようにしましたが、途中まできちんと合計されていくのですが、ループ終了後値をみると0になっています。
スコープの問題なのでしょうか、ではどこでこの値を取得すればよいのでしょうか。

js

1 2function ItemsList(props) { 3 let subtotal = 0 4 5 function updateSubtotal(price) { 6 subtotal += price 7 return subtotal 8 } 9 return ( 10 <React.Fragment> 11 {items.map(item => { 12 return <Item 13 key={item.id} 14 updateSubtotal={updateSubtotal} 15 />; 16 })} 17 {subtotal} // 0と表示されてしまう。 18 {updateSubtotal} // 当然ですがこれも0と表示されてしまう。 19 20 </React.Fragment> 21 ); 22} 23 24 25function Item(props) { 26 const {updateSubtotal} = props 27 return ( 28 <React.Fragment> 29 <tr> 30 <td className="text-center">{item.name}</td> 31 <td className="text-center">{updateSubtotal(item.price) }</td> 32 </tr> 33 </React.Fragment> 34 ) 35} 36

ご教示いただけませんでしょうか。
何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

教本通りにmapだといろいろとやりにくいので、forEachを使って各要素を変数に入れ込む方法をとってみました。
以下のようにして、subtotal、elementsをそれぞれ返せばよいようです。

js

1const ItemsList = () => { 2 let elements = [], subtotal = 0 3 items.forEach(item => { 4 price = item.price 5 subtotal += parseInt(price) 6 elements.push(<Item 7 key={item.id} 8 price={price} 9 />) 10 }) 11 console.log(subtotal) 12 return elements 13}

投稿2020/05/01 10:30

編集2020/05/01 10:33
orori

総合スコア42

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問