摘要:嗯,可能也是最后一版。。。用例用法接受一個參數。和上面的作用一樣,相同的會覆蓋中的值寫在的事件中。或者,會在提交的時候調用,形參為中的數據,和一樣。參考上面的例子獲取所有的數據獲取所有改變過的數據
嗯,可能也是最后一版。。。哈哈~~~只是寫著玩
簡化版的redux-form,只是覺得不需要redux-form那么復雜的功能,也不想要和redux關聯,而且希望有一個簡單管理form的東西,所以就寫了一個。肯定有很多不足,比如checkbox/radio group怎么管理。。。沒有解決。。。
import React from "react"; export default function reactForm(options){ const { fields=[], initialValues={}, validate, validateOnBlur, withRef } = options; return (Component)=>{ class Form extends React.Component { constructor(props) { super(props); this.initialValues = { ...initialValues, ...props.initialValues }; this.state = this.getInitialFields(); this.touchedKeys = {}; } componentWillReceiveProps(nextProps){ if(this.props.initialValues != nextProps.initialValues) { this.initialValues = { ...initialValues, ...nextProps.initialValues }; this.resetForm(); } } getInitialFields = ()=>{ return fields.reduce((prev, key)=>{ prev[key] = typeof this.initialValues[key] == "undefined" ? undefined : this.initialValues[key]; return prev; }, {}) } resetForm = ()=>{ this.setState(this.getInitialFields()); } setInstance = (instance)=>{ this.instance = instance; } getInstance = ()=>{ if(withRef) return this.instance; console.error("Can not get instance when withRef is false"); } getValues = ()=>{ return fields.reduce((prev, key)=>{ prev[key] = this.state[key]; return prev; }, {}); } getTouchedValues = ()=>{ let result = {}; for(let key in this.touchedKeys) { if(this.touchedKeys.hasOwnProperty(key)){ result[key] = this.state[key]; } } return result; } onFieldChange = (e, key)=>{ let value = ["radio", "checkbox"].includes(e.target.type) ? e.target.checked : e.target.value; console.log(`trigger field change with ${key} ${value}`); this.setState({ [key]: value }, ()=>{ this.touchedKeys[key] = true; }); validate && validate(key, value); } onFieldBlur = (e, key)=>{ let value = ["radio", "checkbox"].includes(e.target.type) ? e.target.checked : e.target.value; validateOnBlur(key, value); } handleSubmit = (fn)=>{ if(typeof fn == "function") { return (e)=>{ e.preventDefault(); e.stopPropagation(); fn(this.getValues()); } } else { fn.preventDefault(); fn.stopPropagation(); } } buildFields = ()=>{ return fields.reduce((prev, key)=>{ let value = this.state[key]; let field = { onChange: (e)=>{ this.onFieldChange(e, key) } }; if(typeof value === "boolean") field.checked = value; else field.value = value; if(validateOnBlur) field.onBlur = (e)=>{ this.onFieldBlur(e, key) }; prev[key] = field; return prev; }, {}) } buildProps = (props)=>{ let _props = { ...props }; _props.fields = this.buildFields(); _props.handleSubmit = this.handleSubmit; _props.getValues = this.getValues; _props.getTouchedValues = this.getTouchedValues; _props.resetForm = this.resetForm; if(withRef) { _props.ref = this.setInstance; } return _props; } render(){ let props = this.buildProps(this.props); return; } } return Form; } }
用例:
index.jsimport React from "react"; import Form from "./form"; export default class FormApp extends React.Component { constructor(props) { super(props); } onClick = ()=>{ console.log(this.instance.getTouchedValues()); } render(){ return (form.js) } }
import React from "react"; import reactForm from "components/react-form"; function validate(key, value){ console.log(`validateOnBlur ${key} ${value}`); } @reactForm({ fields: ["name", "bbb"], withRef: true, initialValues: { bbb: "bbbbbb" }, validateOnBlur: validate }) export default class Form extends React.Component { constructor(props) { super(props); } onSubmit = (values)=>{ console.log(values); let { getTouchedValues } = this.props; console.log(getTouchedValues()); this.props.resetForm(); } render(){ let { fields: { name, bbb }, handleSubmit } = this.props; return () } }
用法:
@reactForm(options)
options: { fields: ["field1", "field2", "field3", "checkbox"...], // names of fields initialValues: { "field1":"value1", "field2":"value2", "checkbox":true }, // the initial values of fields validate: fn, // the function will be called when onChange validateOnBlur: fn, // the function will be called when onBlur withRef: false // when this is true, you can get the inner component by using getInstance }
Component 接受一個initialValues參數。和上面的initialValues作用一樣,相同的key會覆蓋option.initialValues中的值
API
handleSubmit, 寫在form的onSubmit事件中。
onSubmit={handleSumit}或者onSubmit={handleSubmit(fn)},fn會在form提交的時候調用,形參為form中的數據
fields,和redux-form一樣。參考上面的例子
getValues 獲取所有的數據
getTouchedValues 獲取所有改變過(onChange)的數據
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82589.html
摘要:最新的已經釋出,更新了,非常贊。不過目前尚未釋出,等待中。初始配置對于一般配置來說,不需要安裝倉庫,本文主要在于希望跟隨的配置流程,緊跟紅帽公司對于服務器的配置說明。 原文來自靜雅齋,轉載請注明出處。 生產環境和開發環境測試環境都不一樣,所以配置都不能隨意,對于大多數情況來說,RHEL 絕對是一個最佳選擇,除了最穩定的內核發布和最全的驅動支持,還能享受到 RHEL 10 年生命周期中 ...
摘要:掘金原文地址譯文出自掘金翻譯計劃譯者請持續關注中文維護鏈接獲取最新內容。由于以下的瀏覽器市場份額已逐年下降,所以對于瀏覽器技巧三視覺效果前端掘金揭秘學習筆記系列,記錄和分享各種實用技巧,共同進步。 沉浸式學 Git - 前端 - 掘金目錄 設置 再談設置 創建項目 檢查狀態 做更改 暫存更改 暫存與提交 提交更改 更改而非文件 歷史 別名 獲得舊版本 給版本打標簽 撤銷本地更改... ...
摘要:學習我們已經感受到他的強大之處,內置模塊和強大的第三方模塊,省去了我們重復造輪子的過程,誰沒有一顆想造輪子的心,今天來發布一個自己的輪子先解釋下是官方的第三方庫的倉庫,所有人都可以下載第三方庫或上傳自己開發的庫到。 學習Python我們已經感受到他的強大之處,內置模塊和強大的第三方模塊,省去了我們重復造輪子的過程,but 誰沒有一顆想造輪子的心,今天來發布一個自己的輪子 先解釋下PyP...
摘要:造輪子的一些思考首先,我們的需求是用戶能夠方便的調整后臺的各種表盤位置。內的所有組件必須不能重疊,還要能自動排序某些組件要可以設定靜態的,也就是固定在那里,不被布局的任何變動而影響。為了快速獲得這種心態的轉變,你要做的就是造輪子。 先來一張圖看看: showImg(https://segmentfault.com/img/remote/1460000013305417?w=600&h=...
閱讀 1751·2021-09-28 09:43
閱讀 1111·2021-09-23 11:22
閱讀 2707·2021-09-14 18:05
閱讀 1823·2019-08-30 15:52
閱讀 2812·2019-08-30 10:55
閱讀 2007·2019-08-29 16:58
閱讀 1323·2019-08-29 16:37
閱讀 3031·2019-08-29 16:25