摘要:嵌套組件配置如果表單組件里還含有其他表單組件,這時直接通過組件配置去渲染無疑能節約不少的工作量。請輸入方法傳入組件配置的列表就能渲染出表單組件來,需要注意的是,子表單組件的一定是基于父表單組件的。表單的實例方法請看下節的生成表單四
container表單組件
在實際的項目中,JSON表單提供的表單組件是遠遠不夠的,而且提供表單組件是一件低效的事,目前Ant Design組件庫提供的表單組件就已經很實用了。
所以container提供了一套規則來自定義表單組件,來滿足實際項目中復雜且靈活的表單組件使用場景,container主要的作用有以下幾點:
自定義表單組件,例如圖片上傳組件
添加表單組件庫,例如Ant-Design
處理控制邏輯和聯動邏輯
自定義input組件import {Input} from "antd" { formKey: "test-form", ... config: [ { type: "container", dataKey: "name", label: "Param", customConfig: { // 自定義的配置 }, render: (curData, config, {changeFn, changeDataFn, getFocus, loseFocus, JSONForm, error, assistData, data}) => { return changeFn(event.target.value)} /> } } ] }render方法
render方法的參數: 1:curData,該container組件對應的值 2:config,該container的組件配置,config.customConfig是自定義配置,里面可以傳入antd的input組件的配置 3:changeFn,changeDataFn:提交數據的方法, 兩者的區別在于changeFn只能提交當前表單組件的值,changeDataFn能自定義提交的值 changeFn(value, [callback]) changeDataFn(key, value, [callback]) 4:getFocus,loseFocus:用來觸發數據校驗,loseFocus方法觸發校驗,getFocus方法來取消報錯信息 5:JSONForm是用來在render方法里渲染組件配置,即在container里嵌套組件配置 6:error:校驗報錯 7:assistData,data: 邏輯數據和表單數據表單組件庫
其實你會發現,container自定義的表單組件并不比原始表單簡單,估計你會懷疑這種實現方式的價值。的確,如果container只能這樣自定義使用我們的表單組件,那么它的實用意義的確不大。
在我的團隊項目中,大家使用的都是Ant-Design組件庫,那么接下來我們就把Ant-Design組件庫接入到JSON表單中。
首先我們創建一個組件文件,取名為antd-components.js:
import React from "react" import { Input } from "antd" export default [ { type: "antd-input", // 聲明為antd-input的自定義表單組件 render: (curData, config, {changeFn, getFocus, loseFocus, error}) => { return changeFn(event.target.value)} /> } } ]
然后在我們的項目初始化的文件中(init.js)引入該組件庫:
import Form from "json_transform_form" import components from "./antd-components" From.createCustomComp(components)
這樣我們就可以在項目的任何地方使用該組件庫:
{ formKey: "test-form", ... config: [ { type: "antd-input", // 使用antd-input表單組件 dataKey: "name", label: "Param", customConfig: {}, // 自定義配置 } ] }
你看這樣container的實用價值就體現出來了,復雜表單組件的自定義只需要編寫一次,接下來的重復使用,只需要傳入相應的配置即可。
跨項目的共用表單組件也是通過該方式實現,維護一個不同項目都可引用的組件庫文件,將常用的復雜表單組件,抽象在該組件庫文件里,然后在不同項目初始化時引入進來,這樣就能在不同項目中共用表單組件。
modifyDataFn通過container使用共用表單組件時,存在一個問題,那就是無法再次自定義表單組件的提交事件,例如:使用上面的antd-input自定義組件,該組件自動提交本組件的數據,但是如果想聯動處理其他表單,修改其他表單組件的數據,這個時候不能在組件配置里重寫render,因為組件配置里的render會覆蓋掉組件庫中的render,導致抽象出來的渲染方法失效。
modifyDataFn用來自定義提交數據,只會覆蓋render方法中的提交數據的功能。
{ formKey: "test-form", ... config: [ { type: "antd-input", // 使用antd-input表單組件 ... modifyDataFn: ({changeFn, changeDataFn}, {parent, self}) => { changeDataFn("name", self.curDAta) } } ] }
modifyDataFn的參數:
1:changeFn,changeDataF,提交數據的方法 2:parent,當該表單組件為form_array的子表單組件時,該值為form_array的組件數據 3: self,該表單組件的數據處理控制邏輯和聯動邏輯
在JSON表單的表單配置中,有assistData的選填字段,該字段為JSON表單內部處理復雜的控制邏輯所需的額外數據,該數據不會被提交和緩存。例如:在表單內存在一個刷新按鈕,點擊會刷新前一個表單組件的數據,其效果圖如下:
表單中間的刷新按鈕,可以認為是一個特殊的container表單組件,因此可以根據container來自定義該刷新按鈕:
{ formKey: "test-form", assistData: { refresh: false, }, config: [ ... { type: "container", dataKey: "assistData.refreshParam", style: { ... }, render: (curData, config, {changeFn, changeDataFn}) => { const handleClick = () => { changeDataFn("assistData.refresh" ,true) setTimeout(() => { changeDataFn("assistData.refresh" ,false) }, 1000 * 3) } return{ config.index === config.parentData.length - 1 && } }, ] }}
上面的代碼實現了刷新按鈕點擊刷新的動作,其刷新邏輯是assistData里的refresh字段控制。
注意:如果要使用assistData中的數據,其dataKey必須以assistData開頭,且必須使用changeDataFn自定義提交assistData數據。
container嵌套組件配置如果container表單組件里還含有其他表單組件,這時直接通過組件配置去渲染無疑能節約不少的工作量。
{ data: { param: { name: "" } }, config: [ { type: "container", dataKey: "param", render: (curData, config, {changeFn, changeDataFn, JSONForm}) => { return{ JSONForm([ { type: "input", dataKey: "name", placeholder: "請輸入param", validate: ["required"], } ]) }} ] }
JSONForm方法傳入組件配置的列表就能渲染出表單組件來,需要注意的是,子表單組件的dataKey一定是基于父表單組件的。
JSON表單的實例方法請看下節的JSON生成Form表單(四)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99333.html
摘要:配置表單的配置分為兩種,暫且稱描述表單信息的為表單配置,描述表單組件信息的為組件配置。組件組件主要是用來描述組件數據為數組格式的表單組件,其示例如下組件配置是基于父表單組件其效果圖如下表單的表單組件請看下節生成表單三 JSON配置 JSON表單的配置分為兩種,暫且稱描述表單信息的為表單配置,描述表單組件信息的為組件配置。JSON表單的配置一定是兩種配置的組合。 在開始講解配置之前先介紹...
摘要:介紹表單是一個基于的抽象組件,它能將格式的配置渲染為一個表單,在實際項目中,通過它可以快速的搭建出一個表單頁,這在端項目中,有著很廣泛的用途。如何使用表單的地址為。 介紹 JSON表單是一個基于React的抽象組件,它能將JSON格式的配置渲染為一個Form表單,在實際項目中,通過它可以快速的搭建出一個表單頁,這在B端項目中,有著很廣泛的用途。 JSON表單的優點有以下幾點: 可以快...
摘要:協議采用了請求響應模型。報頭分為通用報頭,請求報頭,響應報頭和實體報頭。格式支持比鍵值對復雜得多的結構化數據,這一點也很有用。例如下面這段代碼最終發送的請求是這種方案,可以方便的提交復雜的結構化數據,特別適合的接口。 一 前言 ----現在搞前端的不學好http有關的知識已經不行啦~筆者也是后知后覺,在搞node的時候意識到網絡方面的薄弱,開始學起http相關知識。這一篇是非常基礎的講...
摘要:表單實例方法靜態方法表單有一個靜態方法方法時表單的靜態方法,用來引入抽象出來的表單組件。首先需要開啟實時表單提交,在表單配置中設置為。到目前為止,表單適合大部分的表單應用場景。 JSON表單實例方法 靜態方法 json表單有一個靜態方法:createCustomComp import Form from json_transform_form import components fro...
閱讀 1544·2021-11-04 16:10
閱讀 2801·2021-09-30 09:48
閱讀 2846·2019-08-29 11:31
閱讀 1585·2019-08-28 18:22
閱讀 3235·2019-08-26 13:44
閱讀 1326·2019-08-26 13:42
閱讀 2851·2019-08-26 10:20
閱讀 762·2019-08-23 17:00