cheese/amis实现一个form渲染的简易分析

技术栈:vue/mtd-vue
其它渲染分析见 AMIS实现渲染一个button的源码分析-Vue

一、schema

{
      "type": "form",
      "title": "",
      "api": "get:/mock/saveForm?a=11",
      "mode": "horizontal",
      "actions": [
        {
          "type": "submit",
          "label": "提交"
        }
      ],
     "controls": [
            {
              "label": "姓名",
              "name": "name1",
              "required": true,
              "type": "text"
            }
          ]
    }

二、form渲染器

通过schema中type=form找到form渲染器,开始渲染。

Form/index.tsx

@registRenderer({
  name: 'form',
  test: /(?:^|\/)form$/,
})

mounted () {
	// 暂存当前渲染器,以便运行时操作
	this.scoped && this.scoped.registerComponent(this);
}
beforeDestroy() {
    this.scoped && this.scoped.unRegisterComponent(this);
  }

render () {
	// this.$props.config
	 return (
      <RenderNode
        props={{
          path:  'panel-form' ,
          schema: {
            ...this.$props.config,
            name: name && `basic-form-${name}`,
            data: null,
          },
          onSubmit: this.handleFormSubmit, // 传递submit时的函数
          onRequestAction: this.handleFormAction // 表单处理的action
        }}
      ></RenderNode>
    )
}

三、找到panel-form并渲染

这里会渲染两个大组件:button和basic-form。
通过schema.actions渲染button等操作组件;
通过schema.controls渲染form、form-item。

其中button为一个普通组件,将form信息和onSubmit方法传入,就可处理form提交操作。
basic-form为一个FinalForm组件(引自vue-final-form包)包裹着mtd-form,校验使用FinalForm,样式item使用mtd-form。

basic-form.tsx
render () {
	return (
      <FinalForm
        ref={'finalForm'}
        {...finalFormConf} // finalFormConf 包含mtd-form
      />
    );
}
这里是一个使用 AMIS一个基于 React 的低代码 UI 框架)实现新建数据库表的示例: 首先,你需要安装 AMIS: ``` npm install amis@next ``` 然后,你需要编写一个 JSON 配置文件来定义表单,可以参考以下示例: ```json { "type": "form", "api": "/api/createTable", "title": "新建数据库表", "controls": [ { "type": "text", "name": "tableName", "label": "表名", "required": true }, { "type": "select", "name": "tableType", "label": "表类型", "options": [ { "label": "InnoDB", "value": "InnoDB" }, { "label": "MyISAM", "value": "MyISAM" } ], "value": "InnoDB" }, { "type": "textarea", "name": "tableDesc", "label": "表描述" }, { "type": "button", "label": "提交", "primary": true, "actionType": "submit" } ] } ``` 这个配置文件定义了一个使用 POST 请求提交表单数据到 `/api/createTable` 接口的表单,包含了表名、表类型和表描述三个字段。 接下来,你需要在后端实现 `/api/createTable` 接口来处理表单数据,这里以 Flask 为例: ```python from flask import Flask, jsonify, request app = Flask(__name__) @app.route('/api/createTable', methods=['POST']) def create_table(): tableName = request.form['tableName'] tableType = request.form['tableType'] tableDesc = request.form.get('tableDesc') # TODO: 在数据库中新建表 return jsonify({"success": True}) ``` 在这个例子中,我们从表单数据中获取了表名、表类型和表描述字段,并在数据库中新建了表。在实际应用中,你需要根据自己的需求来实现这个接口。 最后,你需要在前端加载这个表单并显示出来: ```javascript import React from 'react'; import amis from 'amis'; const schema = { // 这里填写之前定义的 JSON 配置文件内容 }; amis.embed('#root', schema); ``` 这个例子中使用了 `amis.embed` 方法来将表单渲染到指定的 DOM 元素中。你需要将 `#root` 替换为你想要显示表单的 DOM 元素的 ID。 这样,一个使用 AMIS 实现的新建数据库表的示例就完成了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值