UNPKG

lm-form

Version:

* 作者:liuduan * 邮箱:liuduan.05.05@163.com * 版本:**`1.0.2`**

219 lines (177 loc) 10.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _jsxFileName = 'src/validate.js'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _validate = require('./validate.rule'); var _validate2 = _interopRequireDefault(_validate); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ValidateHoc = function ValidateHoc(Form, rules) { var validRules = rules ? Object.assign({}, _validate2.default, rules) : _validate2.default; return function (_Component) { _inherits(ValidateHoc, _Component); function ValidateHoc(props) { _classCallCheck(this, ValidateHoc); var _this = _possibleConstructorReturn(this, (ValidateHoc.__proto__ || Object.getPrototypeOf(ValidateHoc)).call(this, props)); _this.formValidate = _this.formValidate.bind(_this); _this.inputValidate = _this.inputValidate.bind(_this); _this.timer = null; return _this; } _createClass(ValidateHoc, [{ key: 'componentWillUnmount', value: function componentWillUnmount() { clearTimeout(this.timer); } // 表单提交校验方法 }, { key: 'formValidate', value: function formValidate() { var _this2 = this; var validData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; return new Promise(function (resolve, reject) { var flag = true, query = {}, msg = void 0; var i = 0, len = validData.length; var _loop = function _loop() { var item = validData[i]; var ref = item.ref, name = item.name, value = item.value, rule = item.rule, param = item.param, required = item.required, err = item.err, requireMsg = item.requireMsg, errMsg = item.errMsg; // 判断是否需要验证 if (required || rule) { var _inputValidate = _this2.inputValidate({ value: value, rule: rule, param: param, required: required, err: err, errMsg: errMsg, requireMsg: requireMsg }), isValid = _inputValidate.isValid, message = _inputValidate.message; if (!isValid) { _this2.validateRef.setState(_defineProperty({}, err, true)); // 自动选中错误项焦点,异步执行,防止先与onBlur事件执行 clearTimeout(_this2.timer); _this2.timer = setTimeout(function () { if (ref && ref.inputRef) ref.inputRef.focus(); }, 0); msg = message === 'required' && requireMsg ? requireMsg : message; flag = false; reject(msg); return 'break'; } // 验证通过将其添加到query中 if (name) query[name] = typeof value === "string" ? value.trim() : value; } }; for (i; i < len; i++) { var _ret = _loop(); if (_ret === 'break') break; } // 校验成功 提交表单 if (flag) { resolve(query); } }); } // errMsg 、 rule 统一为数组类型 }, { key: 'stirngToArr', value: function stirngToArr(value) { if (typeof value === 'string' && value || Object.prototype.toString.call(value) === '[object Array]' && value.length || typeof value === 'function') { return [].concat(value); } else { return []; } } // input校验方法 }, { key: 'inputValidate', value: function inputValidate(_ref) { var value = _ref.value, rule = _ref.rule, _ref$param = _ref.param, param = _ref$param === undefined ? [] : _ref$param, required = _ref.required, err = _ref.err, errMsg = _ref.errMsg; var isValid = true, message = '', rules = [], errMsgs = []; // 支持 多种 规则校验 rules = this.stirngToArr(rule); errMsgs = this.stirngToArr(errMsg); var noEmpty = Object.prototype.toString.call(value) === '[object Array]' && value.length || typeof value === 'string' && value !== '' || typeof value === 'number' || typeof value === 'boolean' && value; // 先判断是否必填 if (!noEmpty && required) { isValid = false; message = 'required'; // 判断是否符合检验规则 } else if (noEmpty && rules.length) { var i = 0, len = rules.length; for (i; i < len; i++) { // 现在已有的规则函数中查找,找不到,判断rule是不是函数 var validateFun = validRules[rules[i]] || rules[i]; if (validateFun && typeof validateFun === 'function') { var validateObj = validateFun(value, param); if (Object.prototype.toString.call(validateObj) === '[object Object]') { isValid = !!validateObj.validator; message = errMsgs[i] || validateObj.message || '输入不符合规则'; } else { isValid = !!validateObj; message = errMsgs[i] || '输入不符合规则'; } // 如果验证通过但仍爆红,自动处理 if (err && isValid && this.validateRef.state[err]) this.validateRef.setState(_defineProperty({}, err, false)); // 如果验证没有通过直接返回 if (!isValid) break; } } } else if (noEmpty && rule instanceof RegExp) { // 支持正值表达式直接校验 isValid = rule.test(value); message = errMsgs[0] || '输入不符合规则'; // 如果验证通过但仍爆红,自动处理 if (err && isValid && this.validateRef.state[err]) this.validateRef.setState(_defineProperty({}, err, false)); } return { isValid: isValid, message: message }; } }, { key: 'render', value: function render() { var _this3 = this; var others = { inputValidate: this.inputValidate }; if (Form.name !== 'InputValidate') { Object.assign(others, { formValidate: this.formValidate }); } return _react2.default.createElement(Form, Object.assign({}, this.props, others, _defineProperty({ ref: function ref(el) { return _this3.validateRef = el; }, __source: { fileName: _jsxFileName, lineNumber: 129 }, __self: this }, '__self', this))); } }]); return ValidateHoc; }(_react.Component); }; exports.default = ValidateHoc; module.exports = exports['default'];