Reactでのエラー
reactでTodoリストを作っています。入力した内容がリストで表示されます。
実現したい事としてはこの通りです。
inputタグ内で入力した内容がhandleChangeメソッドによりstateのinputに更新されます。
そして送信ボタンを押したら、handleSubmitメソッドによりstate.inputの内容がtoDoList(配列)に入れられます。
もしtoDoListに要素が一つでもあるなら、それをリストとしてレンダリングします。
###起こった問題
しかし、送信ボタンを押すと二つの問題が発生しました。
まず、フォームに入力して「追加」ボタンを「一度」押すとリストが消えてしまうことです。
cccと入力してボタンを押してみました。
次にこの状態でもう一度ボタンを押すと次のエラーが発生しました。
以下がhandleSubmitメソッド内で起こったエラーです。
エラーメッセージ
TypeError: Todo.push is not a function
該当のソースコード
indexjs
1import React from 'react'; 2import ReactDOM from 'react-dom'; 3import './index.css'; 4// import App from './App'; 5import * as serviceWorker from './serviceWorker'; 6 7class Todo extends React.Component { 8 constructor(props) { 9 super(props); 10 this.state = { 11 input: '', 12 toDoList: ["aaa", "bbb"], 13 } 14 } 15 16 17 handleSubmit(e) { 18 e.preventDefault(); 19 const input = this.state.input; 20 const Todo = this.state.toDoList; 21 this.setState({ 22 toDoList: Todo.push(input), 23 }); 24 } 25 26 27 handleChange(event) { 28 const input = event.target.value; 29 this.setState({ 30 input: input, 31 }); 32 } 33 34 render(){ 35 var toDoList; 36 if (this.state.toDoList.length > 1) { 37 toDoList = this.state.toDoList.map((list) => { 38 return ( 39 <li>{list}</li> 40 ); 41 }); 42 } 43 44 return( 45 <div className="container"> 46 <div className="Todo">Todoリスト</div> 47 <ul> 48 {toDoList} 49 </ul> 50 <form onSubmit={(e) => this.handleSubmit(e)}> 51 <input type="text" onChange={(event) => this.handleChange(event)}/> 52 <input type="submit" value="追加"/> 53 </form> 54 55 </div> 56 ) 57 } 58} 59 60ReactDOM.render( 61 <Todo />, 62 document.getElementById('root') 63);
試したこと
toDoListは配列であることを確かめるために試しに"aaa","bbb"という文字列を入れてみました。するとこれは正しく表示されました。renderメソッド内ではtoDoList.mapが動いているようです。
stateの定義の仕方が悪いのかと思った時はstate: new Arrayにしてみましたが解決しませんでした。
handleSubmit内でstate.toDoListを変数に代入する際、sliceメソッドで使ってみましたがすぐに的外れであることがわかりました。
this.state.toDoListは確かに配列で、pushメソッドも問題なく使えるはずなのですが・・・
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/14 16:11
2019/08/14 16:13