在 React Router v4 中渲染异步组件

Render async component in React Router v4

我想根据从 api 接收到的负载渲染一个组件,如下所示

<Route path="/foo/bar" render={() => {
  return (get('/some/api').then((res) => {
    return <Baz data={res.data} />
          }).catch((err) => console.log))
        }} />

但我收到错误消息:

Objects are not valid as a React child (found: [object Promise]). If you 
meant to render a collection of children, use an array instead. 

即使我确实将 Baz 包装在 []

不幸的是,最新版本的 React - 16。异步渲染还不是一个选项。

使用 React Router v4,Route 组件的 render 道具需要一个有效的 React 元素或 React 元素数组 returned,因此,它不接受函数中的 Promise 对象 return。

但是,使用当前版本的 React 和 React Router 并非不可能实现您想要的。您只需要稍微调整一下代码。你的 render 应该 return 一个 React 组件,而不是 return 一个 Promise,然后你可以根据该组件内部的异步值进行条件渲染。

它应该看起来像:

<Route path="/foo/bar" render={BazWrapper} />


class BazWrapper extends React.Component {

    // Do asynchronous action here
    async componentDidMount() {
       try {
          const apiValue = await get('/some/api');
          this.setState({ apiValue })
       } catch(err) {
          // error handling
       }
    }

    render() {
        const { apiValue } = this.state; 
        return <Baz data={apiValue} />;
    }

}

通过在异步调用完成后调用 setState,您可以让 React 组件知道数据已准备就绪,它应该重新渲染组件。