2016-07-18 3 views
0

나는 다음과 같은 JSON 파일을 가지고 말 :React를 사용하여 중첩 된 API를 호출 하시겠습니까?

I 반응 사용하여 전화를 걸하는 방법을 알고 싶습니다
{ 
"farmer": [ 
{ 
"crops": "corn" 
} 
], 
"activities":{ 
"hobbies": "swimming" 
}, 
"name: Todd" 
} 

. 최선의 시도는 아래와 같습니다.

componentDidMount: function(){ 
var selfish = this; 
$.get('~~someurl~~', function(data){ 
selfish.setState(data); 
}); 
}, 

render: function(){ 
return (<div> 
<p>{this.state.name}</p> 
<p>{this.state.activities.hobbies}</p> 
<p>{this.state.farmer[0].crops}</p> 
</div>) 
} 

나는 처음으로 {this.state.name}이 작성된대로 실행됩니다. 그러나 React 구문을 사용하여 마지막 두 {this.state.activities.hobbies}{this.state.farmer[0].crops}을 표현하는 방법에 대해서는 확실치 않습니다.

저는 전화를 걸 때마다 성취하고자하는 바를 표현한 방법으로 작성했습니다.

EDIT : 후자의 두 가지 결과로 나타나는 특정 오류는 정의되지 않았습니다.

EDIT : 그래서 빈 초기 상태를 추가하여 두 번째 작업을 얻었습니다.

getInitialState: function(){ 
return {activities: '', farmer: ''} 
} 

그러나 마지막으로 오류가 반환됩니다.

+1

'{...}'사이의 모든 것은 JavaScript (특정 "React syntax"는 없습니다)입니다. 'this.state.activities.hobbies' 등은 데이터가 존재하는 한 작동 할 것입니다. 초기 렌더링에서 데이터가 존재하지 않는다고 가정합니다. 이 경우 데이터가없는 경우 UI의 모양을 먼저 생각해야합니다. 데이터/속성의 존재에 대한 테스트는 평소처럼 작동합니다 (예 : 'this.state.activities && this.state.activities.hobbies'. 그것에 대해 구체적인 반응은 없습니다. –

+0

그러면 내가 가지고있는 질문은'{this.state.name} '처럼 페이지로드 중에 이러한 호출을로드하는 방법입니다. 왜냐하면'{this.state.name} '은 내가 렌더링하자마자 바로 로딩되기 때문입니다. –

+1

초기 렌더링시 * 실행됩니다. 그러나'this.state.activities'가 처음으로 존재하지 않기 때문에 오류가 발생합니다.따라서 값이 존재하는지 여부를 미리 확인하거나 해당 검사에 따라 무언가를 렌더링해야합니다. 그렇지 않으면 구성 요소에 기본 상태를 제공해야합니다. 비어있는'this.state.activities' 객체를 사용합니다. 다음은 겪고있는 문제의 간단한 예입니다 :'var state = {}; console.log (state.activities.hobbies);''state'에는 어떤 속성도 없기 때문에 에러가 발생합니다. 이제 로깅하기 전에 초기 값이나 테스트를 추가 할 수 있습니다. –

답변

1

문제는 componentWillMount를 사용해야 할 때 componentDidMount를 사용하고 있다는 것입니다. 이 라이프 사이클 메소드에서 the documentation을 확인하십시오.

이 초기 렌더링이 발생한 후 문서 즉시 만 (가 아닌 서버) 클라이언트에 한 번 호출 componentDidMount

에 대한 말씀입니다.

즉, 이전에 getInitialState (다른 라이프 사이클 메소드)를 사용하지 않으면 상태가 선언되지 않습니다.

componentWillMount: function() { 
    this.setState({ 
     "farmer": [ 
      { 
      "crops": "corn" 
      } 
     ], 
     "activities":{ 
      "hobbies": "swimming" 
     }, 
     "name": "Todd" 
    }); 
}, 

그리고 내 렌더링 방법에

편집 this.state.farmer[0].crops을 사용할 수 있었다 :

단순히 이런 짓을

가 명확하기를. 구성 요소를 렌더링 한 후 데이터를 검색해야하는 경우 렌더링에 사용하는 상태의 기본값을 지정해야합니다. 이것은 getInitialState를 사용하여 얻을 수 있습니다 :

getInitialState: function() { 
    return { 
     "farmer": [ 
      { 
       "crops": DEFAULT_VALUE 
      } 
     ], 
     "activities":{ 
      "hobbies": DEFAULT_VALUE 
     }, 
     "name": DEFAULT_VALUE 
    }); 
}, 
+0

그래서 빈 초기 상태를 배치하려고합니다. 내가''활동 ''을했을 때,''농부 [.]. –

+1

이것은 잘못된 해결책입니다. OP가 Ajax 요청을하고 있기 때문에'componentDidMount'를 사용하는 것은 정확합니다. 'componentWillMount'를 사용하면 도움이되지 않습니다. Ajax는 비동기 적이기 때문에 사용할 수는 있지만 도움이되지는 않습니다. 초기 상태를 제공하려면'getInitialState'를 사용하십시오. –

+1

답변에서 나는 getInitialState를 사용하기 전에 선언하도록 명시했다. 나는 무엇을해야 하는지를 설명하기 위해보다 폭 넓은 접근 방법을 취하고있다. –

관련 문제