2016-07-18 4 views
0

Скажите, что я имел следующий JSON файл:Использование React для вызова Nested API?

{ 
"farmer": [ 
{ 
"crops": "corn" 
} 
], 
"activities":{ 
"hobbies": "swimming" 
}, 
"name: Todd" 
} 

Я хотел бы знать, как совершать звонки на них с помощью React. Моя лучшая попытка, как показано ниже.

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} будет работать, как это было написано. Однако я не уверен, как выразить последние два {this.state.activities.hobbies} и {this.state.farmer[0].crops} с использованием синтаксиса React.

Я написал их, надеюсь, способом, который выражает то, что я пытаюсь достичь с каждым звонком.

EDIT: Специфическая ошибка, которая возникает из последних двух, указывает, что они не определены.

EDIT: Итак, у меня есть второй, который добавляет пустое начальное состояние.

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

Однако это оставляет последний, который все еще возвращает ошибку.

+1

Все, что находится между '{...}', это обычный JavaScript (нет конкретного синтаксиса React). 'this.state.activities.hobbies' и т. д. будут работать до тех пор, пока данные существуют. Я предполагаю, что при первоначальном рендере данные не существуют. В этом случае вам сначала нужно подумать о том, как должен выглядеть пользовательский интерфейс, если данных нет. Тестирование на существование данных/свойств работает как обычно, например. '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

Проблема в том, что вы используете componentDidMount, когда вы должны использовать componentWillMount. Ознакомьтесь с the documentation по этим методам жизненного цикла.

Это то, что документация говорит о componentDidMount

Вызывается один раз, только на клиенте (не на сервере), сразу же после того, как происходит начальный рендеринг.

Это означает, что при первом визуализации ваши состояния не объявляются, если вы раньше не использовали getInitialState (еще один метод жизненного цикла).

Я просто сделал это:

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

, и я был в состоянии использовать this.state.farmer[0].crops в моем методе визуализации

EDIT:

быть ясным. Если вам необходимо получить данные после визуализации компонента, вам необходимо указать значения по умолчанию для состояний, которые вы используете в рендеринге. Это может быть достигнуто с помощью getInitialState:

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

Итак, я пытаюсь разместить пустое начальное состояние. Где я делал «действия:», «как бы я сделал это для« farmer [0] .crops'? –

+1

Это неправильное решение. Использование 'componentDidMount' является правильным, поскольку OP делает запрос Ajax. Использование 'componentWillMount' здесь не поможет. Я имею в виду, вы * можете * использовать его, но это не поможет, так как Ajax является асинхронным. Если вы хотите предоставить начальное состояние, сделайте это с помощью 'getInitialState'. –

+1

В ответе я также упоминаю, что чтобы они объявили, прежде чем вы сможете использовать getInitialState. Я использую более широкий подход к объяснению, что делать –

Смежные вопросы