无法运行共享下拉列表的函数

问题描述 投票:0回答:1

我将我的 api 调用函数作为 prop 从 form.js 文件传递到下拉组件中,以便动态地从数据库检索数据并填充我的下拉选项,如下面的代码所示

<th><Dropdown label="Select Item Type" data={this.state.itemList} api={itemsName} valueCallBack={this.handleItemType}/></th>

“itemsName”是从我的 api 文件导入的函数。 API代码如下:

export var itemsName = async() => {
  var response = await axios.get("http://localhost:9000/itemsName");
  const data = response.data;
  return data.items;
}

这是下拉组件的代码

import react from 'react';
export default class Dropdown extends react.Component{

    constructor(props){
        super(props);
        this.state = {
            data: [],
        }

    };

    shareValue(e){
        this.props.valueCallBack(e.target.value);
    };
    
    componentDidMount(){
        let response = this.props.api()
        this.setState({data: response})
    }

    render(){
            if(this.state.data === null){
                return <div>Loading...</div>
            }
            else{
            return  <>
                        <div className="form-group">
                            <select className="form-control" id="exampleFormControlSelect1" onChange={(e) => this.shareValue(e)}>
                                {
                                    this.state.data.map((item, index) =>
                                    <option key={index}>{item}</option>
                                )}
                            </select>
                        </div>
                    </>
            }
    }
}

但是 React 一直抛出错误“TypeError: this.props.api is not a function

有人可以帮助我理解我的错误吗?我对此很陌生

javascript reactjs react-props
1个回答
0
投票

在代码中未包含在问题中您正在从

api
导入默认导出:

import demo from "./api";

(对于问题中的代码,您将其称为

itemsName
而不是
demo
。)

但是,

api
没有默认导出。它仅具有命名导出。你可以像这样导入它:

import { demo } from "./api";

下一个问题将是你如何使用该功能:

let response = this.props.api()
this.setState({data: response})

api()
是一个
async
函数,因此它返回一个
Promise
Promise
对于
render
函数来说不是很有用(并且没有
.map()
函数)。如果您想要该 Promise
结果
,那么您需要
await
它或通过
.then()
回调来跟进。例如:

this.props.api().then(response => this.setState({data: response}));
© www.soinside.com 2019 - 2024. All rights reserved.