【问题标题】:data not loading onto list from API [ReactJs]数据未从 API [ReactJs] 加载到列表中
【发布时间】:2019-10-24 09:38:07
【问题描述】:

所以我目前正在开发一个从 API 检索对象的管理控制面板。

API 有两个不同的端点,它们是:

http://localhost:3000/videos
http://localhost:3000/manuals

API 都返回带有“id、url、title 和 thumbnailUrl”等数据集的对象

我有一个模块负责卡片,代码如下:

export interface Manual {
  id?: string | number;
  url: string;
  title: string;
  thumbnail?: string | null;
}

我有一个模块负责创建实际的 HelpCard 组件 然后将 HelpCard 组件加载到我的 HelpList 组件中 最后,我有我的 HelpAdmin.view 模块,它将所有这些结合在一起

问题是,即使我打电话给一个

console.log(this.props.data);

在我的 HelpList 模块中,我返回 8 个空数组,如下所示:

[]
length: 0
__proto__: Array(0)

我很好奇为什么我的视频/手册卡实际上没有显示在我的列表中?

提前感谢您的阅读和帮助。

【问题讨论】:

  • 在 HelpAdminView 中,您有空的手册和视频处于状态,您将这个空数组传递给您的 HelpList 组件。但正如我所见,您可以通过在 HelpList 组件中调用 api 来获取视频和手册。
  • @SuleymanSah 那么你建议我如何解决这个问题?
  • 在 cmets 中很难解释,所以我添加了作为答案。

标签: javascript reactjs typescript


【解决方案1】:

手册和视频数据处于 HelpList 组件的状态,但您使用的 this.props.data.map 使用 data={this.state.videos} 从 HelpListAdmin 中为空。

所以你需要在你的 HelpList 组件的渲染中像这样替换相关代码。

              {this.state.manuals.map((card: Manual) => (
                <HelpCard
                  card={card}
                  key={card.id}
                  deleteProduct={this.props.onDelete}
                  editProduct={this.props.onEdit}
                  type={this.props.type}
                />
              ))}

但是如果你想在你的 HelpAdminView 组件中管理状态,你需要在这个组件而不是 HelpList 组件中进行 api 调用。

而且我认为您应该将状态保留在父级 (HelpAdminView) 中,并将手册和视频传递给 HelpList 组件。

因此您需要将此代码从 HelpList 移动到 HelpAdminView。

  async componentDidMount() {
    const res = await axios.get(this.state.url);
    this.setState({ card: res.data });
    this.loadAdminHelpCard("videos");
    this.loadAdminHelpCard("manuals");

    //console.log(res.data);
  }


  loadAdminHelpCard = (type: "videos" | "manuals"): void => {
    const baseApiUrl = `http://localhost:3000`;
    const url = `${baseApiUrl}/${type}`;
    axios
      .get(url)
      .then((res) => {
        this.setState({ [type]: res.data } as any);
      })
      .catch(function(error) {
        // handle error
        console.log(error);
      });
  };

移除 HelpList 组件中的状态。

并将视频和手册作为道具(就像您现在所做的那样)传递给 HelpList 组件。

      <div className="listDisplay">
            <div>
              <div style={{ textAlign: "center" }}>
                <h2>Videos</h2>
              </div>
              <HelpList
                data={this.state.videos}
                type="videos"
                onEdit={this.editProduct}
                onDelete={this.deleteProduct}
              />
            </div>
            <div>
              <div style={{ textAlign: "center" }}>
                <h2>Manuals</h2>
              </div>
              <HelpList
                data={this.state.manuals}
                type="manuals"
                onEdit={this.editProduct}
                onDelete={this.deleteProduct}
              />
            </div>
          </div>

并在 HelpList 组件中使用这个道具(就像你现在所做的那样)。

export default class HelpList extends Component<Props, State> {

  static props: any;

  render() {
    console.log(this.props.data);

    return (
      <React.Fragment>
        {this.state.card ? (
          <div className="row">
            {this.props.data.map((card: Manual) => (
              <HelpCard
                card={card}
                key={card.id}
                deleteProduct={this.props.onDelete}
                editProduct={this.props.onEdit}
                type={this.props.type}
              />
            ))}
          </div>
        ) : (
          <h1>
            <br></br>Loading Cards...
          </h1>
        )}
      </React.Fragment>
    );
  }
}

【讨论】:

    【解决方案2】:

    您正在调用 HelpList 组件中的 API 并将其设置为 state 在您的 HelpAdminView 组件中,您的手册状态是一个空数组并将其作为数据道具传递,因为您不更新它,它将保持为空,

    您可以在 HelpAdminView 组件中调用 API,然后将其作为道具传递给您的 HelpList 组件

    希望对你有帮助

    【讨论】:

    • 所以你是说我应该在我的 HelAdminView 中执行 LoadAdminHelpCard 功能?
    • 是的,那么您将在道具中传递卡片。调用容器中的api
    • ibtsam,我已经编辑了我的问题以显示后续内容,希望您能提供更多帮助
    • 哦,我只需要在我的 组件调用中声明“loadAdminHelpCard={this.loadAdminHelpCard}”,它现在似乎在调用我的卡片,但是卡片是空的,没有标题, imageurl 或 url 已设置。
    • 我还将负责创建卡片的代码添加到我的问题的已编辑部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2022-09-24
    • 2016-08-19
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多