This post is the continuation from the previous post - Learn ReactJS 17 + react-jsonschema-form + typescript
The previous exercise is based on the usage section in the react-jsonschema-form project documentation. That example declares the schema in the code and initializes the component with that hard-coded schema. Is it possible to place the schema JSON file in the public directory and load it as needed?
Move out the schema
create a folder assets
under public
directory and create the schema file ./public/assets/testschema.json
with the following content:
{ "title": "Todo", "type": "object", "required": ["title"], "properties": { "title": { "type": "string", "title": "Title", "default": "A new task" }, "done": { "type": "boolean", "title": "Done?", "default": false } } }
Load the schema then Set the form schema
In order to load the json file, I use fetch(), the following code will read the file and cast the json object to JSONSchema type:
fetch("/assets/testschema.json") .then((r) => r.json()) .then((data) => { let schema = data as JSONSchema7; // Load or update the form schema });
Make the component properties to handle the form schema
Expose the <Form>
schema property in <MyFrom>
:
function MyFrom(props: any) { return ( <Form schema={props.schema} onChange={log("changed")} onSubmit={log("submitted")} onError={log("errors")} /> ); }
Put it together
import React from "react"; import ReactDOM from "react-dom"; import Form from "@rjsf/bootstrap-4"; import { JSONSchema7 } from "json-schema"; import "./index.scss"; const jsonSchemaFile = "/assets/testschema.json"; const log = (type: string) => console.log.bind(console, type); function MyFrom(props: any) { return ( <Form schema={props.schema} onChange={log("changed")} onSubmit={log("submitted")} onError={log("errors")} /> ); } fetch(jsonSchemaFile) .then((r) => r.json()) .then((data) => { let schema = data as JSONSchema7; ReactDOM.render( <MyFrom schema={schema} />, document.querySelector("#root") ); });