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

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

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

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

React.js

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

Q&A

1回答

1914閲覧

スプレッド構文を使って配列の要素を追加したいが、undefinedと出てしまいます

yuiei

総合スコア2

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2021/05/01 12:39

###実現したいこと

button.jsのボタンを押したときに配列が生成されるようにしたい。
newarrという配列に入力した時刻のミリ秒と現在の時刻のミリ秒の差を要素としてクリックするたびに配列に追加したいです。
初心者のためどうしてundefinedと表示されるのかについても教えていただきたいです。
###エラー内容
console.log(newarr)でundefinedと表示されてしまう。

###ソースコード

Javascript

1 2import classes from './taskinput.module.css' 3import React, { useState } from 'react'; 4 5import Button from './button' 6 7const getKey = () => Math.random().toString(32).substring(2); 8 9function Taskinput() { 10 //タスクの追加 11 const initialState = [ 12 { 13 task: '', 14 time: '', 15 dead: '', 16 message: '', 17 isCompleted: false 18 }, 19 /* { 20 task: 'Learn React Hook', 21 isCompleted: false 22 }, 23 { 24 task: 'Learn Gatsby.js', 25 isCompleted: false 26 }, */ 27 ] 28 29 const [todos, setTodo] = useState(initialState); 30 31 32 const [task, setTask] = useState('') 33 34 const handleNewTask = (event) => { 35 setTask(event.target.value) 36 } 37 38 //タスクにかかる時間について 39 const [time, setTime] = useState('1h') 40 41 const options = [ 42 43 ] 44 const Change = e => { 45 console.log(setTime(e.target.value)) 46 setTime(e.target.value) 47 } 48 49 console.log(options.value) 50 console.log(time) 51 52 //taskの締め切りについて 53 var today = new Date() 54 55 56 var nowdate = today.getTime() 57 console.log(nowdate) 58 console.log(today) 59 60 const [dead, setDead] = useState('') 61 62 63 const [year, setYear] = useState('') 64 const [month, setMonth] = useState('') 65 const [day, setDay] = useState('') 66 /* const [hour, setHour] = useState('') */ 67 68 var targetDate = new Date(year, month, day) 69 var changeDate = targetDate.getTime(); 70 console.log(changeDate) 71 const differdate = changeDate - nowdate 72 console.log(changeDate - nowdate) 73 74 console.log(dead) 75 76 console.log(todos) 77 78 const [arr, setArr] = useState(['']) 79 80 /* const [message, setMessage] = useState(initialState) */ 81 82 //plusbuttonクリック時のイベント 83 const handleSubmit = (event) => { 84 event.preventDefault() 85 if (task === '') return 86 setTodo(todos => [...todos, { task, time, dead, /* message */ isCompleted: false }]) 87 setTask('') 88 console.log('add') 89 /* setMessage(() => { as: differdate }) */ 90 91 let newarr = setArr([...arr, `${differdate}`]) 92 console.log(setArr([...arr, `${differdate}`])) 93 console.log(newarr) 94 console.log(arr) 95 console.log(differdate) 96 } 97 98 /* console.log(message) */ 99 100 const handleRemoveTask = index => { 101 const newTodos = [...todos] 102 newTodos.splice(index, 1) 103 setTodo(newTodos) 104 105 } 106 107 108 109 return ( 110 <> 111 <h1>ToDo List</h1> 112 <div className={classes.todolist}> 113 114 <div> 115 <form > 116 Add Task : <input value={task} placeholder="Add New Task" onChange={handleNewTask} /> 117 118 </form> 119 </div> 120 121 <div> 122 <p>想定される時間</p> 123 <select 124 onChange={Change} 125 value={time} 126 > 127 <option value="1h">1h</option> 128 <option value="2h">2h</option> 129 <option value="3h">3h</option> 130 <option value="4h">4h</option> 131 <option value="5h">5h</option> 132 <option value="6h">6h</option> 133 </select> 134 <div>{time}</div> 135 136 </div> 137 <div> 138 <input type="text" onChange={e => setYear(e.target.value)} />139 <input type="text" onChange={e => setMonth(e.target.value)} />140 <input type="text" onChange={e => setDay(e.target.value)} />141 {/* <input type="text" onChange={e => setHour(e.target.value)} />時 */} 142 <div>{year}{month}{day}</div> 143 {/* <input type="date" 144 onChange={e => setDead(e.target.value)} /> 145 <div>{dead}</div> */} 146 </div> 147 <div><Button clicked={handleSubmit} /></div> 148 </div> 149 <ul> 150 {todos.map((todo, index) => ( 151 <div className={classes.tasklist}> 152 <li key={getKey()}>{todo.task} </li> 153 <li key={getKey()}>{todo.time}</li> 154 <li key={getKey()}>{todo.dead}</li> 155 {/* <li key={getKey()}>締め切りまで{todo.message}</li> */} 156 <input 157 type="button" 158 onClick={() => handleRemoveTask(index)} 159 value="削除" /> 160 </div> 161 ))} 162 163 164 </ul> 165 </> 166 ); 167} 168 169export default Taskinput; 170

javascript

1import React, { useState } from 'react' 2import classes from './button.module.css' 3 4const Button = (props) => { 5 return ( 6 <div 7 className={`${classes.icon} ${classes.iconplus}`} 8 onClick={props.clicked} > 9 <span className={classes.icon__mark}></span> 10 </div> 11 ) 12} 13 14export default Button;

###試してみたこと
console.logで何が入っているのかを確認しました。differdateにはちゃんと値が入っていて、現在の時刻とテキストボックスに入力した時刻をgetTime()した値の差が入っていました。文字列の配列の身なのかと思い、${differdate}として文字列にしてみましたが、表示は同じくundefinedのままでした。

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

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

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

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

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

guest

回答1

0

newarrという配列に入力した時刻のミリ秒と現在の時刻のミリ秒の差を要素としてクリックするたびに配列に追加したいです。

useStateで作ったsetsetArrは、非同期で値のセットを行います。返り値をとっても有意な値は得られません。

結論:値は正しくセットされている(かもしれない)けど、それを確認する方法が適切ではない

投稿2021/05/01 14:43

maisumakun

総合スコア146018

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

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

yuiei

2021/05/01 15:02

回答ありがとうございます! つまり、console.logでsetArrを参照することが問題ということなのでしょうか。 どうしたらsetArrで更新された結果が見れるのかを差し支えなければ教えていただけないでしょうか。
maisumakun

2021/05/01 15:04

・React用の開発ツールを使って確認する ・JSX内でJSON.stringifyなどを使って書き出す ・イベントコールバックの「外側」でconsole.logを行う(条件によっては出過ぎることもありえます)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問