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

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

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

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

JavaScript

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

React.js

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

Q&A

解決済

1回答

3127閲覧

setStateしたstateがundefinedになってしまう

wisheebell

総合スコア7

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2019/09/16 16:05

前提・実現したいこと

投稿されているテキストをreactで表示させるコンポーネントを作っています。
実際に表示させてみると this.state.post.user.id の値がundefinedになってしまいます。
setStateが実行される前にrenderが実行されているのではと思い、constructor内でsetStateを記述してみたのですが、同じ結果になってしまいました。
ちなみにconsole.log(response)の内容は正常に表示されているので、そもそも値が存在しないということは無いかと思います。

どのようにすればエラーを解消できるでしょうか?

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

Uncaught TypeError: Cannot read property 'id' of undefined

ソースコード

javascript

1import React, { Component } from 'react'; 2import axios from 'axios'; 3import { withRouter } from 'react-router-dom'; 4import { makeStyles } from '@material-ui/core/styles'; 5import Card from '@material-ui/core/Card'; 6import CardActions from '@material-ui/core/CardActions'; 7import CardContent from '@material-ui/core/CardContent'; 8import Button from '@material-ui/core/Button'; 9import Grid from '@material-ui/core/Grid'; 10import Typography from '@material-ui/core/Typography'; 11 12class Show extends Component { 13 constructor(props){ 14 super(props); 15 this.state = { 16 post: {}, 17 date: '' 18 }; 19 axios 20 .get(`http://192.168.99.100:3001/posts/${this.props.match.params.id}`) 21 .then((results) => { 22 console.log(results); 23 var t = new Date(results.data.created_at); 24 var year = t.getFullYear(); 25 var month = t.getMonth() + 1; 26 var day = t.getDate(); 27 var date = year + "/" + month + "/" + day 28 console.log(results.data.user.id) 29 this.setState({post: results.data, date: date}); 30 }) 31 .catch((data) =>{ 32 console.log(data); 33 }); 34 } 35/* 36 componentDidMount() { 37 axios 38 .get(`http://192.168.99.100:3001/posts/${this.props.match.params.id}`) 39 .then((results) => { 40 console.log(results); 41 var t = new Date(results.data.created_at); 42 var year = t.getFullYear(); 43 var month = t.getMonth() + 1; 44 var day = t.getDate(); 45 var date = year + "/" + month + "/" + day 46 console.log(results.data.user.id) 47 this.setState({post: results.data, date: date}); 48 }) 49 .catch((data) =>{ 50 console.log(data); 51 }); 52 } 53*/ 54 deletePost = () => { 55 return this.props.deletePost(this.props.match.params.id) 56 } 57 58 editPost = () => { 59 this.props.history.push(`/posts/${this.props.match.params.id}/update`); 60 } 61 62 editButton = (postUserId, currentUserId) => { 63 if(currentUserId === postUserId){ 64 return( 65 <Grid item> 66 <Button onClick={this.editPost}> 67 Edit 68 </Button> 69 <Button onClick={this.deletePost}> 70 Delete 71 </Button> 72 </Grid> 73 ); 74 }else{ 75 return( 76 <Grid item/> 77 ); 78 } 79 } 80 81 render(){ 82 const classes = makeStyles({ 83 card: { 84 minWidth: 275, 85 }, 86 bullet: { 87 display: 'inline-block', 88 margin: '0 2px', 89 transform: 'scale(0.8)', 90 }, 91 title: { 92 fontSize: 14, 93 }, 94 pos: { 95 marginBottom: 12, 96 }, 97 }); 98 99 return( 100 <Card className={classes.card}> 101 <CardContent> 102 <Typography variant="h4" component="h2"> 103 {this.state.post.title} 104 </Typography> 105 </CardContent> 106 107 <CardActions> 108 <Grid container justify="space-between"> 109 <Grid item> 110 <Typography variant="h6" component="h6"> 111 {this.state.post.user.id} 112 </Typography> 113 </Grid> 114 {this.editButton(this.state.post.user.id, this.props.currentUser.id)} 115 </Grid> 116 </CardActions> 117 118 <hr/> 119 120 <CardContent> 121 <Typography color="textSecondary" > 122 {this.state.date} 123 </Typography> 124 <Typography variant="h6" component="p"> 125 {this.state.post.content} 126 </Typography> 127 </CardContent> 128 </Card> 129 ); 130 } 131} 132 133export default withRouter(Show);

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

ご質問の 「発生している問題・エラーメッセージ」に記載されている

Uncaught TypeError: Cannot read property 'id' of undefined

は、

this.state.post.user.id の値がundefined

という意味のエラーではなく、undefinedである値(具体的には、axiosのレスポンスでsetStateされる前のthis.state.post.user)の id プロパティを参照しようとしたことによるエラーです。

どのようにすればエラーを解消できるでしょうか?

constructor() で、初期stateを設定している箇所を、以下のように修正して、axios によるレスポンスによって setState されるよりも前の render() においても、 this.state.post.user が undefined にならないようにします。

修正前:

javascript

1this.state = { 2 post: {}, 3 date: '' 4 };

上記で、 post に空オブジェクトを設定しているのを、以下のように、空オブジェクトを値とする user プロパティを含むオブジェクトに修正します

修正後:

javascript

1this.state = { 2 post: { user: {} }, 3 date: '' 4 };

この修正で、

Uncaught TypeError: Cannot read property 'id' of undefined

のエラーを回避できると思います。

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

投稿2019/09/16 16:29

編集2019/09/17 05:34
jun68ykt

総合スコア9058

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

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

wisheebell

2019/09/17 02:38

勉強になりました! ありがとうございます
jun68ykt

2019/09/17 03:26

どういたしまして。解決したようでよかったです????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問