首页 > 解决方案 > 如何通过 react-crud-admin 库中的 API 调用异步获取 JSON 模式?

问题描述

我正在使用react-crud-admin库来生成 UI。有一个 get_form 方法返回用于创建反应表单的 JSON 模式。库中给出的方法仅返回硬编码的 JSON 模式。有没有办法使用异步 API 调用从文件中获取模式,而不是使用硬编码模式?

这是示例代码:

import React from "react";
import Admin from "react-crud-admin";
import Form from "react-jsonschema-form";
import "react-crud-admin/css"; //optional css import

export default class Example extends Admin {
  constructor() {
    super();
    this.name = "Contact";
    this.name_plural = "Contacts";
    this.list_display_links = ["name"];
    this.list_display = ["name", "number", "address.street"];
  }
  get_queryset(page_number, list_per_page, queryset) {
    return [
      {
        id: 1,
        name: "Ken Next",
        number: "08939303003",
        address: { street: "Hallmark Street" }
      },
      {
        id: 2,
        name: "Isa Yoll",
        number: "0908839202",
        address: { street: "Barbican Street" }
      }
    ];
  }
  get_form(object = null) {
    let schema = {
      title: this.name,
      type: "object",
      required: ["name"],
      properties: {
        id: {
          type: "number",
          title: "id",
          default: Math.floor(1000 * Math.random()) + 1
        },
        name: { type: "string", title: "Name", default: "" },
        number: { type: "string", title: "Number", default: "" },
        address: {
          type: "object",
          title: "Address",
          properties: {
            street: { type: "string", title: "Street" }
          }
        }
      }
    };

    if (!object) {
      return <Form schema={schema} />;
    } else {
      return <Form schema={schema} formData={object} />;
    }
  }
}

标签: javascriptreactjs

解决方案


是的,当然。有可能的。您可能想在 componentDidMount 中实现它。

import React from "react";
import Admin from "react-crud-admin";
import Form from "react-jsonschema-form";
import "react-crud-admin/css"; //optional css import

export default class Example extends Admin {
  constructor() {
    super();
    this.name = "Contact";
    this.name_plural = "Contacts";
    this.list_display_links = ["name"];
    this.list_display = ["name", "number", "address.street"];
  }
  get_queryset(page_number, list_per_page, queryset) {
    return [
      {
        id: 1,
        name: "Ken Next",
        number: "08939303003",
        address: { street: "Hallmark Street" }
      },
      {
        id: 2,
        name: "Isa Yoll",
        number: "0908839202",
        address: { street: "Barbican Street" }
      }
    ];
  }
  get_form(object = null) 

    if (!object) {
      return <Form schema={this.schema} />;
    } else {
      return <Form schema={this.schema} formData={object} />;
    }
  }
  componentDidMount()
  {
    fetch("/url/to/schema").then(response =>{
          if(response.ok)
          {
          response.json().then(schema => this.schema = schema)
          }
    });
  
  }
}


推荐阅读