前提・実現したいこと
投稿されているテキストを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);
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/17 02:38
2019/09/17 03:26