国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

React高階組件實(shí)現(xiàn)表單雙向綁定

yearsj / 1886人閱讀

摘要:高階組件實(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(
            
this.props.handleSubmit(fields => console.log(fields))}>handleSubmit
) } }
使用說(shuō)明:

使用@formCreate(ES6修飾器語(yǔ)法)后, 直接將React受控組件(onChange & value 形式)如放在里,無(wú)需再給寫入onChange和value props。
通過(guò)this.props.handleSubmit()獲取form的值。

核心實(shí)現(xiàn) formCreate.js
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,
        };
        return  this.instanceComponent = ref} />;
    }
};
Item.js
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(
            
{title}
{React.cloneElement(this.props.children, { ...this.form.getField(fieldName) })}
) } }
說(shuō)明

此處通過(guò)抽離state的方式將{onChange, value}以props.getField回調(diào)的形式傳遞給受控組件。
initialValue通過(guò)Item內(nèi)部保存一個(gè)上一次的initialValue來(lái)判斷是否變化。

更多文章 yjy5264.github.io

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/92481.html

相關(guān)文章

  • Ant-Design-組件-——-Form表單(一)

    摘要:擅長(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...

    trilever 評(píng)論0 收藏0
  • React發(fā)展幾年前的現(xiàn)狀個(gè)人理解(React新手向?qū)?

    摘要:帶來(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) => ...

    objc94 評(píng)論0 收藏0
  • React學(xué)習(xí)之漫談React

    摘要:事件系統(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)行了綁定,并且依賴...

    darkbug 評(píng)論0 收藏0
  • 前端MVVM模式及其在Vue和React中的體現(xià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可以是單向綁定也可以是雙向綁定甚至是不綁...

    沈建明 評(píng)論0 收藏0
  • 深入redux技術(shù)棧

    摘要:另外,內(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...

    imingyu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<