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

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

新規登録して質問してみよう
ただいま回答率
85.48%
React.js

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

Q&A

2回答

4268閲覧

value属性を付けるのはなぜ??

m5151m

総合スコア6

React.js

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

0グッド

0クリップ

投稿2018/09/07 18:04

前提・実現したいこと

CODEPREPでreact.jsのブックを読んでいます
そのときにこのセクションでわからないことがありましたので質問しました

発生している問題・エラーメッセージ

TodoFormコンポーネントにて記述されているvalue属性は、どこでも使われていないように見えますが、このvalue属性を設定する意味はなんでしょうか?
inputタグの中に書かれる文字はonChangeメソッドのsetStateで変更しているので必要ないと思うのですが...

該当のソースコード

main.jsx

jsx

1const DEFAULT_TODOS = [ 2 { title: "Reactで作るTodoアプリ" }, 3 4 { title: "はじめてのReact", completed: true }, 5 6]; 7function Todo(props) { 8 9 return ( 10 <li className="todo-item"> 11 <input 12 type="checkbox" 13 checked={props.todo.completed} 14 /> 15 <span 16 style={{ textDecoration: props.todo.completed ? "line-through" : "" }} 17 > 18 {props.todo.title} 19 </span> 20 <button>x</button> 21 </li> 22 ); 23} 24 25 26function TodoList(props) { 27 28 const todoList = props.todos.map((todo, index) => { 29 return ( 30 <Todo 31 key={index} 32 todo={todo} 33 /> 34 ); 35 }); 36 return ( 37 <ul className="todo-list"> 38 {todoList} 39 </ul> 40 ); 41 42function TodoForm(props) { 43 return ( 44 <form className="todo-form" onSubmit={props.onSubmit}> 45 <label> 46 新しいTodo 47 <input 48 49 onChange={props.onChange} 50 value={props.value} // なぜ設定する必要があるのか? 51 /> 52 53 </label> 54 <button type="submit">追加する</button> 55 </form> 56 ); 57 58 59} 60 61class App extends React.Component { 62 constructor(props) { 63 super(props); 64 this.state = { 65 todos: DEFAULT_TODOS, 66 newTodo: "" 67 }; 68 69 // ハンドラの中でthisコンテキストを参照するので、ここでthisコンテキストをApp自身に固定しておく 70 71 this.onChange = this.onChange.bind(this); 72 this.onSubmit = this.onSubmit.bind(this); 73 } 74 onSubmit(e) { 75 // フォームが送信されるのを防ぐ 76 e.preventDefault(); 77 const { newTodo, todos } = this.state; 78 79 // 値が空の場合は何もしない 80 if (!newTodo.trim()) { 81 return; 82 } 83 84 // 配列をコピーを作成する 85 const newTodos = todos.slice(); 86 // 新しいTodoを追加する 87 newTodos.push({ 88 title: newTodo, 89 completed: false 90 }); 91 this.setState({ 92 todos: newTodos, 93 newTodo: "" 94 }); 95 } 96 onChange(e) { 97 const { value } = e.target; 98 this.setState({ newTodo: value }); 99 } 100 render() { 101 return ( 102 <div className="todo"> 103 <TodoForm 104 value={this.state.newTodo} 105 onChange={this.onChange} 106 onSubmit={this.onSubmit} 107 /> 108 <TodoList 109 todos={this.state.todos} 110 /> 111 </div> 112 ); 113 } 114} 115ReactDOM.render( 116 <App />, 117 document.getElementById("root") 118);

よろしくお願いします

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

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

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

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

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

guest

回答2

0

valueの値をセットしない場合、そのコントロールはUncontrolledReact公式)、つまりReactからは値を管理しない、という扱いになります。

具体的に何が困るのかというと、投稿したあともnewTodo: ""が反映されない、つまり値が残り続ける、ということになります。

投稿2018/09/07 22:14

maisumakun

総合スコア145183

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

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

0

私の予想です。

  1. Vue.jsやAngularのような Two-way binding っぽいものを実現しようとした結果よくわからないことになっている
  2. newTodoをユーザ入力ではなくプログラム上から変更しても問題ないようにしてある
  3. とりあえずなんとなくお作法的に書いてある
  4. 演習をやっていく途中の段階ではvalueに意味があるが最終的に不要になる

そのプログラムの作者ではないので、正確にはわかりません。
valueなくても期待通り動くんですよね?
動くならいらないんじゃないですか。

投稿2018/09/07 21:56

spookybird

総合スコア1803

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

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

spookybird

2018/09/07 22:32

maisumakun さんの回答が正しいです。 私はソースを読みきれてませんでした。 予想2が正解といえば正解でしたが、既に実際に値を更新している箇所がありましたね。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問