摘要:高階組件實(shí)現(xiàn)表單雙向綁定最終使用效果使用說(shuō)明使用修飾器語(yǔ)法后直接將受控組件形式如放在里無(wú)需再給寫入和。通過(guò)內(nèi)部保存一個(gè)上一次的來(lái)判斷是否變化。
React高階組件實(shí)現(xiàn)表單雙向綁定 最終使用效果:
import React from "react"; import Item from "./Item"; import { formCreate } from "./formCreate"; @formCreate export default class FromDemo extends React.Component { render() { return(使用說(shuō)明:) } } this.props.handleSubmit(fields => console.log(fields))}>handleSubmit
使用@formCreate(ES6修飾器語(yǔ)法)后, 直接將React受控組件(onChange & value 形式)如放在
通過(guò)this.props.handleSubmit()獲取form的值。
import React from "react"; export const formCreate = WrappedComponent => class extends React.Component { state = { fields: {} }; onChange = fieldName => value => this.setFieldValue(fieldName, value); handleSubmit = callback => callback(this.state.fields); getFieldValue = () => this.state.fields; setFieldValue = (fieldName, value) => this.setState(state => { state.fields[fieldName] = value; return state; }); getField = fieldName => ({onChange: this.onChange(fieldName), value: this.state.fields[fieldName]}); setInitialValue = (fieldName, value) => this.setFieldValue(fieldName, value); render() { const props = { ...this.props, handleSubmit: this.handleSubmit, getField: this.getField, getFieldValue: this.getFieldValue, setFieldValue: this.setFieldValue, setInitialValue: this.setInitialValue, }; returnItem.jsthis.instanceComponent = ref} />; } };
import React from "react"; export default class Item extends React.Component { form = this.props.children._owner.stateNode.props; componentDidMount() { this.updateInitialValue(); } componentDidUpdate() { this.updateInitialValue(); } updateInitialValue() { let { fieldName, initialValue } = this.props; (this.initialValue !== initialValue) && (this.initialValue = initialValue) && this.form.setInitialValue(fieldName, initialValue); } render() { let { title, fieldName } = this.props; return(說(shuō)明) } }{title}{React.cloneElement(this.props.children, { ...this.form.getField(fieldName) })}
此處通過(guò)抽離state的方式將{onChange, value}以props.getField回調(diào)的形式傳遞給受控組件。
initialValue通過(guò)Item內(nèi)部保存一個(gè)上一次的initialValue來(lái)判斷是否變化。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/92481.html
摘要:擅長(zhǎng)網(wǎng)站建設(shè)微信公眾號(hào)開發(fā)微信小程序開發(fā)小游戲制作企業(yè)微信制作建設(shè),專注于前端框架服務(wù)端渲染技術(shù)交互設(shè)計(jì)圖像繪制數(shù)據(jù)分析等研究。 Ant Design of React @3.10.9 拉取項(xiàng)目 luwei.web.study-ant-design-pro, 切換至 query 分支,可看到 Form 表單實(shí)現(xiàn)效果 實(shí)現(xiàn)一個(gè)查詢表單 showImg(https://segmentfau...
摘要:帶來(lái)的重要的改變我認(rèn)為有三點(diǎn)解決了回調(diào)地獄箭頭函數(shù)語(yǔ)法糖更好地解決了指向問(wèn)題,并簡(jiǎn)化表達(dá)式寫法使進(jìn)入面向?qū)ο缶幊谭桨敢患热挥辛耍敲匆粋€(gè)視圖出來(lái)不就可以了采用原來(lái)的結(jié)構(gòu),控制視圖,并且負(fù)責(zé)與層通信每一個(gè)頁(yè)面都是一個(gè),頁(yè)面之間都通訊用事件訂閱 ES6 ES6帶來(lái)的重要的改變我認(rèn)為有三點(diǎn): promise/generator/async解決了回調(diào)地獄(callback hell) => ...
摘要:事件系統(tǒng)合成事件的綁定方式合成事件的實(shí)現(xiàn)機(jī)制事件委派和自動(dòng)綁定。高階組件如果已經(jīng)理解高階函數(shù),那么理解高階組件也很容易的。例如我們常見(jiàn)的方法等都是高階函數(shù)。對(duì)測(cè)試群眾來(lái)說(shuō),從質(zhì)量保證的角度出發(fā),單元測(cè)試覆蓋率是 事件系統(tǒng) 合成事件的綁定方式 `Test` 合成事件的實(shí)現(xiàn)機(jī)制:事件委派和自動(dòng)綁定。 React合成事件系統(tǒng)的委托機(jī)制,在合成事件內(nèi)部?jī)H僅是對(duì)最外層的容器進(jìn)行了綁定,并且依賴...
摘要:在模式中一般把層算在層中,只有在理想的雙向綁定模式下,才會(huì)完全的消失。層將通過(guò)特定的展示出來(lái),并在控件上綁定視圖交互事件,一般由框架自動(dòng)生成在瀏覽器中。三大框架的異同三大框架都是數(shù)據(jù)驅(qū)動(dòng)型的框架及是雙向數(shù)據(jù)綁定是單向數(shù)據(jù)綁定。 MVVM相關(guān)概念 1) MVVM典型特點(diǎn)是有四個(gè)概念:Model、View、ViewModel、綁定器。MVVM可以是單向綁定也可以是雙向綁定甚至是不綁...
摘要:另外,內(nèi)置的函數(shù)在經(jīng)過(guò)一系列校驗(yàn)后,觸發(fā),之后被更改,之后依次調(diào)用監(jiān)聽,完成整個(gè)狀態(tài)樹的更新。總而言之,遵守這套規(guī)范并不是強(qiáng)制性的,但是項(xiàng)目一旦稍微復(fù)雜一些,這樣做的好處就可以充分彰顯出來(lái)。 這一篇是接上一篇react進(jìn)階漫談的第二篇,這一篇主要分析redux的思想和應(yīng)用,同樣參考了網(wǎng)絡(luò)上的大量資料,但代碼同樣都是自己嘗試實(shí)踐所得,在這里分享出來(lái),僅供一起學(xué)習(xí)(上一篇地址:個(gè)人博客/s...
閱讀 2137·2023-04-26 00:23
閱讀 807·2021-09-08 09:45
閱讀 2435·2019-08-28 18:20
閱讀 2542·2019-08-26 13:51
閱讀 1595·2019-08-26 10:32
閱讀 1392·2019-08-26 10:24
閱讀 2027·2019-08-26 10:23
閱讀 2196·2019-08-23 18:10