异步承诺解决时如何更新React组件?

时间:2019-07-19 18:10:16

标签: javascript reactjs asynchronous properties async-await

可以说我有一个呈现PivotGrid组件的组件。 PivotGrid接受一些数据,即一个对象数组。

function My_component(props) {
    return <PivotGrid dataSource={props.data} />
}

但是,我要传递的data道具是异步函数的结果。

const get_data = async () => {
    return await o(url, options).get('foo').query({})
}

ReactDOM.render(<My_component data={get_data()}/>, document.getElementById('root'));

发生的事情是,组件在get_data()的承诺被解析之前就已呈现,并且PivotGrid没有数据。

我希望发生的事情是,当承诺解决并实际返回数据时,重新渲染组件。我已经尝试过React的useState()的变体来将props.data视为状态变量,以便当promise返回状态时,状态会发生变化,组件也会更新。但这还行不通。

const [gridData, setGridData] = useState(props.data);
props.data.then((r) => {
    setGridData(props.data)
})

上述所有尝试均会失败。实现此功能的最佳方法是什么,当prop.data解析并实际保存我想要的数据时,组件会重新渲染?

2 个答案:

答案 0 :(得分:1)

使用挂钩和My_component的容器组件应该可以工作。

my-component-container.js:

import React, {useState, useEffect} from 'react'
import My_component from './my-component'

export default () => {
   const [data, setData] = useState(null)
   useEffect(async () => {
     const fetchData = async () => {
         const result = await o(url, options).get('foo').query({})

         setData(result);
     };

    fetchData();
   }, [])

   return <My_component dataSource={data} />
}

在您的入口点:

import My_component_container from './my-component-container'

ReactDOM.render(<My_component_container />, document.getElementById('root'))

答案 1 :(得分:0)

为什么不更改为如下所示的有状态组件

right

}