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

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

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

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

Q&A

解決済

1回答

6452閲覧

reactで、apiから取得したjsonの要素にアクセスできない。

ShinyaMurakami

総合スコア13

React.js

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

0グッド

0クリップ

投稿2016/09/13 08:48

reactで、デモを作成しようとしています。

djang rest apiから、下記のようなjsonを受け取ります。

json

1{ 2 "company": { 3 "name": "会社名", 4 "code": 0, 5 "type": "" 6 }, 7 "risk_category": 1, 8 "rank": "D", 9 "title": "見出し", 10 "contents": "本文", 11 "date": "2016-08-31T04:04:05Z" 12}

javaScript

1class RiskDetailBox extends Component { 2 constructor(props) { 3 super(props); 4 this.state = { 5 risk: {} 6 }; 7 } 8 9 loadRiskFromServer(id) { 10 $.ajax({ 11 url: "http://127.0.0.1:8000/api/risks/"+id, 12 dataType: 'json', 13 cache: false, 14 success: data => this.setState({risks: data}), 15 error: (xhr, status, err) => console.error(this.props.url, status, err.toString()) 16 }); 17 } 18 19 componentDidMount() { 20 this.loadRiskFromServer(this.props.params.id); 21 } 22 23 componentWillReceiveProps() { 24 this.loadRiskFromServer(this.props.params.id); 25 } 26 27 render() { 28 console.log(this.state.risk); 29 return ( 30 <div className="wrapper subpageheader mdl-cell--12-col"> 31 <h1>Risk</h1> 32 <RiskDetailTable data={this.state.risk} /> 33 </div> 34 ); 35 } 36} 37 38 39class RiskDetailTable extends Component { 40 render() { 41 // 下のjsでmapだとうまくいけるのか?っとtryしてみましたが当然だめでした。 42 let riskNodes = [this.props.data].map(risk => { 43 return ( 44 <RiskBody company={risk.company.name} title={risk.title} date={risk.announcement_date} /> 45 ); 46 }); 47 return ( 48 <table className="mdl-data-table mdl-js-data-table mdl-shadow--2dp"> 49 <tbody>{riskNodes}</tbody> 50 </table> 51 ); 52 } 53} 54 55 56class RiskBody extends Component { 57 58 render() { 59 return ( 60 <tbody> 61 <tr> 62 <th class="mdl-data-table">企業名</th> 63 <td>{this.props.company}</td> 64 </tr> 65 <tr> 66 <th class="mdl-data-table">業種</th> 67 <td></td> 68 </tr> 69 <tr> 70 <th class="mdl-data-table">記事掲載日時</th> 71 <td class="mdl-data-table">{this.props.date}</td> 72 </tr> 73 <tr> 74 <th class="mdl-data-table">記事</th> 75 <td class="mdl-data-table">{this.props.title}</td> 76 </tr> 77 </tbody> 78 ) 79 } 80} 81 82export default RiskDetailBox; 83

company.nameを出力したいのですが、
company配下にアクセスしようとすると、
DetailPage.js:86 Uncaught TypeError: Cannot read property 'name' of undefined
となり、出力できません。

上記のjsonをリスト形式で、受け取り下記のコードで一覧表示させた場合には、company.nameに問題なくアクセスできました。

javaScript

1import React, {Component} from 'react'; 2import './App.css'; 3import $ from 'jquery'; 4import { Link } from 'react-router'; 5 6const styles = { 7 propContainer: { 8 width: 200, 9 overflow: 'hidden', 10 margin: '20px auto 0', 11 }, 12 propToggleHeader: { 13 margin: '20px auto 10px', 14 }, 15}; 16 17class RiskListTable extends Component { 18 constructor(props) { 19 super(props); 20 this.state = { 21 risks: [] 22 }; 23 } 24 25 loadRisksFromServer() { 26 $.ajax({ 27 url: "http://127.0.0.1:8000/api/risks/", 28 dataType: 'json', 29 cache: false, 30 success: data => this.setState({risks: data}), 31 error: (xhr, status, err) => console.error(this.props.url, status, err.toString()) 32 }); 33 } 34 35 componentDidMount() { 36 this.loadRisksFromServer(); 37 } 38 39 render() { 40 return ( 41 <div className="wrapper subpageheader mdl-cell--12-col"> 42 <h1>Risks</h1> 43 <Link to="/detail/100">detail</Link> 44 <RiskList data={this.state.risks} /> 45 </div> 46 47 ); 48 } 49} 50 51class RiskList extends Component { 52 render() { 53 console.log(this.props.data[0]); 54 let riskNodes = this.props.data.map(risk => { 55 return ( 56 <Risk company={risk.company.name} key={risk.id} title={risk.title} date={risk.announcement_date} /> 57 ); 58 }); 59 return ( 60 <table className="mdl-data-table mdl-js-data-table mdl-shadow--2dp"> 61 <thead> 62 <tr> 63 <th className="mdl-data-table">企業名</th> 64 <th className="mdl-data-table">記事掲載日時</th> 65 <th className="mdl-data-table">見出し</th> 66 </tr> 67 </thead> 68 <tbody>{riskNodes}</tbody> 69 </table> 70 ); 71 } 72} 73class Risk extends Component { 74 75 render() { 76 return ( 77 <tr> 78 <td class="mdl-data-table">{this.props.company}</td> 79 <td class="mdl-data-table">{this.props.date}</td> 80 <td class="mdl-data-table">{this.props.title.substring(0,70)}</td> 81 </tr> 82 ) 83 } 84} 85 86export default RiskListTable; 87

アドバイス、ご指摘お願いします。

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

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

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

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

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

guest

回答1

0

自己解決

this.state = {
risk: []
};
に変更したら、出力できました><

reactについて整理しないとだめだな・・・

投稿2016/09/13 10:17

ShinyaMurakami

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問