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

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

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

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

React.js

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

Q&A

解決済

1回答

1656閲覧

割り勘アプリを作成していて、割った金額を人数分表示したいのですが、表示できなくて困ってます( ; ; )

KobeanH

総合スコア6

JavaScript

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

React.js

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

0グッド

1クリップ

投稿2022/01/09 16:26

現在、Reactで割り勘アプリを作成しており、合計金額を人数で割ったらその人数分liタグを生成し、表示するコードを書いています。
例えば、totalに12000を入力し、pplに3を入力して3人で割ったとします。
すると、計算結果として4000のliタグを3つ生成して表示したいです。
pplに4を入力した場合だと3000のliタグを4つ生成して表示したいです。

ですが、以下のコードで検証してみると、計算するボタンをクリックしても配列personに計算結果perPersonがpushされないです。
一体、なにが原因でpushされないのでしょうか?

解説と共に正常に動くコードを教えていただけますと、幸いです。

何卒、よろしくお願いします。

import { useState } from "react"; import "./App.css"; function App() { const [total, setTotal] = useState(""); //合計金額 const [ppl, setPpl] = useState(""); //人数 //合計金額入力欄 const getValueFromTotal = (e) => { setTotal(() => e.target.value); }; //人数入力欄 const getValueFromPpl = (e) => { setPpl(() => e.target.value); }; //計算をするボタン押した際に一人当たりの計算 let person = []; const cal = () => { let perPerson = total / ppl; for (let i = 0; i < ppl; i++) { person.push(perPerson); } }; console.log(person); return ( <div className="App"> <input type="number" className="total" onChange={getValueFromTotal} /> <input type="number" className="ppl" onChange={getValueFromPpl} /> <button type="button" onClick={cal}> 計算する </button> {person && person.map((p, index) => { return <li key={index}>{p}</li>; })} </div> ); } export default App;

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

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

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

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

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

guest

回答1

0

ベストアンサー

ボタン押下後に画面描画が実行されるためには、Reactに「何らかの変化があった事」が伝わらないといけません。たとえば、useStateを使うと、stateに変化があった事がReactに伝わるので、App関数が再実行されます。totalとpplはsetStateしているので、テキストボックスに文字を打つたび、App関数は再実行されています。同じように、personもcal関数の中でsetStateすることで、Reactに変化を伝えることができます。

ただ、まず計算処理が間違っているのでそこを直します。

javascript

1 /* これだと4000個のliが出来ます。 2 for (let i = 0; i < ppl; i++) { 3 person.push(perPerson); 4 } 5 */ 6 for (let i = 0; i < perPerson; i++) { 7 person.push(ppl); 8 } 9

App関数の最初に、person用のuseStateを書きます。

javascript

1 2function App() { 3 const [total, setTotal] = useState(""); //合計金額 4 const [ppl, setPpl] = useState(""); //人数 5 const [person, setPerson] = useState([]); // 追加

cal関数の最後にpersonをsetStateします。

javascript

1 //計算をするボタン押した際に一人当たりの計算 2 // let person = []; ←削除 3 const cal = () => { 4 let perPerson = total / ppl; 5 6 for (let i = 0; i < perPerson; i++) { 7 person.push(ppl); 8 } 9 setPerson([...person]); // 追加 10 };

注意なのが、personはListなんですが、Listは中身が変わってもReactは変化に気付きません
List自体のインスタンスは変化しないからです。なので、新たにリストを作り、元のpersonをコピーして作り直したものをsetします。[...person]...はスプレッド構文というもので、リストの中身を展開しています。

これで動きます。

投稿2022/01/09 17:29

編集2022/01/09 17:38
umau

総合スコア831

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

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

hoshi-takanori

2022/01/09 21:27

person 配列は一部変更ではなく全部作り直しなので、スプレッド構文は不要で、let person = []; を cal の中に入れて、cal の最後で setPerson(person); すればいいはず。
umau

2022/01/10 02:35

>hoshi-takanoriさん ありがとうございます。要は配列自体を新規で作る事がキモなので、cal関数のローカルで新規に配列作ればそのままset出来るのはおっしゃる通りです。ただ、これは単に書き方としての問題にはなりますが、まずuseStateの定義は普通、 const [person, setPerson] = useState([]); こう書くと思いますが、personという名前がシャドーイングしないよう、ローカルは別名付けることになり、変数増やしたくないので面倒だなと。 公式の解説含め、スプレッド構文使って配列展開する書き方が一般的(そうでない解説を私は見た事が無いです)で、これで覚えておいた方が事故らずに済むんじゃないかと思います。
KobeanH

2022/01/10 09:37

無事解決できました!!! ずっとつまづいてたので本当に助かりました。 ありがとうございました????‍♀️
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問