ホームページ  >  記事  >  ウェブフロントエンド  >  jsのカスタムreactデータ検証コンポーネントとは(詳しい説明)

jsのカスタムreactデータ検証コンポーネントとは(詳しい説明)

青灯夜游
青灯夜游転載
2018-10-18 17:53:512362ブラウズ

この記事では、カスタム React データ検証コンポーネントとは何かを紹介します。困っている友人は参考にしていただければ幸いです。

フロントエンド フォームを送信するとき、フォーム内のデータを検証するという問題がよく発生します。ユーザーが送信したデータが不正な形式(形式が間違っている、数値以外のタイプ、最大長を超えている、必須フィールド、最大値と最小値を超えているなど)である場合、当社は該当する場所に迅速な情報を提供する必要があります。ユーザーがデータを修正した場合、プロンプト メッセージも非表示になります。

ノックアウト フレームワークを使用している場合は、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 フレームワークを使用する場合、上記のノックアウトと同様の機能をどのように実現できるでしょうか?この比較的独立した関数を抽出し、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 入力された値が有効な通貨形式であることを確認します。通貨形式は小数点以下 2 桁までの数値である必要があります。 ############ 使い方?

    親コンポーネントの 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## に追加します。親コンポーネント # の

onChange

イベントを input コントロールにバインドして、ユーザーがテキスト ボックス内のコンテンツを変更すると、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。