├── static
└── .gitkeep
├── config
├── prod.env.js
├── dev.env.js
└── index.js
├── src
├── assets
│ ├── logo.png
│ └── highlight.pack.js
├── my-validators
│ └── validators.js
├── main.js
├── vue-validate-easy
│ ├── validateAll.js
│ ├── validatorStore.js
│ ├── validate.js
│ ├── errTip.js
│ ├── index.js
│ └── formElements.js
├── components
│ ├── my-input.vue
│ ├── code-tab.vue
│ └── custom-checks.vue
└── App.vue
├── test.js
├── t.js
├── README.md
├── .editorconfig
├── .gitignore
├── .babelrc
├── index.html
├── .postcssrc.js
├── docs
├── index.html
└── static
│ ├── js
│ ├── manifest.3ad1d5771e9b13dbdad2.js
│ └── app.a379f00e7957f3d6eeb0.js
│ └── css
│ └── app.21dd314e3c336b6e35618685db2fe00d.css
├── VUE-CLI-README.md
├── test.html
└── package.json
/static/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | module.exports = {
3 | NODE_ENV: '"production"'
4 | }
5 |
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lfyfly/vue-validate-easy/HEAD/src/assets/logo.png
--------------------------------------------------------------------------------
/test.js:
--------------------------------------------------------------------------------
1 | var a=1
2 | module.exports ={
3 | a:222,
4 | t(){
5 | console.log(a)
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/t.js:
--------------------------------------------------------------------------------
1 | var test = require('./test')
2 | test.t()
3 | test.t1= function(){
4 | console.log(this.a)
5 | }
6 | test.t1()
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vue-validate-easy
2 | ## 这是一个简单易用易扩展的vue表单验证插件
3 | ## [文档 document](https://lfyfly.github.io/vue-validate-easy/)
4 | ## [github](https://github.com/lfyfly/vue-validate-easy)
5 |
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const prodEnv = require('./prod.env')
4 |
5 | module.exports = merge(prodEnv, {
6 | NODE_ENV: '"development"'
7 | })
8 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | /dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Editor directories and files
9 | .idea
10 | .vscode
11 | *.suo
12 | *.ntvs*
13 | *.njsproj
14 | *.sln
15 |
--------------------------------------------------------------------------------
/src/my-validators/validators.js:
--------------------------------------------------------------------------------
1 | export default {
2 | // 以下方法只是做测试用
3 | aaa(val) {
4 | return val != 'aaa' && '要等于aaa'
5 | },
6 | bbb(val) {
7 | return val != 'bbb' && '要等于bbb'
8 | },
9 | ccc(val) {
10 | return val != 'ccc' && '要等于ccc'
11 | },
12 | }
13 |
--------------------------------------------------------------------------------
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", {
4 | "modules": false,
5 | "targets": {
6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
7 | }
8 | }],
9 | "stage-2"
10 | ],
11 | "plugins": ["transform-vue-jsx", "transform-runtime"]
12 | }
13 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | vue-validate-easy
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | "postcss-import": {},
6 | "postcss-url": {},
7 | // to edit target browsers: use "browserslist" field in package.json
8 | "autoprefixer": {
9 | browsers: ['last 30 versions','Android >= 4.0']
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 | vue-validate-easy
--------------------------------------------------------------------------------
/VUE-CLI-README.md:
--------------------------------------------------------------------------------
1 | # activity-frame-2018
2 |
3 | > A Vue.js project
4 |
5 | ## Build Setup
6 |
7 | ``` bash
8 | # install dependencies
9 | npm install
10 |
11 | # serve with hot reload at localhost:8080
12 | npm run dev
13 |
14 | # build for production with minification
15 | npm run build
16 |
17 | # build for production and view the bundle analyzer report
18 | npm run build --report
19 | ```
20 |
21 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
22 |
--------------------------------------------------------------------------------
/docs/static/js/manifest.3ad1d5771e9b13dbdad2.js:
--------------------------------------------------------------------------------
1 | !function(r){var n=window.webpackJsonp;window.webpackJsonp=function(e,u,c){for(var f,i,p,a=0,l=[];a'
32 | })
33 |
--------------------------------------------------------------------------------
/src/vue-validate-easy/validateAll.js:
--------------------------------------------------------------------------------
1 | import validate from './validate'
2 | import formElements from './formElements';
3 |
4 | export default async function (scope) {
5 | var canSumit = true // 是否验证通过
6 | var data = {}
7 | var errData = null
8 | var scopeInputs = document.querySelectorAll(`[data-scope=${scope}]`)
9 | if (scopeInputs.length == 0) throw `该scope(${scope})对应的表单不存在`
10 |
11 | for (let i = 0; i < scopeInputs.length; i++) {
12 | var key = scopeInputs[i].name_
13 | var validationParams = scopeInputs[i].binding.value
14 |
15 | // 只有指令参数的值才会被进行验证,否者只是提取值表单值进行提交
16 | if(validationParams) {
17 | var { err, value } = await validate(scopeInputs[i])
18 | }else{
19 | // 无需验证,直接取值
20 | var value = formElements.getValue(scopeInputs[i])
21 | }
22 | data[key] = value
23 | if (err) {
24 | // 验证通过返回 value
25 | canSumit = false
26 | if (!errData) errData = {}
27 | errData[key] = value
28 | }
29 | }
30 | return { canSumit, data, errData }
31 | }
32 |
--------------------------------------------------------------------------------
/src/components/my-input.vue:
--------------------------------------------------------------------------------
1 |
2 |
31 |
32 |
33 |
34 | .my-input(data-type="input")
35 | label
36 | div.label {{label}}
37 | div: input(:value="value",:placeholder="placeholder",spellcheck="false",:type="type")
38 |
39 |
40 |
41 |
42 |
54 |
--------------------------------------------------------------------------------
/test.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
22 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/vue-validate-easy/validatorStore.js:
--------------------------------------------------------------------------------
1 | var validatorStore = {
2 | // 验证方法
3 | required(val) {
4 | if (JSON.stringify(val) == "[]" || (!val && val !== 0)) return '必填项不能为空'
5 | },
6 | maxLength(val, len) {
7 | if (val.length > len) return '长度不得超过' + len + '位'
8 | },
9 | minLength(val, len) {
10 | if (val.length < len) return '长度不得小于' + len + '位'
11 | },
12 | between(val, min, max) {
13 | if (val.length < min || val.length > max) return `输入长度必须在${min}位和${max}位之间`
14 | },
15 | equalTo(val, selector) { // 可以是目标input元素,或者指令元素
16 | var targetEl = document.querySelector(selector)
17 | var tagName = targetEl.tagName.toLocaleLowerCase()
18 | targetEl = tagName == 'input' ? targetEl : targetEl.querySelector('input')
19 | if (val != targetEl.value) return '与目标值不一致'
20 | },
21 | length(val, len) {
22 | if (len != val.length) return `长度必须为${len}位`
23 | },
24 | email(val) {
25 | var p = /^([\w\.\-]+)@([\w\.\-]+)\.([\w]{2,4})$/
26 | if (!p.test(val)) return '邮箱格式不正确'
27 | },
28 | number(val) {
29 | if (!/^\d+$/.test(val)) return '必须为数字'
30 | }
31 | }
32 |
33 | export default {
34 | getValidator(name) {
35 | if (!validatorStore[name]) throw `没有名${name}的验证方法`
36 | return validatorStore[name]
37 | },
38 | addValidator(name, validator) {
39 | validatorStore[name] = validator
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/components/code-tab.vue:
--------------------------------------------------------------------------------
1 |
2 |
27 |
28 |
29 |
30 | .code-tab
31 | ul.nav
32 | li.nav-item(v-for="(v,i) in nav",:class="{active:i==activeIndex}",@click="activeIndex=i") {{v.text?v.text:v.name}}
33 | .content
34 | .content-item(v-for="(v,i) in nav",v-show="i==activeIndex")
35 | slot(:name="v.name")
36 |
37 |
38 |
39 |
40 |
41 |
60 |
--------------------------------------------------------------------------------
/src/vue-validate-easy/validate.js:
--------------------------------------------------------------------------------
1 | // validate function
2 | import validatorStore from './validatorStore'
3 | import errTip from './errTip'
4 | import formElements from './formElements'
5 |
6 | /**
7 | * 验证表单值方法
8 | *
9 | * @param {any} directiveEl 指令元素
10 | * @param {String} value 表单元素的值
11 | *
12 | * @return {err,value} err true说明验证错误,value为表单的值
13 | */
14 | export default async function (directiveEl, value) {
15 |
16 | var err, errContent
17 |
18 | value = value ? value : formElements.getValue(directiveEl)
19 |
20 |
21 | var key = directiveEl.getAttribute('data-name')
22 | var validator = directiveEl.binding.value
23 |
24 | if (validator[0][0] != 'required') {
25 | if (validatorStore.getValidator('required')(value)) {
26 | return { err: false, value }
27 | }
28 | }
29 |
30 | for (var i = 0; i < validator.length; i++) {
31 | // 参数解析
32 | var validatorName = validator[i][0] // 当前验证方法
33 | var secondItem = validator[i][1]
34 | var args = []
35 | var errMsg // 当前验证的参数,错误消息
36 | if (secondItem instanceof Array) {
37 | args = secondItem
38 | errMsg = validator[i][2]
39 | } else {
40 | errMsg = validator[i][1]
41 | }
42 | // 验证失败
43 | var validateFn = validatorStore.getValidator(validatorName)
44 | var validateResult = await validateFn(value, ...args)
45 |
46 | if (validateResult) {
47 | err = true
48 | errContent = errMsg || errMsg === '' ? errMsg : validateResult
49 | break
50 | }
51 |
52 | }
53 |
54 | var errOptionName = directiveEl.getAttribute('data-error-option')
55 | var errOption = errTip.getErrorOption(errOptionName ? errOptionName : 'default')
56 |
57 | if (!errOption) throw `没有这个名为${errOptionName}错误处理(data-error-option)方法`
58 | errOption.show(err, directiveEl, errContent)
59 |
60 | return { err, value } // 验证通过返回value值
61 |
62 | }
63 |
--------------------------------------------------------------------------------
/src/components/custom-checks.vue:
--------------------------------------------------------------------------------
1 |
2 |
18 |
19 |
20 |
21 | .custom-checks(data-type="custom")
22 | h4.question {{question}}
23 | .checks-container
24 | .check-item(
25 | v-for="(v,i) in innerData",
26 | :class="{checked:v.checked}",
27 | @click="checkFn($event,i)"
28 | ) {{v.text}}
29 |
30 |
31 |
32 |
33 |
95 |
--------------------------------------------------------------------------------
/config/index.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | // Template version: 1.3.1
3 | // see http://vuejs-templates.github.io/webpack for documentation.
4 |
5 | const path = require('path')
6 |
7 | module.exports = {
8 | dev: {
9 |
10 | // Paths
11 | assetsSubDirectory: 'static',
12 | assetsPublicPath: '/',
13 | proxyTable: {
14 | '/remote': {
15 | target: 'http://localhost:3000',
16 | pathRewrite: {
17 | // 地址重写
18 | '^/remote': '/remote'
19 | }
20 | }
21 | },
22 |
23 | // Various Dev Server settings
24 | host: 'localhost', // can be overwritten by process.env.HOST
25 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
26 | autoOpenBrowser: false,
27 | errorOverlay: true,
28 | notifyOnErrors: true,
29 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
30 |
31 |
32 | /**
33 | * Source Maps
34 | */
35 |
36 | // https://webpack.js.org/configuration/devtool/#development
37 | devtool: 'cheap-module-eval-source-map',
38 |
39 | // If you have problems debugging vue-files in devtools,
40 | // set this to false - it *may* help
41 | // https://vue-loader.vuejs.org/en/options.html#cachebusting
42 | cacheBusting: true,
43 |
44 | cssSourceMap: true
45 | },
46 |
47 | build: {
48 | // Template for index.html
49 | index: path.resolve(__dirname, '../docs/index.html'),
50 |
51 | // Paths
52 | assetsRoot: path.resolve(__dirname, '../docs'),
53 | assetsSubDirectory: 'static',
54 | assetsPublicPath: './',
55 |
56 | /**
57 | * Source Maps
58 | */
59 |
60 | productionSourceMap: false,
61 | // https://webpack.js.org/configuration/devtool/#production
62 | devtool: '#source-map',
63 |
64 | // Gzip off by default as many popular static hosts such as
65 | // Surge or Netlify already gzip all static assets for you.
66 | // Before setting to `true`, make sure to:
67 | // npm install --save-dev compression-webpack-plugin
68 | productionGzip: false,
69 | productionGzipExtensions: ['js', 'css'],
70 |
71 | // Run the build command with an extra argument to
72 | // View the bundle analyzer report after build finishes:
73 | // `npm run build --report`
74 | // Set to `true` or `false` to always turn it on or off
75 | bundleAnalyzerReport: process.env.npm_config_report
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-validate-easy",
3 | "version": "1.0.5",
4 | "description": "Vue form validation plug-in",
5 | "author": "lfyfly <410793635@qq.com>",
6 | "github":"https://github.com/lfyfly/vue-validate-easy",
7 | "main": "./src/vue-validate-easy/index.js",
8 | "keywords": [
9 | "vue",
10 | "validate",
11 | "validator",
12 | "vue-validate",
13 | "vue-validator",
14 | "form"
15 | ],
16 | "scripts": {
17 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
18 | "start": "npm run dev",
19 | "build": "node build/build.js"
20 | },
21 | "dependencies": {
22 | "github-markdown-css": "^2.10.0",
23 | "highlight.js": "^9.12.0",
24 | "highlightjs": "^9.10.0",
25 | "jstransformer-markdown-it": "^2.0.0",
26 | "vue": "^2.5.2"
27 | },
28 | "devDependencies": {
29 | "autoprefixer": "^7.1.2",
30 | "axios": "^0.18.0",
31 | "babel-core": "^6.22.1",
32 | "babel-helper-vue-jsx-merge-props": "^2.0.3",
33 | "babel-loader": "^7.1.1",
34 | "babel-plugin-syntax-jsx": "^6.18.0",
35 | "babel-plugin-transform-runtime": "^6.22.0",
36 | "babel-plugin-transform-vue-jsx": "^3.5.0",
37 | "babel-preset-env": "^1.3.2",
38 | "babel-preset-stage-2": "^6.22.0",
39 | "chalk": "^2.0.1",
40 | "copy-webpack-plugin": "^4.0.1",
41 | "css-loader": "^0.28.0",
42 | "es6-promise": "^4.2.4",
43 | "extract-text-webpack-plugin": "^3.0.0",
44 | "file-loader": "^1.1.4",
45 | "friendly-errors-webpack-plugin": "^1.6.1",
46 | "html-webpack-plugin": "^2.30.1",
47 | "node-notifier": "^5.1.2",
48 | "node-sass": "^4.7.2",
49 | "optimize-css-assets-webpack-plugin": "^3.2.0",
50 | "ora": "^1.2.0",
51 | "portfinder": "^1.0.13",
52 | "postcss-import": "^11.0.0",
53 | "postcss-loader": "^2.0.8",
54 | "postcss-url": "^7.2.1",
55 | "promise-polyfill": "^6.1.0",
56 | "pug": "^2.0.0-rc.4",
57 | "rimraf": "^2.6.0",
58 | "sass-loader": "^6.0.6",
59 | "semver": "^5.3.0",
60 | "shelljs": "^0.7.6",
61 | "uglifyjs-webpack-plugin": "^1.1.1",
62 | "url-loader": "^0.5.8",
63 | "vee-validate": "^2.0.6",
64 | "vue-loader": "^13.3.0",
65 | "vue-style-loader": "^3.0.1",
66 | "vue-template-compiler": "^2.5.2",
67 | "webpack": "^3.6.0",
68 | "webpack-bundle-analyzer": "^2.9.0",
69 | "webpack-dev-server": "^2.9.1",
70 | "webpack-merge": "^4.1.0"
71 | },
72 | "engines": {
73 | "node": ">= 6.0.0",
74 | "npm": ">= 3.0.0"
75 | },
76 | "browserslist": [
77 | "> 1%",
78 | "last 2 versions",
79 | "not ie <= 8"
80 | ]
81 | }
82 |
--------------------------------------------------------------------------------
/src/vue-validate-easy/errTip.js:
--------------------------------------------------------------------------------
1 |
2 | var errOptions = {
3 | default: {
4 | insertAfter(newElement, targetElement) {
5 | var parent = targetElement.parentNode;
6 | // 如果最后的节点是目标元素,则直接添加
7 | if (parent.lastChild == targetElement) {
8 | parent.appendChild(newElement)
9 | } else {
10 | // 如果不是,则插入在目标元素的下一个兄弟节点 的前面
11 | parent.insertBefore(newElement, targetElement.nextSibling)
12 | }
13 | },
14 | show(err, el, errContent) {
15 |
16 | if (err) {
17 | // 如果有的 .succ__ 话,就清除
18 | el.className = el.className.replace(' succ__', '')
19 |
20 | // 如果有的 .err__ 话,不重复添加
21 | if (el.className.indexOf('err__') == -1) {
22 | el.className = el.className + ' err__'
23 | }
24 | // 如果用户预先写了.err_msg元素 或者 已经在元素的子元素尾部添加了.err__msg元素,那么久不在添加新的元素
25 | var errMsgEl = el.querySelector('.err__msg')
26 | if (errMsgEl) {
27 | errMsgEl.textContent = errContent
28 | } else {
29 | // 首次创建错误元素
30 | var errMsgEl = document.createElement('span')
31 | errMsgEl.className = 'err__msg'
32 | errMsgEl.textContent = errContent
33 | el.appendChild(errMsgEl)
34 | }
35 |
36 | } else { // 验证成功
37 | var errMsgEl = el.querySelector('.err__msg')
38 | if(errMsgEl) errMsgEl.textContent =''
39 | if (el.className.indexOf('succ__') == -1) { // 防止重复添加
40 | el.className = el.className + ' succ__'
41 | }
42 | }
43 | },
44 | reset(el) {
45 | el.className = el.className.replace(' err__', '')
46 | el.className = el.className.replace(' succ__', '')
47 | var errMsgEl = el.querySelector('.err__msg')
48 | if(errMsgEl) errMsgEl.textContent =''
49 | }
50 | }
51 | }
52 |
53 | export default {
54 | getErrorOption(errOptionName) {
55 | return errOptions[errOptionName ? errOptionName : 'default']
56 | },
57 | resetErrorTip(scope) {
58 | var formEles = document.querySelectorAll(`[data-scope=${scope}]`)
59 | for (var i = 0; i < formEles.length; i++) {
60 | var el = formEles[i]
61 | this.resetSingleErrorTip(el)
62 | }
63 | },
64 | resetSingleErrorTip(el) {
65 |
66 | var errOptionName = el.getAttribute('data-error-option')
67 | var errOption = errOptions[errOptionName ? errOptionName : 'default']
68 | if (!errOption) throw `没有这个名为${errOptionName}错误处理方法`
69 |
70 | errOption.reset && errOption.reset(el)
71 | },
72 |
73 | /**
74 | * 新增错误处理方法
75 | *
76 | * @param {any} errOptionName
77 | * @param {any} option {show(){}, reset(){}}
78 | */
79 | addErrorOption(errOptionName, option) { // 通过传入参数指定,哪种错误类型
80 | errOptions[errOptionName] = option
81 | },
82 | }
83 |
--------------------------------------------------------------------------------
/src/vue-validate-easy/index.js:
--------------------------------------------------------------------------------
1 |
2 | import validate from './validate'
3 | import validateAll from './validateAll'
4 | import validatorStore from './validatorStore'
5 | import errTip from './errTip'
6 |
7 | import formElements from './formElements'
8 |
9 | var vueValidateEasy = {}
10 | vueValidateEasy.install = function (Vue, options) {
11 | // 批量加载验证方法
12 | if (options && options.validators) {
13 | for (name in options.validators) {
14 | validatorStore.addValidator(name, options.validators[name])
15 | }
16 | }
17 |
18 | Vue.directive('validate-easy', {
19 | inserted(directiveEl, binding, vnode) {
20 | // 判断v-validate-easy data-scope data-name data-type
21 |
22 |
23 | var scope = directiveEl.getAttribute('data-scope')
24 | var name = directiveEl.getAttribute('data-name')
25 | var type = directiveEl.getAttribute('data-type')
26 |
27 | // 参数的检测,报错提醒
28 | if (!scope || !name || !type) {
29 | console.log('错误元素:', directiveEl)
30 | }
31 | if (!scope) throw '使用v-validate-easy指令的元素缺少必要属性data-scope'
32 | if (!name) throw '使用v-validate-easy指令的元素缺少必要属性data-name'
33 | if (!type) throw '使用v-validate-easy指令的元素缺少必要属性data-type'
34 |
35 | if (binding.value) {
36 | if (!(binding.value instanceof Array)) {
37 | console.log('错误元素:', directiveEl)
38 | throw '使用v-validate-easy指令的值应是一个数组'
39 | }
40 |
41 | binding.value.forEach(validator => {
42 | if (!(validator instanceof Array)) {
43 | console.log('错误元素:', directiveEl)
44 | throw '使用v-validate-easy指令值的子元素应是一个数组'
45 | }
46 | if (!validator[0]) {
47 | console.log('错误元素:', directiveEl)
48 | throw '使用v-validate-easy指令值中验证方法名不能缺失'
49 | }
50 | })
51 | }
52 |
53 |
54 | // 当指令元素被从Dom中移除时,这些同时会被销毁,不占用内存
55 | directiveEl.scope_ = scope
56 | directiveEl.name_ = name
57 | directiveEl.type_ = type
58 |
59 | // 无需验证参数,使用该指令只是为了提取值
60 | directiveEl.binding = binding
61 | if (!binding.value) return
62 |
63 |
64 | // 绑定事件触发验证
65 | formElements.bindEvent(directiveEl)
66 |
67 | }
68 | })
69 | Vue.prototype.V = {}
70 |
71 | Vue.prototype.V.$validateSingle = async function (directiveEl, value) {
72 | return await validate(directiveEl, value)
73 | }
74 | Vue.prototype.V.$validateAll = async function (scope) {
75 | return await validateAll(scope)
76 | }
77 | Vue.prototype.V.$submit = async function (scope, cb) {
78 | var { canSumit, data, errData } = await validateAll(scope)
79 | cb && cb(canSumit, data, errData)
80 | }
81 | Vue.prototype.V.$reset = function (scope) {
82 | errTip.resetErrorTip(scope)
83 | formElements.resetValue(scope)
84 | },
85 |
86 | Vue.prototype.V.$resetSingle = function (directiveEl) {
87 |
88 | errTip.resetSingleErrorTip(directiveEl)
89 | formElements.resetSingleValue(directiveEl)
90 | },
91 | /**
92 | * 新增验证方法
93 | *
94 | * @param {String|Object} param
95 | * String类型时,为方法名,此时第二个参数是必须的
96 | * Object类型时,为批量新增验证方法,此时第二参数不需要传
97 | * @param {function} validator
98 | */
99 | Vue.prototype.V.$addValidateMethod = function (param, validator) {
100 | if ((typeof param).toLowerCase() == 'object') { // name代表合并一个对象 {a(){},b(){}}
101 | for (name in param) {
102 | validatorStore.addValidator(name, param[name])
103 | }
104 | } else {
105 | validatorStore.addValidator(param, validator)
106 | }
107 | }
108 |
109 | Vue.prototype.V.$addErrorOption = function (errOptionName, option) { // {show,remove}
110 | errTip.addErrorOption(errOptionName, option)
111 | }
112 | }
113 | export default vueValidateEasy
114 |
--------------------------------------------------------------------------------
/src/vue-validate-easy/formElements.js:
--------------------------------------------------------------------------------
1 | import validate from './validate'
2 |
3 | var formElements = {
4 | input: {
5 | condition(directiveEl) {
6 | if (directiveEl.type_ == 'input' || directiveEl.type_ == 'textarea') {
7 | directiveEl.eventEl_ = directiveEl.querySelector(directiveEl.type_)
8 | return true
9 | }
10 | },
11 | bindEvent(directiveEl) {
12 |
13 | var eventEl = directiveEl.eventEl_
14 | var delay_ = parseInt(directiveEl.getAttribute('data-delay'))
15 | var { delay, lazy } = directiveEl.binding.modifiers
16 | if (delay_) {
17 | delay = delay_
18 | } else {
19 | delay = delay ? 500 : false
20 | }
21 | var delaying = false
22 |
23 | // ie10 11 使用placeholder时,进入页面会主动触发一次input事件
24 | // 这里采用延时绑定规避这一情况
25 | eventEl.onfocus = () => {
26 | eventEl.onfocus = null
27 | eventEl.onblur = eventEl.oninput = (e) => {
28 | // .lazy修饰符
29 | if (lazy && e.type == 'input') return
30 | // .delay修饰符
31 | if (delay && e.type == 'input') {
32 | if (delaying) {
33 | return
34 | }
35 | delaying = true
36 | setTimeout(() => {
37 | delaying = false
38 | }, delay);
39 | }
40 | var value = this.getValue(directiveEl)
41 | validate(directiveEl, value)
42 | }
43 | }
44 | },
45 | getValue(directiveEl) {
46 | return directiveEl.eventEl_.value.replace(/^\s+|\s+$/g, "")
47 | },
48 | resetValue(directiveEl) {
49 | directiveEl.eventEl_.value = ''
50 | }
51 | },
52 | checks: {
53 | condition(directiveEl) {
54 | if (directiveEl.type_ == 'checkbox' || directiveEl.type_ == 'radio') {
55 | directiveEl.checks_ = directiveEl.querySelectorAll(`[type=${directiveEl.type_}]`)
56 | return true
57 | }
58 | },
59 | bindEvent(directiveEl) {
60 |
61 | var checks = directiveEl.checks_
62 | for (var i = 0; i < checks.length; i++) {
63 | checks[i].onchange = (e) => {
64 | var value = this.getValue(directiveEl)
65 | validate(directiveEl, value)
66 | }
67 | }
68 | },
69 | getValue(directiveEl) {
70 | var value = directiveEl.type_ == 'radio' ? '' : []
71 | var checks = directiveEl.checks_
72 | for (var i = 0; i < checks.length; i++) {
73 | if (checks[i].checked) {
74 | if (value === '') {
75 | value = checks[i].value
76 | break
77 | } else {
78 | value.push(checks[i].value)
79 | }
80 | }
81 | }
82 | return value
83 | },
84 | resetValue(directiveEl) {
85 | var checks = directiveEl.checks_
86 | for (var i = 0; i < checks.length; i++) {
87 | checks[i].checked = false
88 | }
89 | }
90 | },
91 | select: {
92 | condition(directiveEl) {
93 |
94 | if (directiveEl.type_ == 'select') {
95 | directiveEl.eventEl_ = directiveEl.querySelector('select')
96 | return true
97 | }
98 | },
99 | bindEvent(directiveEl, binding) {
100 | var eventEl = directiveEl.eventEl_ || directiveEl
101 | eventEl.onchange = (e) => {
102 | var value = this.getValue(directiveEl)
103 | validate(directiveEl, value)
104 | }
105 | },
106 | getValue(directiveEl) {
107 | var eventEl = directiveEl.eventEl_ || directiveEl
108 | var multiple = eventEl.getAttribute('multiple')
109 | var optionEls = eventEl.querySelectorAll('option')
110 | var value = !multiple ? '' : []
111 | for (var i = 0; i < optionEls.length; i++) {
112 | if (optionEls[i].selected) {
113 | if (value === '') {
114 | value = optionEls[i].value
115 | break
116 | } else {
117 | value.push(optionEls[i].value)
118 | }
119 | }
120 | }
121 | return value
122 | },
123 | resetValue(directiveEl) {
124 | var eventEl = directiveEl.eventEl_ || directiveEl
125 | eventEl.value = ''
126 | var multiple = eventEl.getAttribute('multiple')
127 | if (!multiple) eventEl.querySelector('option').selected = true // 单选重置后默认选择第一个值
128 | }
129 | },
130 | custom: { // 自定义元素
131 | condition(directiveEl) {
132 | return directiveEl.type_ == 'custom'
133 | },
134 | bindEvent(directiveEl) {
135 | directiveEl.bindEvent(validate)
136 | },
137 | getValue(directiveEl) {
138 | return directiveEl.getValue()
139 | },
140 | resetValue(directiveEl) {
141 | directiveEl.reset()
142 | }
143 | },
144 | }
145 |
146 | export default {
147 | bindEvent(directiveEl, binding) {
148 | var eles = Object.keys(formElements)
149 | for (var i = 0; i < eles.length; i++) {
150 | if (formElements[eles[i]].condition(directiveEl)) {
151 | formElements[eles[i]].bindEvent(directiveEl, binding)
152 | return
153 | }
154 | }
155 | },
156 |
157 | resetSingleValue(directiveEl) {
158 |
159 | var formElementsKeys = Object.keys(formElements)
160 | for (var j = 0; j < formElementsKeys.length; j++) {
161 | if (formElements[formElementsKeys[j]].condition(directiveEl)) { // 符合条件的元素进行清除
162 | formElements[formElementsKeys[j]].resetValue(directiveEl)
163 | break
164 | }
165 | }
166 | },
167 | resetValue(scope) {
168 | var els = document.querySelectorAll(`[data-scope=${scope}]`)
169 | for (var i = 0; i < els.length; i++) {
170 | this.resetSingleValue(els[i])
171 | }
172 | },
173 | getValue(directiveEl) {
174 | var formElementsKeys = Object.keys(formElements)
175 | for (var i = 0; i < formElementsKeys.length; i++) {
176 | if (formElements[formElementsKeys[i]].condition(directiveEl)) { // 符合条件的元素进行清除
177 | return formElements[formElementsKeys[i]].getValue(directiveEl)
178 | }
179 | }
180 | },
181 | }
182 |
--------------------------------------------------------------------------------
/src/assets/highlight.pack.js:
--------------------------------------------------------------------------------
1 | /*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */
2 | !function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""+t(e)+">"}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(/
/g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b:/,e:/(\/\w+|\w+\/)>/,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/,r:0,c:[{cN:"attr",b:e,r:0},{b:/=\s*/,r:0,c:[{cN:"string",endsParent:!0,v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"?",e:"/?>",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});
--------------------------------------------------------------------------------
/docs/static/css/app.21dd314e3c336b6e35618685db2fe00d.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";.fade-enter-active,.fade-leave-active{transition:opacity .5s}.fade-enter,.fade-leave-to{opacity:0}a{-webkit-tap-highlight-color:rgba(255,255,255,0)}#app,body,html{height:100%;margin:0}#app.is-mobile #main>*{max-width:auto;min-width:auto}#app.is-mobile #catalog{position:fixed!important;width:100%;z-index:2}#app.is-mobile #catalog .close{position:fixed;top:-4px;right:0;width:40px;height:40px;font-size:30px;line-height:40px;z-index:1;text-align:right}#app.is-mobile #catalog .close:after{content:"\D7";color:rgba(0,0,0,.5);font-size:50px;font-weight:300}#app{box-sizing:border-box;font-family:Microsoft YaHei,黑体,verdana,sans-serif}#app a{color:#24292e}#app #main>*{max-width:1000px;min-width:600px}#app #main{padding:20px}#app #main ul{padding-left:0}#app #main #catalog-btn{position:fixed;right:0;z-index:1;top:10px;right:3px;width:30px;background:#ccc;border-top:3px solid rgba(0,0,0,.5);border-bottom:3px solid rgba(0,0,0,.5);background:rgba(0,0,0,.5);padding:5px 0;box-sizing:content-box;height:3px;background-clip:content-box}#app #catalog{float:left}#app>*{overflow:auto;height:100%;box-sizing:border-box}#app #catalog{padding:0 20px 20px;background:hsla(0,0%,100%,.9);box-shadow:0 1px 2px rgba(0,0,0,.3);line-height:1.6}#app #catalog a{color:#551a8b;display:block;text-decoration:none}#app #catalog a:hover{text-decoration:underline}#app #catalog a:active{color:#551a8b}#app #catalog a.h1{margin-top:10px;font-weight:700}#app #catalog a.h3{font-size:12px;padding-left:20px}#app form{box-shadow:0 1px 2px rgba(0,0,0,.3);border-radius:4px;padding:10px;margin-top:20px;margin-bottom:20px}#app button,#app input,#app select{outline:none}#app option,#app select{font-size:16px}#app select{min-height:24px}#app .btn-group{margin-bottom:10px}#app .btn-group>*{margin-right:10px}#app .my-btn{line-height:24px;background:#fff;border:1px solid #919191;border-radius:4px;transition:background .5s}#app .my-btn:hover{background:#f3f3f3;cursor:pointer}#app .my-form-group{margin-bottom:20px}#app .my-form-group .label{font-weight:700;margin-bottom:2px}#app .my-form-group input.input{height:30px;width:100%;outline:none;box-sizing:border-box;padding-left:6px;border:1px solid #919191;border-radius:4px}#app .my-form-group label.checkbox,#app .my-form-group label.radio{margin-right:10px}#app .my-form-group label.checkbox input,#app .my-form-group label.radio input{margin-right:4px}#app .my-form-group input::-webkit-input-placeholder{color:#ccc}#app .my-form-group input:-moz-placeholder,#app .my-form-group input::-moz-placeholder{color:#ccc}#app .my-form-group input:-ms-input-placeholder{color:#ccc}#app .err__ input.input{border:1px solid red}#app .succ__ input.input{border:1px solid green}#app .err__msg{color:red;display:block;font-size:14px}.my-input{margin:20px 0}.my-input input{height:36px;border:1px solid #919191;padding:0 16px;border-radius:18px;width:300px}.my-input .label{margin-left:16px;margin-bottom:2px;font-weight:700}.my-input.err__ input{border:1px solid red}.my-input.succ__ input{border:1px solid green}.my-input .err__msg{color:red;font-size:14px;margin-left:10px}.code-tab li{list-style:none}.code-tab li,.code-tab ul{margin:0;padding:0}.code-tab .nav>*{display:inline-block;padding:4px 10px;border-bottom:2px solid transparent;cursor:pointer;transition:border-color .3s,color .3s}.code-tab .nav>.active{border-color:green;color:green}.custom-checks{overflow:hidden}.custom-checks .check-item{margin:10px;padding-left:10px;cursor:pointer;border:1px solid transparent}.custom-checks .check-item.checked{border-radius:4px;border:1px solid green}.hljs{display:block;overflow-x:auto;padding:.5em;background:#fff;color:#000}.hljs-comment,.hljs-quote{color:#006a00}.hljs-keyword,.hljs-literal,.hljs-selector-tag{color:#aa0d91}.hljs-name{color:#008}.hljs-template-variable,.hljs-variable{color:#660}.hljs-string{color:#c41a16}.hljs-link,.hljs-regexp{color:#080}.hljs-bullet,.hljs-meta,.hljs-number,.hljs-symbol,.hljs-tag,.hljs-title{color:#1c00cf}.hljs-attr,.hljs-built_in,.hljs-builtin-name,.hljs-class .hljs-title,.hljs-params,.hljs-section,.hljs-type{color:#5c2699}.hljs-attribute,.hljs-subst{color:#000}.hljs-formula{background-color:#eee;font-style:italic}.hljs-addition{background-color:#baeeba}.hljs-deletion{background-color:#ffc8bd}.hljs-selector-class,.hljs-selector-id{color:#9b703f}.hljs-doctag,.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic}@font-face{font-family:octicons-link;src:url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format("woff")}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .pl-c{color:#6a737d}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#005cc5}.markdown-body .pl-e,.markdown-body .pl-en{color:#6f42c1}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#24292e}.markdown-body .pl-ent{color:#22863a}.markdown-body .pl-k{color:#d73a49}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#032f62}.markdown-body .pl-smw,.markdown-body .pl-v{color:#e36209}.markdown-body .pl-bu{color:#b31d28}.markdown-body .pl-ii{color:#fafbfc;background-color:#b31d28}.markdown-body .pl-c2{color:#fafbfc;background-color:#d73a49}.markdown-body .pl-c2:before{content:"^M"}.markdown-body .pl-sr .pl-cce{font-weight:700;color:#22863a}.markdown-body .pl-ml{color:#735c0f}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:700;color:#005cc5}.markdown-body .pl-mi{font-style:italic;color:#24292e}.markdown-body .pl-mb{font-weight:700;color:#24292e}.markdown-body .pl-md{color:#b31d28;background-color:#ffeef0}.markdown-body .pl-mi1{color:#22863a;background-color:#f0fff4}.markdown-body .pl-mc{color:#e36209;background-color:#ffebda}.markdown-body .pl-mi2{color:#f6f8fa;background-color:#005cc5}.markdown-body .pl-mdr{font-weight:700;color:#6f42c1}.markdown-body .pl-ba{color:#586069}.markdown-body .pl-sg{color:#959da5}.markdown-body .pl-corl{text-decoration:underline;color:#032f62}.markdown-body .octicon{display:inline-block;vertical-align:text-top;fill:currentColor}.markdown-body a{background-color:transparent}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body strong{font-weight:inherit;font-weight:bolder}.markdown-body h1{margin:.67em 0}.markdown-body img{border-style:none}.markdown-body code,.markdown-body kbd,.markdown-body pre{font-family:monospace,monospace;font-size:1em}.markdown-body hr{box-sizing:content-box;overflow:visible}.markdown-body input{font:inherit;margin:0;overflow:visible}.markdown-body [type=checkbox]{box-sizing:border-box;padding:0}.markdown-body *{box-sizing:border-box}.markdown-body input{font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body a{color:#0366d6;text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body strong{font-weight:600}.markdown-body hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border-bottom:1px solid #dfe2e5}.markdown-body hr:after,.markdown-body hr:before{display:table;content:""}.markdown-body hr:after{clear:both}.markdown-body table{border-spacing:0;border-collapse:collapse}.markdown-body td,.markdown-body th{padding:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:0;margin-bottom:0}.markdown-body h1{font-size:32px;font-weight:600}.markdown-body h2{font-size:24px;font-weight:600}.markdown-body h3{font-size:20px;font-weight:600}.markdown-body h4{font-size:16px;font-weight:600}.markdown-body h5{font-size:14px;font-weight:600}.markdown-body h6{font-size:12px;font-weight:600}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0}.markdown-body ol,.markdown-body ul{padding-left:0;margin-top:0;margin-bottom:0}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}.markdown-body pre{margin-top:0;margin-bottom:0}.markdown-body .octicon{vertical-align:text-bottom}.markdown-body .pl-0{padding-left:0!important}.markdown-body .pl-1{padding-left:4px!important}.markdown-body .pl-2{padding-left:8px!important}.markdown-body .pl-3{padding-left:16px!important}.markdown-body .pl-4{padding-left:24px!important}.markdown-body .pl-5{padding-left:32px!important}.markdown-body .pl-6{padding-left:40px!important}.markdown-body:after,.markdown-body:before{display:table;content:""}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{font-size:11px;border:1px solid #c6cbd1;border-bottom-color:#959da5;box-shadow:inset 0 -1px 0 #959da5}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #eaecef}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#6a737d}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li{word-wrap:break-all}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body code{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}.markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}.markdown-body kbd{display:inline-block;padding:3px 5px;font:11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:1px solid #d1d5da;border-bottom-color:#c6cbd1;border-radius:3px;box-shadow:inset 0 -1px 0 #c6cbd1}.markdown-body :checked+.radio-label{position:relative;z-index:1;border-color:#0366d6}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body hr{border-bottom-color:#eee}
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
203 |
204 |
205 |
206 | #app(:class="{'is-mobile': isMobile}")
207 | transition(name="fade")
208 | #catalog(v-show="catalogShow",@click="clickCatalog")
209 | .close
210 | #main.markdown-body
211 | #catalog-btn(v-if="isMobile",@click="catalogShow=true")
212 | #content
213 | :markdown-it
214 | # 实例教程
215 | ## 1. 开始
216 | ### 1.1 安装
217 | ```nohighlight
218 | npm install vue-validate-easy --save
219 | ```
220 | ### 1.2 引用
221 | 在main.js文件中引用
222 | ```js
223 | import vueValidateEasy from 'vue-validate-easy'
224 | Vue.use(vueValidateEasy)
225 | ```
226 |
227 | ## 2. 实例
228 | ### 2.1 基本示例
229 |
230 | code-tab#example_1(:nav="[{name:'demo'},{name:'html'},{name:'javascript'},{name:'css'}]")
231 | template(slot ="demo")
232 | form.example_1
233 | div.my-form-group(data-scope="example_1" data-name="email" data-type="input" v-validate-easy="[['required','邮箱为必填项目'],['email']]")
234 | label
235 | div.label 邮箱
236 | input.input( type="text" spellcheck="false" placeholder="请输入邮箱" )
237 |
238 | div.my-form-group(data-scope="example_1" data-name="any" data-type="input" v-validate-easy="")
239 | label
240 | div.label 随便写点什么
241 | input.input( type="text" spellcheck="false" placeholder="该字段不做验证" )
242 |
243 | div.my-form-group(data-scope="example_1" data-name="number" data-type="input" v-validate-easy="[['number']]")
244 | label
245 | div.label 数字(非必须但有值需要验证)
246 | input.input( type="text" spellcheck="false" placeholder="输入一段数字" )
247 |
248 | div.btn-group
249 | button.my-btn(@click.prevent="submit('example_1')") 提交表单
250 | button.my-btn(@click.prevent="reset('example_1')") 重置表单
251 |
252 | template(slot="html")
253 | :markdown-it
254 | ```html
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
293 | ```
294 | template(slot="javascript")
295 | :markdown-it
296 | ```js
297 | // 重置表单方法:this.V.$reset(scope)
298 | // 提交表单方法: this.V.$submit(scope,(canSumit,data)=>{}) 回调函数会在该scope所有的表单元素全部验证完成后执行
299 | methods: {
300 | reset(scope) {
301 | this.V.$reset(scope)
302 | },
303 | submit(scope) {
304 | this.V.$submit(scope, (canSumit,data) => {
305 | // canSumit为true时,则所有该scope的所有表单验证通过
306 | if(!canSumit) return
307 |
308 | // 只有验证全部通过才会执行
309 | console.log('验证通过的数据'+data)
310 | alert('验证通过,数据如下\n' + JSON.stringify(data))
311 |
312 | // 发送请求
313 | axios({ url: '/test',data, method: 'post'})
314 | .then(() => {
315 | // 成功响应处理
316 | })
317 | .catch(() => {
318 | // 错误处理
319 | })
320 | })
321 | }
322 | },
323 | ```
324 | template(slot="css")
325 | :markdown-it
326 | ```css
327 | /* 赋予验证错误的样式和验证成功的样式 */
328 | /* 验证成功时时,会对使用指令的元素加上className succ__ */
329 | /* 验证错误时,会对使用指令的元素加上className err__ */
330 | /* 验证错误时,默认在使用指令的元素子元素末尾追加一个错误提示元素,是一个span元素,className为 err__msg */
331 | /* 如果你在使用指令元素内部,预设了一个className为 err__msg 的元素,那么它将作为错误信息的容器元素 */
332 | .err__ input.input {
333 | border: 1px solid red;
334 | }
335 | .succ__ input.input {
336 | border: 1px solid green;
337 | }
338 | .err__msg {
339 | color: red;
340 | display: block;
341 | font-size: 14px;
342 | }
343 | ```
344 | :markdown-it
345 | ### 2.2 指令参数书写规则
346 | `v-validate-easy指令必须在原生表单元素的上层元素上使用`
347 | code-tab#example_2(:nav="[{name:'demo'},{name:'html'}]")
348 | template(slot="demo")
349 | form.example_2
350 | div.my-form-group(data-scope="example_2" data-name="sid1" data-type="input" v-validate-easy="[['required'],['number'],['minLength',[10]]]")
351 | label
352 | div.label 学号1(默认错误提示语和传递验证参数)
353 | input.input(type="text" spellcheck="false" placeholder="请输入学号" )
354 | div.my-form-group(data-scope="example_2" data-name="sid2" data-type="input" v-validate-easy="[['required','学号为必填项'],['number','学号为全数字构成'],['minLength',[10],'学号最小长度为10位']]")
355 | label
356 | div.label 学号2(自定义错误提示语)
357 | input.input(type="text" spellcheck="false" placeholder="请输入学号")
358 | div.my-form-group(data-scope="example_2" data-name="sid3" data-type="input" v-validate-easy="[['required',''],['number',''],['minLength',[10],'']]")
359 | label
360 | div.label 学号3(隐藏错误提示语)
361 | input.input(type="text" spellcheck="false" placeholder="请输入学号")
362 | div.btn-group
363 | button.my-btn(@click.prevent="submit('example_2')") 提交表单
364 | button.my-btn(@click.prevent="reset('example_2')") 重置表单
365 | template(slot="html")
366 | :markdown-it
367 | ```html
368 |
369 |
370 |
371 |
372 |
405 | ```
406 | :markdown-it
407 | ### 2.3 指令修饰符(懒验证,延时验证)
408 | code-tab#example_3(:nav="[{name:'demo'},{name:'html'}]")
409 | template(slot="demo")
410 | form.example_3
411 | div.my-form-group(
412 | data-scope="example_3" data-name="sid1" data-type="input"
413 | v-validate-easy.lazy="[['required','学号为必填项'],['number','学号为全数字构成'],['minLength',[10],'学号最小长度为10位']]"
414 | )
415 | label
416 | div.label 学号1(.lazy修饰符,blur事件才触发验证)
417 | input.input( type="text" spellcheck="false" placeholder="请输入学号" )
418 | div.my-form-group(
419 | data-scope="example_3" data-name="sid2" data-type="input"
420 | v-validate-easy.delay="[['required','学号为必填项'],['number','学号为全数字构成'],['minLength',[10],'学号最小长度为10位']]")
421 | label
422 | div.label 学号2(.delay修饰符,输入时每隔500ms触发验证)
423 | input.input(type="text" spellcheck="false" placeholder="请输入学号")
424 | div.my-form-group(
425 | data-scope="example_3" data-name="sid3" data-type="input" data-delay="2000"
426 | v-validate-easy="[['required','学号为必填项'],['number','学号为全数字构成'],['minLength',[10],'学号最小长度为10位']]"
427 | )
428 | label
429 | div.label 学号3(使用data-delay属性定义触发间隔时间,输入时每隔2s触发验证)
430 | input.input( type="text" spellcheck="false" placeholder="请输入学号" )
431 | div.my-form-group
432 | label(
433 | data-scope="example_3" data-name="sid4" data-type="input"
434 | v-validate-easy.lazy.delay="[['required','学号为必填项'],['number','学号为全数字构成'],['minLength',[10],'学号最小长度为10位']]"
435 | )
436 | div.label 学号4(.lazy.delay同时使用时,只有.lazy生效)
437 | input.input( type="text" spellcheck="false" placeholder="请输入学号" )
438 | div.btn-group
439 | button.my-btn(@click.prevent="submit('example_3')") 提交表单
440 | button.my-btn(@click.prevent="reset('example_3')") 重置表单
441 | template(slot="html")
442 | :markdown-it
443 | ```html
444 |
481 | ```
482 |
483 |
484 | :markdown-it
485 | ## 3. 其他表单元素写法
486 | ### 3.1 checkbox radio
487 | code-tab#example_4(:nav="[{name:'demo'},{name:'html'}]")
488 | template(slot="demo")
489 | form.example_4
490 | div.my-form-group(data-scope="example_4" data-name="sex" data-type="radio"
491 | v-validate-easy="[['required','性别必须选择一个']]")
492 | div.label 性别(单选框)
493 | div
494 | label.radio
495 | input(type="radio" data-name="sex" value="0" )
496 | | 男
497 | label.radio
498 | input.radio(type="radio" data-name="sex" value="1" )
499 | | 女
500 | div.my-form-group(data-scope="example_4" data-name="hobby" data-type="checkbox"
501 | v-validate-easy="[['required','性别必须选择一个']]")
502 | div.label 爱好(多选框)
503 | div
504 | label.checkbox
505 | input(type="checkbox" data-name="hobby" value="看书" )
506 | | 看书
507 | label.checkbox
508 | input(type="checkbox" data-name="hobby" value="睡觉" )
509 | | 睡觉
510 | label.checkbox
511 | input(type="checkbox" data-name="hobby" value="游戏" )
512 | | 游戏
513 | label.checkbox
514 | input(type="checkbox" data-name="hobby" value="运动" )
515 | | 运动
516 | div.btn-group
517 | button.my-btn(@click.prevent="submit('example_4')") 提交表单
518 | button.my-btn(@click.prevent="reset('example_4')") 重置表单
519 | template(slot="html")
520 | :markdown-it
521 | ```html
522 |
552 |
553 | ```
554 | :markdown-it
555 | ### 3.2 select
556 | code-tab#example_5(:nav="[{name:'demo'},{name:'html'}]")
557 | template(slot="demo")
558 | form.example_5
559 | div.my-form-group(data-scope="example_5" data-name="identity" data-type="select"
560 | v-validate-easy="[['required','选择一个身份']]")
561 | div.label 身份(单选列表)
562 | select
563 | option 学生
564 | option 工作
565 |
566 | div.my-form-group(data-scope="example_5" data-name="eat" data-type="select"
567 | v-validate-easy="[['required','喜欢吃的必须选择一个']]")
568 | div.label 爱吃的(多选列表)
569 | select(multiple)
570 | option 鸡
571 | option 鸭
572 | option 鱼
573 | option 肉
574 |
575 | div.btn-group
576 | button.my-btn(@click.prevent="submit('example_5')") 提交表单
577 | button.my-btn(@click.prevent="reset('example_5')") 重置表单
578 | template(slot="html")
579 | :markdown-it
580 | ```html
581 |
582 |
608 | ```
609 | :markdown-it
610 | ### 3.3 自定义组件
611 | `在vue组件上添加data-*属性时,会此属性原样渲染到该组件的根元素上`
612 | code-tab#example_6(:nav="[{name:'demo'},{name:'html'},{name:'myInput',text:'my-input.vue'},{name:'javascript'}]")
613 | template(slot="demo")
614 | my-input(label="用户名" data-scope="example_6" data-name="username" v-validate-easy="[['required','用户名不能为空']]" )
615 | div.btn-group
616 | button.my-btn(@click.prevent="submit('example_6')") 提交表单
617 | button.my-btn(@click.prevent="reset('example_6')") 重置表单
618 | template(slot="html")
619 | :markdown-it
620 | ```html
621 |
622 |
624 |
625 |
626 |
627 |
628 |
629 | ```
630 | template(slot="myInput")
631 | a(href="https://github.com/lfyfly/vue-validate-easy/blob/master/src/components/my-input.vue",target="_blank",style="background:#f6f8fa;padding:0 20px;display:block;") my-input.vue
632 | template(slot="javascript")
633 | :markdown-it
634 | ```js
635 | // 引用自定义组件
636 | // 下面例子将使用自定义组件,不再展示引用代码
637 | import myInput from '@/components/my-input'
638 | // ...
639 | components:{
640 | myInput
641 | }
642 | ```
643 |
644 | :markdown-it
645 | ## 4. 新增验证方法
646 | ### 4.1 新增验证方法(this.V.$addValidateMethod)
647 | code-tab#example_7(:nav="[{name:'demo'},{name:'html'},{name:'javascript'}]")
648 | template(slot="demo")
649 | form.example_7
650 | my-input#pwd(label="密码" data-scope="example_7" data-name="pwd" type="password" placeholder="请输入密码" v-validate-easy="[['required','密码不能为空'],['password'],['maxLength',[32],'密码最长为32位']]" )
651 | my-input(label="确认密码" data-scope="example_7" data-name="repeatpwd" type="password" placeholder="请输入确认密码" v-validate-easy="[['required','确认密码不能为空'],['equalTo',['#pwd'],'密码输入不一致']]")
652 |
653 | div.btn-group
654 | button.my-btn(@click.prevent="submit('example_7')") 提交表单
655 | button.my-btn(@click.prevent="reset('example_7')") 重置表单
656 | template(slot="html")
657 | :markdown-it
658 | ```html
659 |
672 | ```
673 | template(slot="javascript")
674 | :markdown-it
675 | ```js
676 | beforeCreate() {
677 | this.V.$addValidateMethod('password', function (val) {
678 | var p = /^(\w|[~`!@#$%^&()\[\]:;"'|\?/><.,{}=*\\+-])+$/.test(val)
679 | if(!p) return '密码只能由非空格,字母和常用字符组成'
680 | })
681 |
682 | // 也可传入对象批量新增
683 | this.V.$addValidateMethod({
684 | validator1(){},
685 | validator2(){},
686 | validator3(){},
687 | ....
688 | })
689 | }
690 | ```
691 | template(slot="myInput")
692 | a(href="/my-input.vue",target="_blank",style="background:#f6f8fa;padding:0 20px;display:block;") github地址/my-input.vue
693 |
694 | :markdown-it
695 | ### 4.2 远程校验方法写法
696 | code-tab#example_8(:nav="[{name:'demo'},{name:'html'},{name:'javascript'}]")
697 | template(slot="demo")
698 | form.example_8
699 | my-input(label="远程校验验证码" data-scope="example_8" data-name="code", v-validate-easy="[['required','验证码不能为空'],['length',['6'],'验证码长度为6位'],['remote_code']]")
700 | div.btn-group
701 | button.my-btn(@click.prevent="submit('example_8')") 提交表单
702 | button.my-btn(@click.prevent="reset('example_8')") 重置表单
703 | template(slot="html")
704 | :markdown-it
705 | ```html
706 |
715 | template(slot="javascript")
716 | :markdown-it
717 | ```js
718 | // 因为是异步请求,这里讲验证方法定义成 async 函数
719 | // async内 await 请求结果
720 | // return 值为验证错误的提示语,可以由后端响应的错误提示语
721 | this.V.$addValidateMethod('remote_code', async function (val) {
722 | console.log('进行远程验证中')
723 | try {
724 | // 这个接口非真实接口,所以会请求错误
725 | var { data } = await axios.post('http://localhost:3000/remote', { code: val })
726 | console.log('进行远程验证==结束')
727 | if (!data.validateResult) return data.message ? data.message : '校验失败'
728 | } catch (err) {
729 | console.log('进行远程验证==错误', err)
730 | return '请求错误'
731 | }
732 | })
733 | ```
734 | :markdown-it
735 | ### 4.3 Vue.use的时候批量增加验证方法
736 | code-tab#example_9(:nav="[{name:'demo'},{name:'html'},{name:'validators',text:'validators.js'},{name:'main',text:'main.js'}]")
737 | template(slot="demo")
738 | form.example_9
739 | my-input(label="aaa" data-scope="example_9" data-name="aaa", v-validate-easy="[['required'],['aaa']]")
740 | my-input(label="bbb" data-scope="example_9" data-name="bbb", v-validate-easy="[['required'],['bbb']]")
741 | my-input(label="ccc" data-scope="example_9" data-name="ccc", v-validate-easy="[['required'],['ccc']]")
742 |
743 | div.btn-group
744 | button.my-btn(@click.prevent="submit('example_9')") 提交表单
745 | button.my-btn(@click.prevent="reset('example_9')") 重置表单
746 | template(slot="html")
747 | :markdown-it
748 | ```html
749 |
759 | ```
760 | template(slot="validators")
761 | :markdown-it
762 | ```js
763 | export default {
764 | // 以下方法只是做测试用
765 | aaa(val) {
766 | return val != 'aaa' && '要等于aaa'
767 | },
768 | bbb(val) {
769 | return val != 'bbb' && '要等于bbb'
770 | },
771 | ccc(val) {
772 | return val != 'ccc' && '要等于ccc'
773 | },
774 | }
775 | ```
776 | template(slot="main")
777 | :markdown-it
778 | ```js
779 | import vueValidateEasy from 'vue-validate-easy'
780 | import validators from './my-validators/validators'
781 | Vue.use(vueValidateEasy,{validators})
782 | ```
783 | :markdown-it
784 | ### 4.3 内置验证方法
785 | a(href="https://github.com/lfyfly/vue-validate-easy/blob/master/src/vue-validate-easy/validatorStore.js" target="_blank",style="background:#f6f8fa;padding:0 20px;display:block;") validatorStores.js
786 |
787 | :markdown-it
788 | ## 5. 调用方法主动验证
789 | code-tab#example_10(:nav="[{name:'demo'},{name:'html'},{name:'javascript'}]")
790 | template(slot="demo")
791 | form#example_10
792 | h3 用户登录
793 | my-input#loginUsername(label="用户名" data-scope="login" data-name="username", v-validate-easy="[['required']]")
794 | my-input(label="密码" data-scope="login" type="password" data-name="pwd", v-validate-easy="[['required']]")
795 | div.btn-group
796 | button.my-btn(@click.prevent="validatorAll('login')") 主动验证登录表单
797 | button.my-btn(@click.prevent="validateLoginUsername") 主动验证 用户名(单字段验证)
798 | button.my-btn(@click.prevent="resetLoginUsername") 重置用户名表单(单字段重置)
799 | div.btn-group
800 | button.my-btn(@click.prevent="submit('login')") 登录
801 | button.my-btn(@click.prevent="reset('login')") 重置
802 | template(slot="html")
803 | :markdown-it
804 | ```html
805 |
820 | ```
821 | template(slot="javascript")
822 | :markdown-it
823 | ```js
824 | methods:{
825 | // 主动验证所有scope为register的表单元素
826 | validatorAll(scope){
827 | this.V.$validateAll(scope)
828 | },
829 | // 主动验证登录用户名
830 | // 传入的参数为使用了 v-validate-easy指令的元素
831 | validateLoginUsername(){
832 | this.V.$validateSingle(document.querySelector('#loginUsername'))
833 | },
834 | resetLoginUsername() {
835 | this.V.$resetSingle(document.querySelector('#loginUsername'))
836 | },
837 | }
838 | ```
839 |
840 | :markdown-it
841 | ## 6. 自定义错误提示方法
842 | code-tab#example_11(:nav="[{name:'demo'},{name:'html'},{name:'javascript'}]")
843 | template(slot="demo")
844 | form#example_11
845 | h3 用户注册
846 | my-input(label="邮箱(alert方式提示错误)" data-error-option="alert" data-scope="register" data-name="email", v-validate-easy.lazy="[['required','邮箱不能为空'],['email']]")
847 | my-input#register_pwd(label="密码" data-scope="register" type="password" data-name="pwd", v-validate-easy="[['required']]")
848 | my-input(label="再次输入密码" data-scope="register" type="password" data-name="repeatPwd", v-validate-easy="[['required'],['equalTo',['#register_pwd']]]")
849 | div.btn-group
850 | button.my-btn(@click.prevent="submit('register')") 注册
851 | button.my-btn(@click.prevent="reset('register')") 重置
852 | template(slot="html")
853 | :markdown-it
854 | ```html
855 |
870 | ```
871 | template(slot="javascript")
872 | :markdown-it
873 | ```js
874 | beforeCreate(){
875 | // 使用了data-error-option="alert"表单元素,当验证错误的时候会,弹出错误信息
876 | this.V.$addErrorOption('alert', {
877 | show(err, directiveEl, errContent) {
878 | console.log({err, directiveEl, errContent})
879 | if (err) {
880 | alert(errContent)
881 | }
882 | },
883 | reset(el) {
884 | console.log('data-error-option="alert" reset')
885 | }
886 | })
887 | }
888 | ```
889 |
890 | :markdown-it
891 | ## 7. 自定义表单元素(不借助原生实现)
892 | code-tab#example_1(:nav="[{name:'demo'},{name:'custom',text:'自定义表单元素'}]")
893 | template(slot ="demo")
894 | form
895 | custom-checks(
896 | question="这是一个问题?(多选)",
897 | data-scope="examination",
898 | data-custom="wahaha",
899 | data-name="answer",
900 | :data="[{text:'A.选项1',value:'A'},{text:'B.选项2',value:'B'},{text:'C.选项3',value:'C'},{text:'D.选项4',value:'D'}]",
901 | v-validate-easy="[['required','请选择你的答案']]"
902 | )
903 | div.btn-group
904 | button.my-btn(@click.prevent="submit('examination')") 提交答案
905 | button.my-btn(@click.prevent="reset('examination')") 重置
906 | template(slot ="custom")
907 | a(href="https://github.com/lfyfly/vue-validate-easy/blob/master/src/components/custom-checks.vue" target="_blank") custom-checks.vue
908 |
909 | :markdown-it
910 | # Api
911 | ## 8. options
912 | ### 8.1 options.validators
913 | 用于批量新增自定义验证方法
914 | ```js
915 | import validators from './my-validators/validators'
916 | var validators ={
917 | validateMethod1(val){
918 |
919 | },
920 | validateMethod1(val){
921 |
922 | },
923 | ....
924 | }
925 | Vue.use(vueValidateEasy,{validators})
926 | ```
927 | ## 9. 属性
928 | ### 9.1 scope data-type name delay data-error-option
929 | `以下属性只能使用在使用了v-validate-easy指令的元素上`
930 |
931 | 属性 | 必填 | 属性值 | 描述
932 | ---|---|---|---
933 | data-scope | 必填 | 自定义 | 用于标识为同一组表单,作为 $submit 和 $reset 的方法的参数传入
934 | data-name | 必填 | 自定义 | 表单数据字段键值
935 | data-type | 可选 |'checkbox' 'radio' 'select' 'input' 'textarea'| 指定表单类型
936 | data-delay | 可选 | 整数,如'1000' |单位(ms),当输入框为oninput事件触发的时候,用于限制触发频率
937 | data-error-option | 可选 | 通过V.$addErrorOption添加的错误处理方法名 | 处理错误的提示,需要手动添加,默认值为 'default'
938 |
939 | ## 10. v-validate-easy指令
940 | ### 10.1 指令值
941 | v-validate-easy 的值是一个数组,最多只有三个元素。
942 | 数组中的元素 | 类型 | 必填 | 描述
943 | ---|--- |--- |---
944 | 第一个数组元素 | String | 必填 | 验证的方法名
945 | 第二个数组元素 | Arrary \| String | 可选 | 为Arrary类型时值的是验证方法的接收参数,String类型时为自定义错误信息
946 | 第三个数组元素 | String | 可选 | 自定义错误信息,只有当第二个元素为Array类型时才生效。
947 |
948 | ### 10.2 指令修饰符
949 | 修饰符 | 作用
950 | ---|---
951 | v-validate-easy.delay | 输入框为oninput事件触发的时候,用于限制触发频率,触发间隔500ms。delay属性可自定义该时间。
952 | v-validate-easy.lazy | 只会blur事件之后才会触发验证
953 | **注意**: 如果两个修饰符同时使用(v-validate-easy.lazy.delay),**只有.lazy修饰符起作用**
954 |
955 | ## 11. 方法
956 | ### V.$submit
957 | #### 语法
958 | ```js
959 | this.V.$submit(scope, (canSumit,data) => {
960 | //- 对验证结果进行处理
961 | })
962 | ```
963 | #### 参数
964 | 参数 | 必填 | 类型 | 描述
965 | ---|---|--- |---
966 | scope | 必填 | String | 同一组表单标识
967 | callBack | 必填 | function | 对验证结果进行处理
968 | #### 回调参数
969 | 参数 | 类型 | 描述
970 | ---|--- |---
971 | canSumit | Boolean | 为true是,说明当前scope的表单数据全部验证通过
972 | data | Object | 当前scope表单的数据
973 | errData | Object | 当前scope表单验证错误的数据,canSumit为true时,errData为null
974 | ### V.$reset
975 | 重置当前scope的所有表单
976 |
977 | #### 语法
978 | ```
979 | this.V.$reset(scope)
980 | ```
981 | ### V.$resetSingle
982 | 重置单个表单字段
983 |
984 | #### 语法
985 | ```
986 | this.V.$resetSingle(directiveEl)
987 | ```
988 | ### V.$validateAll
989 | 主动调用验证当前scope的所有元素
990 |
991 | #### 语法
992 | ```
993 | this.V.$validateAll(scope)
994 | ```
995 | #### 返回值
996 | ```
997 | // this.V.$validateAll是个async函数,想要取得返回值需用async函数嵌套
998 | method:{
999 | async validateAll(scope){
1000 | var { canSumit, data, errData } = await validateAll(scope)
1001 | // 获得的值与 this.V.$submit方法的参数一致
1002 | }
1003 | }
1004 | ```
1005 | ### V.$validateSingle
1006 | 主动调用验证当前表单元素的字段
1007 |
1008 | #### 语法
1009 | ```
1010 | this.V.$validateSingle(directiveEl)
1011 | ```
1012 | #### 返回值
1013 | ```
1014 | // this.V.$validate是个async函数,想要取得返回值需用async函数嵌套
1015 | method:{
1016 | async validate(el){
1017 | var { err,value } = await validate(el)
1018 | // err代表是否验证错误
1019 | // value是该字段的值
1020 | }
1021 | }
1022 | ```
1023 | ### V.$addValidateMethod
1024 | 新增验证方法
1025 |
1026 | #### 语法
1027 | ```
1028 | // 新增一个名为methodName的验证方法
1029 | this.V.$addValidateMethod(methodName, method)
1030 | // 新增多个验证方法
1031 | // validators是一个对象,可以包含多个验证方法
1032 | this.V.$addValidateMethod(validators)
1033 | ```
1034 |
1035 | #### 实例如下
1036 | ```
1037 | beforeCreate(){
1038 | // this.V.$addValidateMethod(methodName,method)
1039 | this.V.$addValidateMethod('password', function (val) {
1040 | var p = /^(\w|[~`!@#$%^&()\[\]:;"'|\?/><.,{}=*\\+-])+$/.test(val)
1041 | if(!p) return '密码只能由非空格,字母和常用字符'
1042 | })
1043 |
1044 | // 也可传入对象批量新增
1045 | this.V.$addValidateMethod({
1046 | validator1(){},
1047 | validator2(){},
1048 | validator3(){},
1049 | // ....
1050 | })
1051 | }
1052 | ```
1053 | ### V.$addErrorOption
1054 | ```
1055 | this.V.$addErrorOption('data-error-option-name', {
1056 | show(err, directiveEl, errContent) {
1057 | if (err) {
1058 | console.log(errContent)
1059 | }
1060 | },
1061 | reset() {
1062 | console.log('reset')
1063 | }
1064 | })
1065 |
1066 | ```
1067 | ### 关于自定义验证方法书写规则
1068 | ```
1069 | // val为当前表单的值
1070 | // len为验证所需参数,是由指令传如值的元素数组中的第二个数组元素
1071 | // v-validate-easy="[['length',[6]]]" ,6是传给length验证方法的的第二个参数(也就是len)
1072 | // 注意参数是个数组类型,要写成['length',[6]], 不能写成['length',6]
1073 | // 返回值是验证不通过时的默认错误提示语
1074 | this.V.$addValidateMethod({
1075 | length (val, len) {
1076 | if (len != val.length) return `长度必须为${len}位`
1077 | }
1078 | })
1079 |
1080 | ```
1081 |
1082 |
1083 |
1084 |
1226 |
--------------------------------------------------------------------------------
/docs/static/js/app.a379f00e7957f3d6eeb0.js:
--------------------------------------------------------------------------------
1 | webpackJsonp([1],{ETNL:function(e,t){},NHnr:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=a("ju79"),r=a.n(n),s=a("7+uW"),i=a("Xxa5"),l=a.n(i),c=a("exGp"),o=a.n(c),u=a("mvHQ"),d=a.n(u),v=a("mtWM"),p=a.n(v),m={render:function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"my-input",attrs:{"data-type":"input"}},[t("label",[t("div",{staticClass:"label"},[this._v(this._s(this.label))]),t("div",[t("input",{attrs:{placeholder:this.placeholder,spellcheck:"false",type:this.type},domProps:{value:this.value}})])])])},staticRenderFns:[]};var b=a("VU/8")({name:"my-input",props:["value","label","placeholder","type"],data:function(){return{msg:"this is from my-input.vue"}}},m,!1,function(e){a("mTPd")},null,null).exports,_={name:"code-tab",props:["nav"],data:function(){return{msg:"this is from code-tab.vue",activeIndex:0}},methods:{test:function(e){alert(e)}}},h={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"code-tab"},[a("ul",{staticClass:"nav"},e._l(e.nav,function(t,n){return a("li",{staticClass:"nav-item",class:{active:n==e.activeIndex},on:{click:function(t){e.activeIndex=n}}},[e._v(e._s(t.text?t.text:t.name))])})),a("div",{staticClass:"content"},e._l(e.nav,function(t,n){return a("div",{directives:[{name:"show",rawName:"v-show",value:n==e.activeIndex,expression:"i==activeIndex"}],staticClass:"content-item"},[e._t(t.name)],2)}))])},staticRenderFns:[]};var f=a("VU/8")(_,h,!1,function(e){a("hSb9")},null,null).exports,y={name:"custom-checks",props:{data:{type:Array,default:[{text:"text",value:"value"}]},scope:String,name:String,question:String},data:function(){return{msg:"this is from custom-checks.vue",innerData:this.data.map(function(e){return e.checked=!1,e})}},computed:{value:function(){var e=[];return this.innerData.forEach(function(t){t.checked&&e.push(t.value?t.value:t.text)}),e}},methods:{checkFn:function(e,t){this.innerData[t].checked=!this.innerData[t].checked,this.$el.value=this.value},bindEvent:function(e){var t=this;this.$el.onclick=function(){e(t.$el,t.$el.value)}},reset:function(){this.$el.value=[],this.innerData=this.data.map(function(e){return e.checked=!1,e})},getValue:function(){return this.$el.value}},mounted:function(){this.$el.bindEvent=this.bindEvent,this.$el.reset=this.reset,this.$el.getValue=this.getValue}},g={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"custom-checks",attrs:{"data-type":"custom"}},[a("h4",{staticClass:"question"},[e._v(e._s(e.question))]),a("div",{staticClass:"checks-container"},e._l(e.innerData,function(t,n){return a("div",{staticClass:"check-item",class:{checked:t.checked},on:{click:function(t){e.checkFn(t,n)}}},[e._v(e._s(t.text))])}))])},staticRenderFns:[]};var x,C,k=a("VU/8")(y,g,!1,function(e){a("Q89W")},null,null).exports,w=a("fZjL"),N=a.n(w),E=a("OvRC"),q=a.n(E),$=a("pFYg"),S=a.n($);x=function(e){function t(e){return e.replace(/&/g,"&").replace(//g,">")}function a(e){return e.nodeName.toLowerCase()}function n(e,t){var a=e&&e.exec(t);return a&&0===a.index}function r(e){return g.test(e)}function s(e){var t,a={},n=Array.prototype.slice.call(arguments,1);for(t in e)a[t]=e[t];return n.forEach(function(e){for(t in e)a[t]=e[t]}),a}function i(e){var t=[];return function e(n,r){for(var s=n.firstChild;s;s=s.nextSibling)3===s.nodeType?r+=s.nodeValue.length:1===s.nodeType&&(t.push({event:"start",offset:r,node:s}),r=e(s,r),a(s).match(/br|hr|img|input/)||t.push({event:"stop",offset:r,node:s}));return r}(e,0),t}function l(e,n,r){function s(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function l(e){u+=""+a(e)+">"}function c(e){("start"===e.event?i:l)(e.node)}for(var o=0,u="",d=[];e.length||n.length;){var v=s();if(u+=t(r.substring(o,v[0].offset)),o=v[0].offset,v===e){d.reverse().forEach(l);do{c(v.splice(0,1)[0]),v=s()}while(v===e&&v.length&&v[0].offset===o);d.reverse().forEach(i)}else"start"===v[0].event?d.push(v[0].node):d.pop(),c(v.splice(0,1)[0])}return u+t(r.substr(o))}function c(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(t){return s(e,{v:null},t)})),e.cached_variants||e.eW&&[s(e)]||[e]}function o(e){function t(e){return e&&e.source||e}function a(a,n){return new RegExp(t(a),"m"+(e.cI?"i":"")+(n?"g":""))}!function n(r,s){if(!r.compiled){if(r.compiled=!0,r.k=r.k||r.bK,r.k){var i={},l=function(t,a){e.cI&&(a=a.toLowerCase()),a.split(" ").forEach(function(e){var a=e.split("|");i[a[0]]=[t,a[1]?Number(a[1]):1]})};"string"==typeof r.k?l("keyword",r.k):h(r.k).forEach(function(e){l(e,r.k[e])}),r.k=i}r.lR=a(r.l||/\w+/,!0),s&&(r.bK&&(r.b="\\b("+r.bK.split(" ").join("|")+")\\b"),r.b||(r.b=/\B|\b/),r.bR=a(r.b),r.e||r.eW||(r.e=/\B|\b/),r.e&&(r.eR=a(r.e)),r.tE=t(r.e)||"",r.eW&&s.tE&&(r.tE+=(r.e?"|":"")+s.tE)),r.i&&(r.iR=a(r.i)),null==r.r&&(r.r=1),r.c||(r.c=[]),r.c=Array.prototype.concat.apply([],r.c.map(function(e){return c("self"===e?r:e)})),r.c.forEach(function(e){n(e,r)}),r.starts&&n(r.starts,s);var o=r.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([r.tE,r.i]).map(t).filter(Boolean);r.t=o.length?a(o.join("|"),!0):{exec:function(){return null}}}}(e)}function u(e,a,r,s){function i(e,t){var a,r;for(a=0,r=t.c.length;r>a;a++)if(n(t.c[a].bR,e))return t.c[a]}function l(e,t){if(n(e.eR,t)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?l(e.parent,t):void 0}function c(e,t){return!r&&n(t.iR,e)}function v(e,t){var a=y.cI?t[0].toLowerCase():t[0];return e.k.hasOwnProperty(a)&&e.k[a]}function p(e,t,a,n){var r='')+t+(a?"":k)}function m(){N+=null!=x.sL?function(){var e="string"==typeof x.sL;if(e&&!f[x.sL])return t(E);var a=e?u(x.sL,E,!0,C[x.sL]):d(E,x.sL.length?x.sL:void 0);return x.r>0&&($+=a.r),e&&(C[x.sL]=a.top),p(a.language,a.value,!1,!0)}():function(){var e,a,n,r;if(!x.k)return t(E);for(r="",a=0,x.lR.lastIndex=0,n=x.lR.exec(E);n;)r+=t(E.substring(a,n.index)),(e=v(x,n))?($+=e[1],r+=p(e[0],t(n[0]))):r+=t(n[0]),a=x.lR.lastIndex,n=x.lR.exec(E);return r+t(E.substr(a))}(),E=""}function _(e){N+=e.cN?p(e.cN,"",!0):"",x=q()(e,{parent:{value:x}})}function h(e,t){if(E+=e,null==t)return m(),0;var a=i(t,x);if(a)return a.skip?E+=t:(a.eB&&(E+=t),m(),a.rB||a.eB||(E=t)),_(a),a.rB?0:t.length;var n=l(x,t);if(n){var r=x;r.skip?E+=t:(r.rE||r.eE||(E+=t),m(),r.eE&&(E=t));do{x.cN&&(N+=k),x.skip||($+=x.r),x=x.parent}while(x!==n.parent);return n.starts&&_(n.starts),r.rE?0:t.length}if(c(t,x))throw new Error('Illegal lexeme "'+t+'" for mode "'+(x.cN||"")+'"');return E+=t,t.length||1}var y=b(e);if(!y)throw new Error('Unknown language: "'+e+'"');o(y);var g,x=s||y,C={},N="";for(g=x;g!==y;g=g.parent)g.cN&&(N=p(g.cN,"",!0)+N);var E="",$=0;try{for(var S,V,A=0;x.t.lastIndex=A,S=x.t.exec(a);)V=h(a.substring(A,S.index),S[0]),A=S.index+V;for(h(a.substr(A)),g=x;g.parent;g=g.parent)g.cN&&(N+=k);return{r:$,value:N,language:e,top:x}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:t(a)};throw e}}function d(e,a){a=a||w.languages||h(f);var n={r:0,value:t(e)},r=n;return a.filter(b).forEach(function(t){var a=u(t,e,!1);a.language=t,a.r>r.r&&(r=a),a.r>n.r&&(r=n,n=a)}),r.language&&(n.second_best=r),n}function v(e){return w.tabReplace||w.useBR?e.replace(C,function(e,t){return w.useBR&&"\n"===e?"
":w.tabReplace?t.replace(/\t/g,w.tabReplace):""}):e}function p(e){var t,a,n,s,c,o=function(e){var t,a,n,s,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",a=x.exec(i))return b(a[1])?a[1]:"no-highlight";for(t=0,n=(i=i.split(/\s+/)).length;n>t;t++)if(r(s=i[t])||b(s))return s}(e);r(o)||(w.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/
/g,"\n"):t=e,c=t.textContent,n=o?u(o,c,!0):d(c),(a=i(t)).length&&((s=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=n.value,n.value=l(a,i(s),c)),n.value=v(n.value),e.innerHTML=n.value,e.className=function(e,t,a){var n=t?y[t]:a,r=[e.trim()];return e.match(/\bhljs\b/)||r.push("hljs"),-1===e.indexOf(n)&&r.push(n),r.join(" ").trim()}(e.className,o,n.language),e.result={language:n.language,re:n.r},n.second_best&&(e.second_best={language:n.second_best.language,re:n.second_best.r}))}function m(){if(!m.called){m.called=!0;var e=document.querySelectorAll("pre code");_.forEach.call(e,p)}}function b(e){return e=(e||"").toLowerCase(),f[e]||f[y[e]]}var _=[],h=N.a,f={},y={},g=/^(no-?highlight|plain|text)$/i,x=/\blang(?:uage)?-([\w-]+)\b/i,C=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,k="",w={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=u,e.highlightAuto=d,e.fixMarkup=v,e.highlightBlock=p,e.configure=function(e){w=s(w,e)},e.initHighlighting=m,e.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",m,!1),addEventListener("load",m,!1)},e.registerLanguage=function(t,a){var n=f[t]=a(e);n.aliases&&n.aliases.forEach(function(e){y[e]=t})},e.listLanguages=function(){return h(f)},e.getLanguage=b,e.inherit=s,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(t,a,n){var r=e.inherit({cN:"comment",b:t,e:a,c:[]},n||{});return r.c.push(e.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),r},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e},C="object"==("undefined"==typeof window?"undefined":S()(window))&&window||"object"==("undefined"==typeof self?"undefined":S()(self))&&self,"undefined"!=typeof exports?x(exports):C&&(C.hljs=x({}),"function"==typeof define&&a("nErl")&&define([],function(){return C.hljs})),hljs.registerLanguage("css",function(e){var t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:"[a-zA-Z-][a-zA-Z0-9_-]*",r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}}),hljs.registerLanguage("javascript",function(e){var t="[A-Za-z$_][0-9A-Za-z$_]*",a={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},n={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},r={cN:"subst",b:"\\$\\{",e:"\\}",k:a,c:[]},s={cN:"string",b:"`",e:"`",c:[e.BE,r]};r.c=[e.ASM,e.QSM,s,n,e.RM];var i=r.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:a,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,s,e.CLCM,e.CBCM,n,{b:/[{,]\s*/,r:0,c:[{b:t+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:t,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+t+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:t},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:a,c:i}]}]},{b:/,e:/(\/\w+|\w+\/)>/,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:t}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:i}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}}),hljs.registerLanguage("xml",function(e){var t={eW:!0,i:/,r:0,c:[{cN:"attr",b:"[A-Za-z0-9\\._:-]+",r:0},{b:/=\s*/,r:0,c:[{cN:"string",endsParent:!0,v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},e.C("\x3c!--","--\x3e",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"