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

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

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

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

React.js

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

Q&A

解決済

1回答

1400閲覧

React: 2つのinputであるdateとtimeを1つの文字列としてuseStateで管理したい。

607842

総合スコア8

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2021/07/08 06:00

編集2021/07/09 00:48

イメージ説明

こちらの画像のようにuseStateを使って、inputの日付と時間を管理したいですが、入力しても第一希望しか変化せず、第2希望はカレンダーを選択しても日付と時間が出てきません。

以下のコードでどの部分を修正すればいいでしょうか?

jsx

1import * as React from 'react' 2 3const labels = { 4 desired1: '第一希望', 5 desired2: '第二希望', 6} 7 8const desires = { 9 desired1: [''], 10 desired2: [''], 11} 12 13const starting = { 14 desired1: '', 15 desired2: '', 16} 17 18const App = () => { 19 const [appo, setAppo] = React.useState({ ...starting }) 20 21   const iValue = (key, val) => { 22 setAppo(prev => { 23 const next = {...prev} 24 next[key] = val 25 return next 26 }) 27 } 28 29  return ( 30   <form> 31 <table> 32 <tbody> 33 { Object.keys(labels).map(key => labels[key] && ( 34 <tr> 35 <td> 36 {labels[key]} 37 </td> 38 <td> 39 {desires[key] && desires[key].map(desire => ( 40 <div> 41 <input type='date' 42 id="date" 43 value={appo[key]} 44 onChange={() => iValue(key, (document.getElementById('date').value + document.getElementById('time').value))} 45 /> 46 <input type='time' 47 id="time" 48 value={appo[key]} 49 onChange={() => iValue(key, (document.getElementById('date').value + document.getElementById('time').value))} 50 /> 51 <label>{desire}</label> 52 </div> 53 ))} 54 </td> 55 </tr> 56 )) 57 } 58 </tbody> 59 </table> 60 </form> 61 ) 62}

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

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

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

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

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

p19ljk

2021/07/09 00:36

これコードは正しいですか? Appの中身がuseStateだけだったり、returnが外に飛び出してたり...
guest

回答1

0

ベストアンサー

そもそものcontrolled componentの扱いが間違っています。
inputにvalueをもたせているのであれば、これはcontrolled componentです。
この場合、ユーザ操作によっては値の変化はありませんのでgetElementByIdで取得してvalueを見ても値は変更されていません。
値は必ずプログラム側で変更するというルールになりますので、onChangeの引数でeventが受け取れ、その中に変更後の値がセットされているので、それを元にstateを更新するように実装しなければなりません。
(stateを更新すればそれをvalueに持っているinputの表示も変更されるという仕組み)
おそらくonChangeが呼ばれても変更前の値が取得されているのでstateが変化していないように見えているのでしょう。

余談ですが、今の実装だと同(date, time)の要素が2つずつできてしまうのでこれは避けたほうがいいです。
そもそも、上記の修正を行えばidは不要になりますが。

投稿2021/07/09 01:38

p19ljk

総合スコア146

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

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

607842

2021/07/17 19:56

なるほど。そもそものreactのcontrolled componentの使い方が間違っているということですね。公式ドキュメントを読んで理解を深めたいと思います。 date, timeのstateを作って管理してみます! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問