异步调用完成后呈现功能组件的一部分

时间:2019-06-02 18:08:17

标签: javascript reactjs material-ui react-component react-async

我正在将material-ui与react功能组件一起使用,并使用其Autocomplete组件。我对其进行了自定义,并且每当更改输入字段中的文本时,我都希望该组件呈现新的搜索结果。

callAPI("xyz")

我在操作中调用API,并使用xyz参数,在此功能组件中调用了dispatch方法。

这里的问题是,当组件进行调用时,应该等待API响应然后呈现结果,但是它得到了未解决的承诺,因此呈现失败。

<Paper square>
    {callAPI("xyz").results.map(
        result => console.log(result);
    )}
</Paper>

由于结果是未解决的承诺,因此将无法映射。 我需要一种方法来仅在数据可用时调用地图,或者在数据存在之前显示一些文本,然后在获取数据后进行更改。

任何纠正此代码的建议都会很有帮助。

编辑:

function IntegrationDownshift() {
    return (
        <div>
            <Downshift id="downshift-simple">
                {({
                    getInputProps,
                    getItemProps,
                    getMenuProps,
                    highlightedIndex,
                    inputValue,
                    isOpen,
                    selectedItem
                }) => (
                    <div>
                        {renderInput({
                            fullWidth: true,
                            InputProps: getInputProps({
                                placeholder: "Search users with id"
                            })
                        })}

                        <div {...getMenuProps()}>
                            {isOpen ?
                                 <Paper square>
                                {callAPI(inputValue).users.map(
                                    (suggestion, index) =>
                                        renderSuggestion({
                                            suggestion,
                                            index,
                                            itemProps: getItemProps({
                                                item:
                                                    suggestion.userName
                                            }),
                                            highlightedIndex,
                                            selectedItem
                                        })
                                )}
                            </Paper>  
                             : null}
                        </div>
                    </div>
                )}
            </Downshift>
        </div>
    );
}

2 个答案:

答案 0 :(得分:1)

反应16.8引入了Hooks

  

挂钩是使您“挂钩” React状态和生命周期的函数   功能组件的功能。

因此,您拥有useState(),可以用一个空数组声明一个状态变量,并在useEffect()中调用您的API,以便在从API获得响应时填充该状态:

except

有关钩子的更多信息:https://reactjs.org/docs/hooks-intro.html

答案 1 :(得分:0)

处理此问题的最简单方法是使用特南里语表达 还有一种最佳实践,即以生命周期方法调用API请求,然后将结果保存在本地状态。

componentDidMount() {
    callAPI("xyz").results.map(
        result => this.setState(result);

}

<Paper square>
    {this.state.results ?
      this.state.results.map(
        result => console.log(result);
      : <p> Loading... </p>
    )}
</Paper>