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
      />
    );
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值