Reactそのものや配列・オブジェクトについてまだまだ理解できておらず、見当違いなことを言っているかもしれません。
アドバイスいただけると幸いです。
問題
trainingRecordsステート(配列)に
trainingRecordステート(オブジェクト)を追加したいのですが、型エラー?がでてしまいます。
const [ trainingRecords, setTrainingRecords ] = useState([]);
const [ trainingRecord, setTrainingRecord ] = useState({
trainingName: "",
trainingWeight: "none",
trainingReps: "0",
})
const saveTrainingRecord = () => {
if (!trainingRecords.length) {
setTrainingRecords(trainingRecord);
} else {
const newRecord = {...trainingRecords, trainingRecord};
setTrainingRecords(newRecord);
}
};
saveTrainingRecordメソッドの中の書き方が間違っているためだと思われるのですが、どう書けばいいでしょうか?
備考
前回質問させていただいたものを、いただいた修正依頼をもとに作り直させていただきました。
筋トレSNSなるものをつくっていまして、
トレーニング名、重量、回数を入力フォームから受け取って格納するのがtrainingRecord、
それを複数格納して、最終的にデータベースに保存するのがtrainingRecordsです。
回答への返信
siruku6さん、ありがとうございます。
[]をつけてみると、
このように型'never'に割り当てられませんとでてしまいました。
そこで、もはや意味もわからずtrainingRecordsを次のように書き変えたところ無事レンダリングまではされるようになりました。
(初期値に{}を入れた)
const [ trainingRecords, setTrainingRecords ] = useState([{}]);
しかし、console.log(trainingRecords)でみてみると、
最初に「+」ボタンを押すと空のオブジェクトが作られて、
二度目で初めて入力内容が配列に追加されていることがわかりました。
最初の空のオブジェクトは不要なので作りたくないのですが、どう書けばいいでしょうか。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
interface TrainingRecord {
trainingName: string;
trainingWeight: string;
trainingReps: string;
}
でtrainingRecordオブジェクトの型を宣言し、
const [ trainingRecord, setTrainingRecord ] = useState<TrainingRecord>({
trainingName: "",
trainingWeight: "none",
trainingReps: "0",
})
const [ trainingRecords, setTrainingRecords ] = useState<TrainingRecord[]>([]);
trainingRecord の型は TrainingRecord 型のオブジェクト(<TrainingRecord>)
trainingRecords の型は TrainingRecord 型のオブジェクトの配列(<TrainingRecord[]>)を適用しました(参考)。
また今回、setStateした直後の配列をconsole.logで出力しようとしていたのですが、
こちらのQiitaの記事に「setState()は、引数にオブジェクトが渡された場合に、stateを即時にアップデートすることを保証しない」と書かれているように、うまくいかないこともあるようです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
配列でないといけないようなので、最初だけは
if (!trainingRecords.length) {
setTrainingRecords([trainingRecord]);
} else {
...
にしてはいかがでしょう?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.21%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる