首頁 >web前端 >js教程 >js中什麼是自訂react資料驗證元件(詳解)

js中什麼是自訂react資料驗證元件(詳解)

青灯夜游
青灯夜游轉載
2018-10-18 17:53:512442瀏覽

本篇文章帶給大家的內容是介紹什麼是自訂react資料驗證元件。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。

我們在做前端表單提交時,常常會遇到要對表單中的資料進行校驗的問題。如果使用者提交的資料不合法,例如格式不正確、非數字類型、超過最大長度、是否必填項、最大值和最小值等等,我們需要在相應的地方給出提示資訊。如果使用者修正了數據,我們也要將提示訊息隱藏起來。

有一些現成的插件可以讓你非常方便地實現這一功能,如果你使用的是knockout框架,那麼你可以藉助於Knockout-Validation這一插件。使用起來很簡單,例如我下面的這一段程式碼:

ko.validation.locale('zh-CN');
ko.validation.rules['money'] = {
    validator: function (val) {        
       if (val === '') return true;        return /^\d+(\.\d{1,2})?$/.test(val);
    },
    message: '输入的金额不正确'};
ko.validation.rules['moneyNoZero'] = {
    validator: function (val) {        
        if (val === '') return true;        return isNaN(val) || val != 0;
    },
    message: '输入的金额不能为0'};
ko.validation.registerExtenders();var model = {
    MSRP: ko.observable(0),
    price: ko.observable().extend({ required: true, number: true, min: 10000, money: true, moneyNoZero: true }),
    licence_service_fee: ko.observable().extend({ required: true, money: true }),
    purchase_tax: ko.observable().extend({ required: true, money: true }),
    vehicle_tax: ko.observable().extend({ required: true, money: true }),
    insurance: ko.observable().extend({ required: true, money: true }),
    commercial_insurance: ko.observable().extend({ required: true, money: true }),
    mortgage: ko.observable(''),
    interest_discount: ko.observable(''),
    allowance: ko.observable().extend({ money: true }),
    special_spec_fee_explain: ko.observable(''),
    has_extra_fee: ko.observable(false),
    is_new_energy: ko.observable(false)
};

model.extra_fee_explain = ko.observable().extend({
    required: {
        onlyIf: function () {            
           return model.has_extra_fee() === true;
        }
    }
});

model.extra_fee = ko.observable().extend({
    required: {
        onlyIf: function () {           
            return model.has_extra_fee() === true;
        }
    },
    money: {
        onlyIf: function () {            
            return model.has_extra_fee() === true;
        }
    }
});

model.new_energy_allowance_explain = ko.observable().extend({
    required: {
        onlyIf: function () {            
            return model.is_new_energy() === true;
        }
    }
});

model.total_price = ko.computed(function () {   
   var _total = Number(model.price()) + Number(model.licence_service_fee()) +Number(model.purchase_tax()) + Number(model.vehicle_tax()) +Number(model.insurance()) + Number(model.commercial_insurance());    
        if (model.has_extra_fee()) {
        _total += Number(model.extra_fee());
    }    
    if (model.is_new_energy()) {
        _total -= Number(model.new_energy_allowance());
    }    
    return isNaN(_total) ? '0' : _total.toFixed(2).replace(/(\.0*$)|(0*$)/, '');
});

model.errors = ko.validation.group(model);
ko.applyBindings(model);

更多使用方法可以查看github上的說明文件和範例。

但是,如果我們前端使用的是React框架,如何實現和上面knockout類似的功能呢?我們可以考慮將這個相對獨立的功能抽出來,寫成一個React元件。看下面的程式碼:

class ValidationInputs extends React.Component {
  constructor(props) {
    super(props);    this.state = {
      isValid: true,
      required: this.props.required,
      number: this.props.number,
      min: this.props.min,
      max: this.props.max,
      money: this.props.money,
      data: null,
      errors: ""
    }
  }

  componentWillReceiveProps(nextProps) {   
    var that = this;    
    if (this.state.data !== nextProps.data) {      
      return setStateQ({data: nextProps.data}, this).then(function () {        
           return that.handleValidation();
      });
    }
  }

  handleValidation() {    var fields = this.state.data;    // required validation
    if(this.state.required && isNilOrEmpty(fields)){      
        return setStateQ({errors: '必须填写', isValid: false}, this);

    }    
    // number validation
    if (this.state.number) {      
      if (isNaN(fields)) {        
         return setStateQ({errors: '请输入数字', isValid: false}, this);
      }      
      if (!isNilOrEmpty(this.state.min) && !isNaN(this.state.min) && Number(this.state.min) > Number(fields)) {       
        return setStateQ({errors: '输入值必须大于等于' + this.state.min, isValid: false}, this);
      }      
      if (!isNilOrEmpty(this.state.max) && !isNaN(this.state.max) && Number(this.state.max) < Number(fields)) {        
         return setStateQ({errors: &#39;输入值必须小于等于&#39; + this.state.max, isValid: false}, this);
      }
    }    // money validation
    if (this.state.money) {      
         if (fields.length > 0 && !/^\d+(\.\d{1,2})?$/.test(fields)) {        
             return setStateQ({errors: '输入的金额不正确', isValid: false}, this);
         }
    }   
     return setStateQ({errors: '', isValid: true}, this);
  }

  render() {    return <span className="text-danger">{this.state.errors}</span>  }
}

該元件支援的驗證項目有:

  • #required:true | false 檢查是否必填項。

  • number:true | false 檢查輸入的值是否為數字。

    • 如果number為true,可透過max和min來驗證最大值和最小值。 max和min屬性的值都必須為一個有效的數字。

  • money:true | false 驗證輸入的值是否為有效的貨幣格式。貨幣格式必須為數字,最多允許兩位小數。

  如何使用?

  我們在父元件的render()方法中加入該元件的參考:

<p className="item">
    <p className="col-xs-4">净车价:</p>
    <p className="col-xs-7">
        <input type="text" className="form-control" placeholder="0" value={this.state.price} onChange={this.changePrice.bind(this)}/>
        <ValidationInputs ref="validation1" data={this.state.price} required="true" number="true" min="10000" max="99999999" money="true"/>
    </p>
    <p className="col-xs-1 text-center">元</p>
    <p className="clear"></p></p>

我們將price變數加到父元件的state中,並給input控制項綁定onChange事件,以便使用者在修改了文字方塊中的內容時,price變數的值可以即時傳入到ValidationInputs元件中。這樣,ValidationInputs元件就可以立即透過自己的handleValidation()方法對傳入的資料按照預先設定的規則進行驗證,並決定是否顯示錯誤訊息。

注意,這裡我們在引用ValidationInputs元件時,設定了一個ref屬性,這是為了方便在父元件中獲得ValidationInputs組件的驗證結果(成功或失敗)。我們可以在父元件中透過下面這個方法來進行判斷(假設父元件中引用了多個ValidationInputs元件,並且每個引用都設定了不同的ref值):

// 父组件调用该方法来判断所有的输入项是否合法
checkInputs() {    
    for (var r in this.refs) {        
         var _ref = this.refs[r];        
         if (_ref instanceof ValidationInputs) {            
              if (!_ref.state.isValid) return false;
        }
    }    
    return true;
}

這樣,我們在父元件提交資料之前,可以透過這個方法來判斷所有的資料項目是否都已經通過驗證,如果未通過驗證,則不提交表單。

以上是js中什麼是自訂react資料驗證元件(詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除