【问题标题】:React JS - I'm having difficult to get JSON informations from API on a Select box in my projectReact JS - 我很难在我的项目的选择框中从 API 获取 JSON 信息
【发布时间】:2018-12-05 19:34:36
【问题描述】:

我是 React 和 JSON 的新手,所以我在获取 JSON 信息并将其放在我项目的 Select 内的 Option 标记上时遇到了一些麻烦。我做错了什么?

这是我的代码:

    componentWillMount() {
        this.fetchData();
      }

      fetchData() {
        fetch("https://grupoprever-api.qap/listas/estados", { mode: "cors" })
          .then(response => response.json())
          .then(parsedJSON => {
            parsedJSON.map(estado => ({
              v: `${estado.key}`,
              d: `${estado.value}`
            }));
          })

          .then(estados =>
            this.setState({
              estados
            })
          )

          .catch(error => console.log("Erro no Fetch:", error));
      }

我正在尝试将这些信息放在这里:

    <div className="meioCampo">
              <span>Estado:</span>
              <select
                id="estadosDropdown"
                onChange={e => this.setState({ escolhidoEstado: e.target.value })}
              >
                {this.state.estados.map(estado => {
                  return (
                    <option key={estado.v} value={estado.v}>
                      {estado.d}
                    </option>
                  );
                })}
              </select>
            </div>

所有这些都在一个组件内。

哦,我的JSON数据是这样的:

{

    "AC":"Acre",
    "AL":"Alagoas",
    "AM":"Amaz\u00f4nia"

}

【问题讨论】:

  • 您遇到了什么错误? api调用的数据响应有什么格式?
  • @MikeAbeln 嘿伙计!我有这个: TypeError: "parsedJSON.map is not a function" 。我的 JSON 数据是这样的: {"AC":"Acre","AL":"Alagoas","AM":"Amaz\u00f4nia"}
  • 啊!您正在尝试迭代一个对象 - 这是不可迭代的。 .map 函数在 Array 数据类型上运行,并按顺序为每个项目运行一些代码。您的 JSON 对象是一个 Object 数据类型——它没有顺序并且不能被映射。
  • @MikeAbeln 哇! D:那是真的。有没有办法像这个 json 那样做,或者我应该在数组中组织这些信息?

标签: json reactjs fetch


【解决方案1】:

您没有从 map 函数返回任何数据。

改变

.then(parsedJSON => {
    parsedJSON.map(estado => ({
      v: `${estado.key}`,
      d: `${estado.value}`
    }));
 })

.then(parsedJSON => {
    return parsedJSON.map(estado => ({
      v: `${estado.key}`,
      d: `${estado.value}`
    }));
  })

编辑:

另外请不要从componentWillMount 方法调用您的api。虽然您的代码可能正在运行,但此生命周期方法已被标记为 UNSAFE,应避免使用。改为从componentDidMount 调用您的获取请求。初始化组件的默认状态,例如:

constructor(props) {
  super(props);
  ... // your other code in constructor

  this.state = {
     estados: null,
     // add other state variables here...
  }
}

并像这样向您的 render() 方法添加“null”状态检查:

<div className="meioCampo">
  <span>Estado:</span>
  <select
    id="estadosDropdown"
    onChange={e => this.setState({ escolhidoEstado: e.target.value })}         >
      {this.state.estados && this.state.estados.map(estado => {
        return (
          <option key={estado.v} value={estado.v}>
            {estado.d}
          </option>
        );
      })}
 </select>
</div>

编辑 2:

由于您的响应正文是一个对象(不是列表),那么您可以尝试以下代码:

fetchData() {
  fetch("https://grupoprever-api.qap/listas/estados", { mode: "cors" })
    .then(response => response.json())
    .then(estados =>
       this.setState({
          estados
      })
    );

然后使用Object.keys() 方法生成您的选项列表:

render() {
   ....
  const {estados} = this.state;

  return(
    <div className="meioCampo">
      <span>Estado:</span>
      <select
        id="estadosDropdown"
        onChange={e => this.setState({ escolhidoEstado: e.target.value })}         >
          {estados && Object.keys(estados).map(key => {
            return (
              <option key={key} value={key}>
                {estados[key]}
              </option>
            );
          })}
     </select>
    </div>
  );
}

【讨论】:

  • 嘿!感谢您的回答和提示。但它在这里不起作用:(。我不断收到错误:TypeError:“parsedJSON.map 不是函数”。任何其他想法我的代码有什么问题?:/
  • 我认为我的 JSON 数据已损坏:/,请将其添加到问题正文中,如果您可以看一下,谢谢老兄。
  • 我已经为你编辑了我的答案..希望它会有所帮助..也许你需要用 JSON.parse(estados) 解析 json() 对象我不确定那个...
  • 它工作!非常感谢 !它真的对我有帮助。现在我要学习更多,并主宰这个JSON的东西哈哈。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2021-05-31
  • 2019-09-10
  • 2016-10-05
相关资源
最近更新 更多