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

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

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

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

React.js

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

Q&A

解決済

2回答

1877閲覧

React.jsでFormに入力された数字の足し算

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2018/07/25 22:58

React.jsで, ユーザが入力した数字(var1,var2)を加算して結果値(result)を表示するプログラムを作成したいのですが, 下記コードを実装すると, ページ上ではresult: NaNと表示され, 入力内容が反映されません.
原因を教えていただきたいです. Reactのversionは16.4.1です.

javascript

1import React, { Component } from 'react'; 2 3class InputForm extends Component { 4 constructor(props) { 5 super(props); 6 this.state = {var1: 0, var2: 0, result: 0}; 7 this.handleChange = this.handleChange.bind(this); 8 } 9 10 handleChange(event) { 11 this.setState({ 12 var1: event.target.var1, 13 var2: event.target.var2, 14 result: event.target.var1 + event.target.var2 15 }); 16 } 17 18 render() { 19 return ( 20 <div> 21 <div> 22 var1:<input type="text" value={this.state.var1} onChange={this.handleChange} /> 23 </div> 24 <div> 25 var2:<input type="text" value={this.state.var2} onChange={this.handleChange} /> 26 </div> 27 <div> 28 result: {this.state.result} 29 </div> 30 </div> 31 ); 32 } 33} 34 35export default InputForm;

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

修正案の一例として、以下のようにするとよいかもしれません。

javascript

1class InputForm extends Component { 2 constructor(props) { 3 super(props); 4 this.state = {var1: 0, var2: 0}; 5 this.handleChange = this.handleChange.bind(this); 6 } 7 8 handleChange(name) { 9 return (event) => { 10 this.setState({ 11 [name]: Number(event.target.value) || 0, 12 }); 13 }; 14 } 15 16 render() { 17 return ( 18 <div> 19 <div> 20 var1:<input type="text" value={this.state.var1 || ''} onChange={this.handleChange('var1')} /> 21 </div> 22 <div> 23 var2:<input type="text" value={this.state.var2 || ''} onChange={this.handleChange('var2')} /> 24 </div> 25 <div> 26 result: {this.state.var1 + this.state.var2} 27 </div> 28 </div> 29 ); 30 } 31} 32 33

修正点は以下です。

  • this.stateのプロパティとして result を持たなくても、render()で加算結果を表示できるので、resultプロパティを削除
  • handleChange()を修正して、変数名の 'var1' または 'var2' を受け取り、該当する this.stateのプロパティを更新するハンドラを返すように修正
  • event.target.value が数値に変換できないとき、0 が入るようにした。
  • this.state の持っているvar1 または var2 の値が 0 のとき、入力欄を空欄にする。

以下に上記のサンプルを作成しました。

https://jsfiddle.net/jun68ykt/xvzne5o2/2/

お望みの仕様とは少し違うかもしれませんが、参考になれば幸いです。


追記1

上記のコードを、もう少し親切にしたものが以下です。

https://jsfiddle.net/jun68ykt/a7enwo5t/2/

  • var1var2 に数字でないものが入れられた場合、計算できません。 と表示します。
  • this.statevar1 または var2 が 0 の場合も表示します。

追記2

handleChange の修正方法がもう一つあります。

<input >name 属性を追加して、これで var1var2 かを判別できるようにすると、 以下のようにも書けます。

javascript

1 handleChange(event) { 2 this.setState({ 3 [event.target.name]: event.target.value, 4 }); 5 }

html

1var1:<input name="var1" type="text" value={this.state.var1} onChange={this.handleChange} />

html

1var2:<input name="var2" type="text" value={this.state.var2} onChange={this.handleChange} />

サンプル: https://jsfiddle.net/jun68ykt/t19bk2ns/1/

投稿2018/07/26 01:19

編集2018/07/26 02:23
jun68ykt

総合スコア9058

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

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

0

eventから取り出す値は、event.target.valueになります。
上記は、setStateでそれぞれにundefinedがセットされてしまうと思います。

var1とvar2のハンドラ呼び出しを分けて、それぞれの値を適切にセットすれば、解決するように思います。

投稿2018/07/26 00:39

Meganezaru

総合スコア715

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問