成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

React-Simple-Form輪子第一版釋出

IntMain / 1290人閱讀

摘要:嗯,可能也是最后一版。。。用例用法接受一個(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.js
import 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 (
      
{ this.instance=instance; }} initialValues={{ name: true }}/>
) } }
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ě)在formonSubmit事件中。

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

相關(guān)文章

  • CentOS 生產(chǎn)環(huán)境配置

    摘要:最新的已經(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 年生命周期中 ...

    daydream 評(píng)論0 收藏0
  • 精彩文章賞析 - 收藏集 - 掘金

    摘要:掘金原文地址譯文出自掘金翻譯計(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)本地更改... ...

    godiscoder 評(píng)論0 收藏0
  • Python發(fā)布自己的模塊到Pypi

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

    zsy888 評(píng)論0 收藏0
  • React造輪子:拖拽排序組件「Dragact」

    摘要:造輪子的一些思考首先,我們的需求是用戶(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=...

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

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

0條評(píng)論

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