feat: vc-form
parent
07b0d46864
commit
c0bf96fccd
|
@ -18,7 +18,7 @@ import {
|
||||||
flattenArray,
|
flattenArray,
|
||||||
} from './utils'
|
} from './utils'
|
||||||
|
|
||||||
const DEFAULT_TRIGGER = 'onChange'
|
const DEFAULT_TRIGGER = 'change'
|
||||||
|
|
||||||
function createBaseForm (option = {}, mixins = []) {
|
function createBaseForm (option = {}, mixins = []) {
|
||||||
const {
|
const {
|
||||||
|
@ -94,7 +94,7 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
const valuesAllSet = {}
|
const valuesAllSet = {}
|
||||||
valuesAll[name] = value
|
valuesAll[name] = value
|
||||||
Object.keys(valuesAll).forEach(key => set(valuesAllSet, key, valuesAll[key]))
|
Object.keys(valuesAll).forEach(key => set(valuesAllSet, key, valuesAll[key]))
|
||||||
onValuesChange(this.props, set({}, name, value), valuesAllSet)
|
onValuesChange(this.$props, set({}, name, value), valuesAllSet)
|
||||||
}
|
}
|
||||||
const field = this.fieldsStore.getField(name)
|
const field = this.fieldsStore.getField(name)
|
||||||
return ({ name, field: { ...field, value, touched: true }, fieldMeta })
|
return ({ name, field: { ...field, value, touched: true }, fieldMeta })
|
||||||
|
@ -148,7 +148,7 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
},
|
},
|
||||||
|
|
||||||
getFieldDecorator (name, fieldOption) {
|
getFieldDecorator (name, fieldOption) {
|
||||||
const { ref, ...restProps } = this.getFieldProps(name, fieldOption)
|
const { directives, props } = this.getFieldProps(name, fieldOption)
|
||||||
return (fieldElem) => {
|
return (fieldElem) => {
|
||||||
const fieldMeta = this.fieldsStore.getFieldMeta(name)
|
const fieldMeta = this.fieldsStore.getFieldMeta(name)
|
||||||
const originalProps = fieldElem.props
|
const originalProps = fieldElem.props
|
||||||
|
@ -173,10 +173,10 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
fieldMeta.ref = fieldElem.ref
|
fieldMeta.ref = fieldElem.ref
|
||||||
return cloneElement(fieldElem, {
|
return cloneElement(fieldElem, {
|
||||||
props: {
|
props: {
|
||||||
...restProps,
|
...props,
|
||||||
...this.fieldsStore.getFieldValuePropValue(fieldMeta),
|
...this.fieldsStore.getFieldValuePropValue(fieldMeta),
|
||||||
},
|
},
|
||||||
ref,
|
directives,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -220,25 +220,10 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
|
|
||||||
const inputProps = {
|
const inputProps = {
|
||||||
...this.fieldsStore.getFieldValuePropValue(fieldOption),
|
...this.fieldsStore.getFieldValuePropValue(fieldOption),
|
||||||
ref: name,
|
// ref: name,
|
||||||
|
on: {},
|
||||||
}
|
}
|
||||||
const saveRef = this.getCacheBind(name, `${name}__ref`, this.saveRef)
|
const saveRef = this.getCacheBind(name, `${name}__ref`, this.saveRef)
|
||||||
this.$nextTick(() => {
|
|
||||||
if (this.instances[name] !== this.$refs[name]) {
|
|
||||||
this.$refs[name].destroyed = () => {
|
|
||||||
this.$refs[name].destroyed()
|
|
||||||
// after destroy, delete data
|
|
||||||
this.clearedFieldMetaCache[name] = {
|
|
||||||
field: this.fieldsStore.getField(name),
|
|
||||||
meta: this.fieldsStore.getFieldMeta(name),
|
|
||||||
}
|
|
||||||
this.fieldsStore.clearField(name)
|
|
||||||
delete this.instances[name]
|
|
||||||
delete this.cachedBind[name]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
saveRef(name, `${name}__ref`, this.$refs[name])
|
|
||||||
})
|
|
||||||
if (fieldNameProp) {
|
if (fieldNameProp) {
|
||||||
inputProps[fieldNameProp] = name
|
inputProps[fieldNameProp] = name
|
||||||
}
|
}
|
||||||
|
@ -252,7 +237,7 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
|
|
||||||
// make sure that the value will be collect
|
// make sure that the value will be collect
|
||||||
if (trigger && validateTriggers.indexOf(trigger) === -1) {
|
if (trigger && validateTriggers.indexOf(trigger) === -1) {
|
||||||
inputProps[trigger] = this.getCacheBind(name, trigger, this.onCollect)
|
inputProps.on[trigger] = this.getCacheBind(name, trigger, this.onCollect)
|
||||||
}
|
}
|
||||||
|
|
||||||
const meta = {
|
const meta = {
|
||||||
|
@ -269,7 +254,14 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
inputProps[fieldDataProp] = this.fieldsStore.getField(name)
|
inputProps[fieldDataProp] = this.fieldsStore.getField(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
return inputProps
|
return {
|
||||||
|
props: inputProps,
|
||||||
|
directives: [
|
||||||
|
{ name: 'ant-form-item-ref-cal', value: (component) => {
|
||||||
|
saveRef(component)
|
||||||
|
} },
|
||||||
|
],
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
getFieldInstance (name) {
|
getFieldInstance (name) {
|
||||||
|
@ -289,9 +281,12 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
if (onFieldsChange) {
|
if (onFieldsChange) {
|
||||||
const changedFields = Object.keys(fields)
|
const changedFields = Object.keys(fields)
|
||||||
.reduce((acc, name) => set(acc, name, this.fieldsStore.getField(name)), {})
|
.reduce((acc, name) => set(acc, name, this.fieldsStore.getField(name)), {})
|
||||||
onFieldsChange(this.props, changedFields, this.fieldsStore.getNestedAllFields())
|
onFieldsChange(this.$props, changedFields, this.fieldsStore.getNestedAllFields())
|
||||||
}
|
}
|
||||||
this.forceUpdate(callback)
|
this.$forceUpdate()
|
||||||
|
this.$nextTick(() => {
|
||||||
|
callback && callback()
|
||||||
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
resetFields (ns) {
|
resetFields (ns) {
|
||||||
|
@ -330,11 +325,22 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
this.setFields(newFields, callback)
|
this.setFields(newFields, callback)
|
||||||
if (onValuesChange) {
|
if (onValuesChange) {
|
||||||
const allValues = this.fieldsStore.getAllValues()
|
const allValues = this.fieldsStore.getAllValues()
|
||||||
onValuesChange(this.props, changedValues, allValues)
|
onValuesChange(this.$props, changedValues, allValues)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
saveRef (name, _, component) {
|
saveRef (name, _, component) {
|
||||||
|
if (!component) {
|
||||||
|
// after destroy, delete data
|
||||||
|
this.clearedFieldMetaCache[name] = {
|
||||||
|
field: this.fieldsStore.getField(name),
|
||||||
|
meta: this.fieldsStore.getFieldMeta(name),
|
||||||
|
}
|
||||||
|
this.fieldsStore.clearField(name)
|
||||||
|
delete this.instances[name]
|
||||||
|
delete this.cachedBind[name]
|
||||||
|
return
|
||||||
|
}
|
||||||
this.recoverClearedField(name)
|
this.recoverClearedField(name)
|
||||||
const fieldMeta = this.fieldsStore.getFieldMeta(name)
|
const fieldMeta = this.fieldsStore.getFieldMeta(name)
|
||||||
if (fieldMeta) {
|
if (fieldMeta) {
|
||||||
|
|
|
@ -2,5 +2,15 @@
|
||||||
import createForm from './createForm'
|
import createForm from './createForm'
|
||||||
import createFormField from './createFormField'
|
import createFormField from './createFormField'
|
||||||
import formShape from './propTypes'
|
import formShape from './propTypes'
|
||||||
|
import Vue from 'vue'
|
||||||
|
|
||||||
|
Vue.directive('ant-form-item-ref-cal', {
|
||||||
|
inserted: function (el, binding, vnode) {
|
||||||
|
binding.value(vnode)
|
||||||
|
},
|
||||||
|
unbind: function (el, binding, vnode) {
|
||||||
|
binding.value()
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
export { createForm, createFormField, formShape }
|
export { createForm, createFormField, formShape }
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "vue-antd-ui",
|
"name": "vue-antd-ui",
|
||||||
"version": "0.4.0",
|
"version": "0.4.3",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -620,6 +620,14 @@
|
||||||
"integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
|
"integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"async-validator": {
|
||||||
|
"version": "1.8.2",
|
||||||
|
"resolved": "http://registry.npm.taobao.org/async-validator/download/async-validator-1.8.2.tgz",
|
||||||
|
"integrity": "sha1-t3WXIm6WJC+NUxwNRq4pX2JCK6Q=",
|
||||||
|
"requires": {
|
||||||
|
"babel-runtime": "6.26.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"asynckit": {
|
"asynckit": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||||
|
@ -1044,6 +1052,12 @@
|
||||||
"integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
|
"integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"babel-plugin-syntax-class-properties": {
|
||||||
|
"version": "6.13.0",
|
||||||
|
"resolved": "http://registry.npm.taobao.org/babel-plugin-syntax-class-properties/download/babel-plugin-syntax-class-properties-6.13.0.tgz",
|
||||||
|
"integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"babel-plugin-syntax-decorators": {
|
"babel-plugin-syntax-decorators": {
|
||||||
"version": "6.13.0",
|
"version": "6.13.0",
|
||||||
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
|
||||||
|
@ -1091,6 +1105,18 @@
|
||||||
"babel-runtime": "6.26.0"
|
"babel-runtime": "6.26.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"babel-plugin-transform-class-properties": {
|
||||||
|
"version": "6.24.1",
|
||||||
|
"resolved": "http://registry.npm.taobao.org/babel-plugin-transform-class-properties/download/babel-plugin-transform-class-properties-6.24.1.tgz",
|
||||||
|
"integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"babel-helper-function-name": "6.24.1",
|
||||||
|
"babel-plugin-syntax-class-properties": "6.13.0",
|
||||||
|
"babel-runtime": "6.26.0",
|
||||||
|
"babel-template": "6.26.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"babel-plugin-transform-decorators": {
|
"babel-plugin-transform-decorators": {
|
||||||
"version": "6.24.1",
|
"version": "6.24.1",
|
||||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
|
"resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
|
||||||
|
|
|
@ -61,6 +61,7 @@
|
||||||
"babel-plugin-istanbul": "^4.1.1",
|
"babel-plugin-istanbul": "^4.1.1",
|
||||||
"babel-plugin-syntax-dynamic-import": "^6.18.0",
|
"babel-plugin-syntax-dynamic-import": "^6.18.0",
|
||||||
"babel-plugin-syntax-jsx": "^6.18.0",
|
"babel-plugin-syntax-jsx": "^6.18.0",
|
||||||
|
"babel-plugin-transform-class-properties": "^6.24.1",
|
||||||
"babel-plugin-transform-decorators": "^6.24.1",
|
"babel-plugin-transform-decorators": "^6.24.1",
|
||||||
"babel-plugin-transform-decorators-legacy": "^1.3.4",
|
"babel-plugin-transform-decorators-legacy": "^1.3.4",
|
||||||
"babel-plugin-transform-es3-member-expression-literals": "^6.22.0",
|
"babel-plugin-transform-es3-member-expression-literals": "^6.22.0",
|
||||||
|
@ -81,8 +82,8 @@
|
||||||
"css-loader": "^0.28.7",
|
"css-loader": "^0.28.7",
|
||||||
"deep-assign": "^2.0.0",
|
"deep-assign": "^2.0.0",
|
||||||
"eslint": "^4.7.2",
|
"eslint": "^4.7.2",
|
||||||
"eslint-plugin-vue": "^3.13.0",
|
|
||||||
"eslint-plugin-html": "^3.2.2",
|
"eslint-plugin-html": "^3.2.2",
|
||||||
|
"eslint-plugin-vue": "^3.13.0",
|
||||||
"eslint-plugin-vue-libs": "^1.2.1",
|
"eslint-plugin-vue-libs": "^1.2.1",
|
||||||
"extract-text-webpack-plugin": "^3.0.2",
|
"extract-text-webpack-plugin": "^3.0.2",
|
||||||
"fetch-jsonp": "^1.1.3",
|
"fetch-jsonp": "^1.1.3",
|
||||||
|
|
Loading…
Reference in New Issue