🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

React.js

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

Q&A

解決済

2回答

686閲覧

react.jsでのフォーム(Comtroled Component)の入力値のstateへのセットについて

moriman

総合スコア615

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2019/09/08 04:01

MyEvent

1import React, { Component } from 'react'; 2 3export default class MyEvent extends Component { 4 construct(props){ 5 this.state = { 6 data: 'aaa' 7 }; 8 } 9 10 onchange(e) { 11 12 let name=e.target.name; 13 let value=e.target.value; 14 this.setState({[name]:value}); 15 } 16 17 render() { 18 return ( 19 <div> 20 <p>testtttttteee</p> 21 22 <form> 23 <label htmlFor="data">名前:</label> 24 <input name="data" type="text" onChange={(e)=>this.onchange(e)} value={this.state.data}/> 25 <p>{this.state}</p> 26 </form> 27 28 </div> 29 ); 30 } 31}

App

1import React from 'react'; 2 3import './App.css'; 4import NumberOfGames from './NumberOfGames'; 5import PrintBasicInfo from './PrintBasicInfo'; 6import MyEvent from './MyEvent'; 7import MyState_2 from './MyState_2'; 8import MyParent from './MyParent'; 9import NameForm from './NameForm'; 10import FlavorForm from './FlavorForm'; 11import Calculator from './Calculator'; 12 13 14 15 16 17class App extends React.Component { 18 19 constructor(props){ 20 super(props); 21 22 23 24 this.state={ 25 26 place : "" 27 28 } 29 30 } 31 32 handleClickNOG(e){ 33{/* 34 let name=e.target.name; 35 let value=e.target.value; 36 37 this.setState({[name]:value}); 38*/} 39 let value=e.target.value; 40 this.setState({place:value}); 41 42 43 } 44 45 46 47 componentDidUpdate(prevProps,prevState){ 48 console.log(`${this.state.place}です`); 49 } 50 51 52 53render(){ 54 return ( 55 <div> 56 <MyEvent greet="helohelo" /> 57 </div> 58 ); 59} 60} 61 62export default App;

reactの練習でフォームについていろいろいじってるのですが、上記のコードについて。
現在の認識では上記コードで入力ボックスの入力値がstate.dataにセットされて、現在のstate.dataの値が入力ボックス内に表示される挙動でエラーは出ないと思うのですが、実際動かしてみると、

The above error occurred in the <MyEvent> component: in MyEvent (at App.js:56) in div (at App.js:55) in App (at src/index.js:7) Consider adding an error boundary to your tree to customize error handling behavior. Visit https://fb.me/react-error-boundaries to learn more about error boundaries. 1.chunk.js (33089,11) SCRIPT5007: SCRIPT5007: Unable to get property 'data' of undefined or null reference

上記のエラーが出ます。原因がわかりません。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは

MyEventのコードで、下記の(1), (2) の2カ所が要修正かなと思われます。

(1) コンストラクター

修正前:

javascript

1construct(props){ 2 this.state = { 3 data: 'aaa' 4 }; 5}
  • constructorを、 construct と書いている。
  • super(props)を呼んでいない。

修正後:

javascript

1constructor(props){ 2 super(props); 3 this.state = { 4 data: 'aaa' 5 }; 6}

    

(2) render で返すJSXの中に {this.state} と書かれているところ

修正前:

jsx

1<p>{this.state}</p>
  • 上記のままだと Objects are not valid as a React child のエラーになるので要修正。this.state の内容を表示させたいのであれば、たとえば JSON の文字列にする。

修正後:

jsx

1<p>{JSON.stringify(this.state)}</p>

以上、参考になれば幸いです。

投稿2019/09/08 10:05

編集2019/09/08 15:59
jun68ykt

総合スコア9058

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

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

moriman

2019/09/09 02:24

回答を戴きましてありがとうございます。 戴いた指摘部分の修正で動きました。 基本的なミスで情けない思いです。 (2)のエラーなんですが、これって公式ドキュメントで説明されている部分はあるでしょうか? いつもありがとうございます。
jun68ykt

2019/09/09 03:19

コメントありがとうございます。 > (2)のエラーなんですが、これって公式ドキュメントで説明されている部分はあるでしょうか? 少し検索してみましたが、React の > 公式ドキュメント https://reactjs.org/ には、このエラーについての詳しい説明は見つからないのですが、facebook の JSXのレポジトリ https://facebook.github.io/jsx/ に、JSXの構文定義が書かれており、ここに JSXChild :  ・JSXText  ・JSXElement  ・{ JSXChildExpression opt } と書かれています。 なので、 <p>{this.state}</p> と書くと {this.state} の部分がどれにも当てはまらないので、エラーになるという理解で(とり急ぎ)よいかと思います。
moriman

2019/09/11 01:16

わかりました。ありがとうございました。
jun68ykt

2019/09/11 09:25

どういたしまして。 ちなみに先のコメントにあった、 > これって公式ドキュメントで説明されている部分はあるでしょうか? という疑問(=公式ではどこに書いてある?)を持つことは、とても良いと思います。
guest

0

javascript

1render() { 2 conosle.log(this.state); // state に何がはいっているか調べる 3 console.trace(); // どこから呼び出されているか調べる 4 return ( 5 <div> 6 <p>testtttttteee</p> 7//...

のようにして、 render が実行される際の呼び出し元と、その時の state を表示してデバッグしてみると原因はわかるかと思います。

投稿2019/09/08 05:44

編集2019/09/08 05:45
unhappychoice

総合スコア1531

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

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

moriman

2019/09/09 02:25

回答を戴きましてありがとうございました。 デバッグの方法について調べてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問