Итак, у меня есть эта конечная точка: http://127.0.0.1:8000/api/materials который вернет этот ответ json:
{
"data": [
{
"uuid": "05a36470-d0a0-11e7-91b4-ff3d7d9f961a",
"title": "Apple",
"viewing_time": 15,
"description": "",
"organization_id": null,
"created_at": "2017-11-24 06:45:36",
"updated_at": "2017-11-24 06:45:36",
"deleted_at": null
},
{
"uuid": "2048f730-bfa0-11e7-95fb-6dceb95ba437",
"title": "Banana",
"viewing_time": 15,
"description": "It's a fruit",
"organization_id": null,
"created_at": "2017-11-02 15:33:31",
"updated_at": "2017-11-02 15:33:31",
"deleted_at": null
},
{
"uuid": "3b6a1020-d0a0-11e7-b6bb-d77fc76d610b",
"title": "Strawberry",
"viewing_time": 15,
"description": "",
"organization_id": null,
"created_at": "2017-11-24 06:47:06",
"updated_at": "2017-11-24 06:47:06",
"deleted_at": null,
},
Я хочу выбрать все заголовки и сделать их вариантами. и это моя функция, в которой вызывается axios:
materialList = () => {
var token = localStorage.getItem('jwt');
var apiBaseUrl = "http://127.0.0.1:8000/api/materials";
var config = {
headers: {
'Authorization': "bearer " + token,
'Accept': 'application/json',
'Content-Type': 'application/json',
},
withCredentials: false
}
axios.get(apiBaseUrl, config)
.then(function (response) {
console.info(response);
})
.catch(function (error) {
console.info(error);
});
}
и здесь я хочу, чтобы названия (Apple, Banana и Strawberry) отображались:
<Form.Input list='material' placeholder='Material' name = "material_id" id = "material_id" onChange = {this.onChange}/>
<datalist id='material_id'>
<option value=/** What do I put here **/ />
</datalist>
Я использовал axios при отправке запроса на публикацию в api, но могу ли я вызвать запрос на получение axios, как только страница загрузится, чтобы я мог получить нужный заголовок?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Сначала добавьте в свой штат массив options.
Затем в вашей функции axios:
axios.get(apiBaseUrl, config)
.then(response => {
this.setState({
options: response.data.map(item => item.title),
});
})
Наконец, в вашем компоненте пользовательского интерфейса (при условии, что вы сделали options ранее доступным как переменную с тем же именем):
const optionList = options.map(option => <option value = {option} />)
render() {
return (
// Other JSX here..
<datalist id='material_id'>
{optionList}
</datalist>
)
}
Что касается срабатывания запроса API при загрузке страницы: Ознакомьтесь с методами жизненного цикла React. https://reactjs.org/docs/react-component.html
В этом случае я бы выбрал метод componentDidMount ():
componentDidMount() {
this.materialList();
}
Если вы не планируете использовать redux для сохранения состояния, вам, вероятно, потребуется вызвать здесь setState (), чтобы сохранить результат вашего запроса в состоянии вашего компонента (как описано Нико).
Я предполагаю, что код jsx, который вы публикуете, - это то, что находится внутри вашей функции рендеринга компонента.
Если вам нужны данные из внешнего источника и вы хотите сделать HTTP-запрос для получения этих данных при каждом монтировании компонента. Возможно, вы захотите получить данные внутри componentDidMount, сохранить их в своем состоянии и использовать в своей функции рендеринга, пример можно найти ниже:
class YourComponent {
// Use componentDidMount to get the data via axios
componentDidMount() {
// ... Your code to prepare the axios call
/*
* Use arrow function to keep refer to React component `this`
* and sae the response data to the component state
*/
axios.get(apiBaseUrl, config)
.then(
response => this.setState({options: response.data})
)
.catch(function (error) {
// handle the error here
});
}
render() {
// Options will have the same format as your response data
const { options } = this.state;
return (<datalist id='material_id'>
{options.map(option =>
<option value = {/* can be any attribute you want from the result object, like id, title, ..etc*/}>
{option.title}
</option>)}
</datalist>);
}
}
Сначала создайте в вашем компоненте переменную состояния, как показано ниже.
constructor(props) {
super(props);
this.state = {
options: []
}
}
Теперь вы можете использовать componentDidMount () для получения этих значений из API, как показано ниже.
componentDidMount() {
const token = localStorage.getItem('jwt');
const apiBaseUrl = "http://127.0.0.1:8000/api/materials";
const config = {
headers: {
'Authorization': "bearer " + token,
'Accept': 'application/json',
'Content-Type': 'application/json',
}
}
axios.get(apiBaseUrl, config)
.then((response) => {
this.setState({
options: response.data
})
})
.catch((error) => {
console.info(error);
});
}
Теперь вы можете использовать эту переменную состояния для отображения в опции.
render() {
const { options } = this.state;
return(
<Form.Input list='material' placeholder='Material' name = "material_id" id = "material_id" onChange = {this.onChange}>
{options.map((item, index) => <option key = {index} value = {item.uuid}>{item.title}</option>)}
</Form.Input>
)
}
но теперь он говорит, TypeError: options.map не является функцией
Используйте это так: {options && options.map((item, index) => <option key = {index} value = {item.uuid}>{item.title}</option>)}
И вы можете использовать тег html Выбирать, а не Form.Input.
Сначала проверьте, что вы получаете в ответ? эта ошибка возникает, потому что в параметрах нет данных, поэтому проверьте, правильно ли вы получаете ответ от axios
И я установил параметры для response.data в зависимости от предоставленного вами ответа json. Так что проверьте, правильно ли это
но теперь он говорит TypeError: options.map не является функцией