Можно ли получить значения для <options> из конечной точки, которая отправляет ответ json с помощью axios?

Итак, у меня есть эта конечная точка: 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, как только страница загрузится, чтобы я мог получить нужный заголовок?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
96
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Сначала добавьте в свой штат массив 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>);
    }
}

но теперь он говорит TypeError: options.map не является функцией

eibersji 19.09.2018 10:01
Ответ принят как подходящий

Сначала создайте в вашем компоненте переменную состояния, как показано ниже.

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 не является функцией

eibersji 19.09.2018 10:02

Используйте это так: {options && options.map((item, index) => <option key = {index} value = {item.uuid}>{item.title}</option>)}

Vinay J Rao 19.09.2018 10:12

И вы можете использовать тег html Выбирать, а не Form.Input.

Vinay J Rao 19.09.2018 10:16

Сначала проверьте, что вы получаете в ответ? эта ошибка возникает, потому что в параметрах нет данных, поэтому проверьте, правильно ли вы получаете ответ от axios

Vinay J Rao 19.09.2018 11:11

И я установил параметры для response.data в зависимости от предоставленного вами ответа json. Так что проверьте, правильно ли это

Vinay J Rao 19.09.2018 11:14

Другие вопросы по теме