Невозможно заполнить раскрывающийся список выбора с помощью JSON в reactJS

Я пытаюсь получить ключ «имя» и его соответствующее значение, используя JSON в раскрывающемся списке «Выбрать» reactJS. Но это не работает, когда я выполняю свой код. Я прикрепил свой код, пожалуйста, посмотрите!

Я попытался использовать componentDidMount для получения данных, выполнив вызов API. Я новичок, поэтому я пытаюсь выяснить, как заставить его работать.

class devName extends Component {
  state = {
    names: [],
    selectedName: "",
    validationError: ""
  }

  componentDidMount() {
    fetch("http://127.0.0.1:8080/dashboard/get_names")
      .then((res) => {
        return res.json();
      })
      .then(data => {
        let namesFromAPI = data.map(name => { return { value: name, display: name } })
        this.setState({ names: [{ value: '', display: '(Select the site)' }].concat(namesFromAPI) });
      }).catch(err => {
        console.log(err);
      });
  }

  render() {
    return (
      <div className="wrapper">
        <div className="form-wrapper">
          <Toolbar />
          <form className="form">
            <label className="label1">Select Name from the drop down</label> <hr />
            <div>
              <Select 
                value={this.state.selectedName}
                onChange={(e) => this.setState({selectedName: e.target.value, validationError: e.target.value === "" ? "You must select a site name" : ""})}>
                {/* placeholder="Loading Site List..." > */}
                {this.state.names.map((name) => <option key={name.value} value={name.display}>{name.display} </option>)}
              </Select>
              <div style={{color: 'red', marginTop: '5px'}}>
              {this.state.validationError}
              </div>
              <br />
            </div>
            <label className="label1">Create New Name From Template</label>
            <hr />
            <div className="addButton">
              <button type="Submit">Add</button> <hr />
            </div>
            <div className="submitButton">
              <button type="submit">Submit</button>
            </div>
          </form>
        </div>
      </div>
    );
  }
}

export default devName;

КОД JSON ВЫГЛЯДИТ:

[
    {
        "type": "state",
        "id": 2131,
        "temporaryEle": {},
        "name": "First Unit#1234 TON" .. and so on
    }
]

Сообщение об ошибке отсутствует. Хотя желаемый результат должен быть «Выбрать раскрывающийся список, заполняется: «Выберите одно из имен, пожалуйста»

First Unit#1234 TON
Second Unit#8934 QON
Third Unit#6534 JON

person Shivani Bali    schedule 21.10.2019    source источник


Ответы (2)


Редактировать: я прочитал один из ваших комментариев, и мне кажется, что у вас возникли проблемы CORS с выборкой.

Добавьте baseurl в качестве прокси в файл package.json.

// Package.json

{
  ...other configs,
  "proxy": "http://127.0.0.1:8080"
}

Затем вы бы назвали свою выборку так: fetch('/dashboard/get_names').then((res) => {...})

Ресурс для просмотра:

https://create-react-app.dev/docs/proxying-api-requests-in-development/

Старый:

В соответствии с вашими данными JSON вам, возможно, придется удалить более глубокий уровень вашего объекта при отображении данных в componentDidMount

let namesFromAPI = data.map(({name}) => { 
  return { value: name, display: name } 
})

// OR

let namesFromAPI = data.map(name => { 
  return { value: name.name, display: name.name } 
})
person Shawn Yap    schedule 21.10.2019
comment
Да, я пробовал деструктурировать, не получилось. Может ли это быть связано с проблемой соединения между реакцией и JSON? Завершен ли мой запрос на выборку? должен ли он включать заголовки и GET? - person Shivani Bali; 22.10.2019
comment
Привет, я попытался добавить URL-адрес прокси-сервера в файл package.json также в проекте django, но он выдает ту же ошибку CORS: 1 Доступ к выборке по адресу '127.0.0.1:8080/dashboard/get_names' из источника 'localhost:3000» заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Если непрозрачный ответ соответствует вашим потребностям, установите для режима запроса значение «no-cors», чтобы получить ресурс с отключенным CORS. - person Shivani Bali; 28.10.2019
comment
У вас есть код на github, который я мог бы посмотреть? Вы можете обойти это в разработке, используя надстройки/плагины браузера CORS: CORS Everywhere и Allow-Control-Allow-Origin. - person Shawn Yap; 28.10.2019
comment
Эй, я не могу поделиться, так как это частное репо. Но если вам нужен определенный набор кода, я могу им поделиться. Кроме того, проблема CORS не появляется для другой выборки API, но для этого конкретного. - person Shivani Bali; 30.10.2019
comment
Проблема была решена путем добавления и включения расширения браузера: Moesif CORS. Каким-то образом я столкнулся с проблемой 401 (Неавторизованный) при получении API get, что, я думаю, связано с тем, что время учетных данных выходит. - person Shivani Bali; 31.10.2019
comment
Таким образом, проблему CORS я мог исправить, добавив заголовок в проект package.json (под реакцией). заголовки: {Access-Control-Allow-Origin: *}, - person Shivani Bali; 01.11.2019

Используйте деструктирование параметра имени, вы можете неявно возвращать объект из функции стрелки, когда вы заключаете его в () data.map(({name}) => ({ value: name, display: name }))

person Jacek Rojek    schedule 21.10.2019
comment
Спасибо, попробовал деструктурировать, не получилось. Может ли это быть связано с проблемой соединения между реакцией и JSON? Завершен ли мой запрос на выборку? должен ли он включать заголовки и GET? - person Shivani Bali; 22.10.2019
comment
@ShivaniBali, вы пытались вывести значение data на консоль перед выполнением функции карты? Каков ответ сервера, когда вы открываете ссылку в браузере? GET — заголовок по умолчанию - person Jacek Rojek; 22.10.2019
comment
Я попытался распечатать его, и он выдает ошибку CORS, которая случалась и раньше, но я решил ее, добавив расширение Chrome и фрагмент кода: CORS_ORIGIN_ALLOW_ALL = True CORS_ORIGIN_WHITELIST = \ ('localhost:8000',) На этот раз ошибка говорит то же самое: Доступ к выборке по адресу '127.0.0.1:8000/eai_shortcuts/get_sites' из источника 'localhost:3000» заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Не удалось получить! Я ищу, как это можно исправить, потому что предыдущее исправление на этот раз не работает. - person Shivani Bali; 22.10.2019