摘要:嗯,可能也是最后一版。。。用例用法接受一個(gè)參數(shù)。和上面的作用一樣,相同的會(huì)覆蓋中的值寫(xiě)在的事件中?;蛘撸瑫?huì)在提交的時(shí)候調(diào)用,形參為中的數(shù)據(jù),和一樣。參考上面的例子獲取所有的數(shù)據(jù)獲取所有改變過(guò)的數(shù)據(jù)
嗯,可能也是最后一版。。。哈哈~~~只是寫(xiě)著玩
簡(jiǎn)化版的redux-form,只是覺(jué)得不需要redux-form那么復(fù)雜的功能,也不想要和redux關(guān)聯(lián),而且希望有一個(gè)簡(jiǎn)單管理form的東西,所以就寫(xiě)了一個(gè)??隙ㄓ泻芏嗖蛔?,比如checkbox/radio group怎么管理。。。沒(méi)有解決。。。
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 接受一個(gè)initialValues參數(shù)。和上面的initialValues作用一樣,相同的key會(huì)覆蓋option.initialValues中的值
API
handleSubmit, 寫(xiě)在form的onSubmit事件中。
onSubmit={handleSumit}或者onSubmit={handleSubmit(fn)},fn會(huì)在form提交的時(shí)候調(diào)用,形參為form中的數(shù)據(jù)
fields,和redux-form一樣。參考上面的例子
getValues 獲取所有的數(shù)據(jù)
getTouchedValues 獲取所有改變過(guò)(onChange)的數(shù)據(jù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82589.html
摘要:最新的已經(jīng)釋出,更新了,非常贊。不過(guò)目前尚未釋出,等待中。初始配置對(duì)于一般配置來(lái)說(shuō),不需要安裝倉(cāng)庫(kù),本文主要在于希望跟隨的配置流程,緊跟紅帽公司對(duì)于服務(wù)器的配置說(shuō)明。 原文來(lái)自靜雅齋,轉(zhuǎn)載請(qǐng)注明出處。 生產(chǎn)環(huán)境和開(kāi)發(fā)環(huán)境測(cè)試環(huán)境都不一樣,所以配置都不能隨意,對(duì)于大多數(shù)情況來(lái)說(shuō),RHEL 絕對(duì)是一個(gè)最佳選擇,除了最穩(wěn)定的內(nèi)核發(fā)布和最全的驅(qū)動(dòng)支持,還能享受到 RHEL 10 年生命周期中 ...
摘要:掘金原文地址譯文出自掘金翻譯計(jì)劃譯者請(qǐng)持續(xù)關(guān)注中文維護(hù)鏈接獲取最新內(nèi)容。由于以下的瀏覽器市場(chǎng)份額已逐年下降,所以對(duì)于瀏覽器技巧三視覺(jué)效果前端掘金揭秘學(xué)習(xí)筆記系列,記錄和分享各種實(shí)用技巧,共同進(jìn)步。 沉浸式學(xué) Git - 前端 - 掘金目錄 設(shè)置 再談設(shè)置 創(chuàng)建項(xiàng)目 檢查狀態(tài) 做更改 暫存更改 暫存與提交 提交更改 更改而非文件 歷史 別名 獲得舊版本 給版本打標(biāo)簽 撤銷(xiāo)本地更改... ...
摘要:學(xué)習(xí)我們已經(jīng)感受到他的強(qiáng)大之處,內(nèi)置模塊和強(qiáng)大的第三方模塊,省去了我們重復(fù)造輪子的過(guò)程,誰(shuí)沒(méi)有一顆想造輪子的心,今天來(lái)發(fā)布一個(gè)自己的輪子先解釋下是官方的第三方庫(kù)的倉(cāng)庫(kù),所有人都可以下載第三方庫(kù)或上傳自己開(kāi)發(fā)的庫(kù)到。 學(xué)習(xí)Python我們已經(jīng)感受到他的強(qiáng)大之處,內(nèi)置模塊和強(qiáng)大的第三方模塊,省去了我們重復(fù)造輪子的過(guò)程,but 誰(shuí)沒(méi)有一顆想造輪子的心,今天來(lái)發(fā)布一個(gè)自己的輪子 先解釋下PyP...
摘要:造輪子的一些思考首先,我們的需求是用戶(hù)能夠方便的調(diào)整后臺(tái)的各種表盤(pán)位置。內(nèi)的所有組件必須不能重疊,還要能自動(dòng)排序某些組件要可以設(shè)定靜態(tài)的,也就是固定在那里,不被布局的任何變動(dòng)而影響。為了快速獲得這種心態(tài)的轉(zhuǎn)變,你要做的就是造輪子。 先來(lái)一張圖看看: showImg(https://segmentfault.com/img/remote/1460000013305417?w=600&h=...
閱讀 1774·2021-09-28 09:43
閱讀 1122·2021-09-23 11:22
閱讀 2738·2021-09-14 18:05
閱讀 1832·2019-08-30 15:52
閱讀 2822·2019-08-30 10:55
閱讀 2019·2019-08-29 16:58
閱讀 1332·2019-08-29 16:37
閱讀 3045·2019-08-29 16:25