如何在 reactJS 中渲染异步函数?

时间:2021-05-26 18:20:59

标签: javascript node.js reactjs axios

我的问题如下:

我有一个异步函数,它发出一个 mysql 请求,并根据请求的结果返回不同的 DIV。

const GetData = async (idAluno, disciplina) => {
  variavel = await confereInicial(idAluno, disciplina.id);
  //console.log(variavel); imprime direitinho, sem problemas

  if (variavel.data.length === 0) {
    return (
      <DivCheckBox
        dads={dados}
        nomeDisciplina={disciplina.title}
        labelDisciplina={disciplina.label}
        id={disciplina.id}
        inicial={0}
      />
    );
  } else {
    return (
      <DivCheckBox
        dads={dados}
        nomeDisciplina={disciplina.title}
        labelDisciplina={disciplina.label}
        id={disciplina.id}
        inicial={1}
      />
    );
  }
};

并且这个函数在屏幕的渲染部分被多次调用(通过地图)。因此:

return (
  <div>
    {dados.state.nodesPadrao.map((p) => {
      return <GetData idAluno={1} disciplina={p} />;
    })}
  </div>
  ...
);

问题是,当我编译时,它出现“对象作为 react child 无效(找到:object Promise)。如果你想渲染一个孩子的集合,请改用数组。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

您需要了解函数 (GetData()) 和函数组件 (<GetData .../>) 之间的区别。

函数组件不能是 async,因为它们总是隐式地返回一个 Promise,而你不能从一个组件返回一个 Promise,因为你不能渲染一个 Promise。

您需要使用 useEffect 钩子在组件安装时加载数据,然后在加载后呈现:

const GetData = ({idAluno, disciplina}) => {
  const [variavel, setVariavel] = React.useState(null);
  React.useEffect(() => {
    confereInicial(idAluno, disciplina.id).then(setVariavel);
  }, [idAluno, disciplina.id]);
  if (variavel === null) {
    // Still loading? You could also return `null` to not render anything.
    return <>Loading</>;
  }
  return (
    <DivCheckBox
      dads={dados}
      nomeDisciplina={disciplina.title}
      labelDisciplina={disciplina.label}
      id={disciplina.id}
      inicial={variavel.data.length === 0 ? 0 : 1}
    />
  );
};

答案 1 :(得分:0)

我昨天遇到了同样的问题。你不应该在渲染函数中做异步的事情。 你应该依靠状态或道具。