You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
4.2 KiB
134 lines
4.2 KiB
import baseComponent from '../helpers/baseComponent'
|
|
import createFieldsStore from '../helpers/createFieldsStore'
|
|
|
|
baseComponent({
|
|
relations: {
|
|
'../field/index': {
|
|
type: 'descendant',
|
|
observer(e, { unlinked }) {
|
|
this.renderFields[e.data.name] = unlinked === false
|
|
this.debounce(this.changeValue)
|
|
},
|
|
},
|
|
},
|
|
properties: {},
|
|
methods: {
|
|
/**
|
|
* 更新 value 值,同步到子元素
|
|
*/
|
|
changeValue() {
|
|
const elements = this.getRelationNodes('../field/index')
|
|
|
|
if (elements.length > 0) {
|
|
const fields = elements.reduce((acc, fieldElem) => {
|
|
const { data: originalProps } = fieldElem
|
|
const { name } = originalProps
|
|
const field = this.fieldsStore.getField(name)
|
|
const meta = {
|
|
...originalProps,
|
|
...field,
|
|
originalProps,
|
|
fieldElem,
|
|
}
|
|
|
|
acc[name] = meta
|
|
|
|
this.renderFields[name] = true
|
|
fieldElem.fieldsStore = this.fieldsStore
|
|
|
|
return acc
|
|
}, {})
|
|
|
|
this.fieldsStore.updateFields(fields)
|
|
this.clearUnlinkedFields()
|
|
}
|
|
},
|
|
/**
|
|
* 清除已卸载的元素
|
|
*/
|
|
clearUnlinkedFields() {
|
|
const fieldList = this.fieldsStore.getAllFieldsName()
|
|
const removedList = fieldList.filter((field) => !this.renderFields[field])
|
|
|
|
if (removedList.length > 0) {
|
|
removedList.forEach((name) => this.clearField(name))
|
|
}
|
|
},
|
|
/**
|
|
* 清除字段
|
|
*/
|
|
clearField(name) {
|
|
this.fieldsStore.clearField(name)
|
|
delete this.renderFields[name]
|
|
},
|
|
/**
|
|
* 设置字段
|
|
*/
|
|
setFields(fields) {
|
|
Object.keys(fields).forEach((name) => {
|
|
const field = this.fieldsStore.getField(name)
|
|
const meta = { ...field, value: fields[name] }
|
|
this.fieldsStore.setFields({ [name]: meta })
|
|
if (field && field.fieldElem) {
|
|
field.fieldElem.changeValue(fields[name])
|
|
}
|
|
})
|
|
},
|
|
/**
|
|
* 设置 value
|
|
*/
|
|
setFieldsValue(values) {
|
|
const { fields } = this.fieldsStore
|
|
const changedValues = Object.keys(values).reduce((acc, name) => {
|
|
if (fields[name]) acc[name] = values[name]
|
|
return acc
|
|
}, {})
|
|
this.setFields(changedValues)
|
|
const allValues = this.getFieldsValue()
|
|
this.onChange(changedValues, allValues)
|
|
},
|
|
/**
|
|
* 重置字段
|
|
*/
|
|
resetFields(ns) {
|
|
const names = Array.isArray(ns) ? ns : [ns]
|
|
const newFields = this.fieldsStore.resetFields(names)
|
|
if (Object.keys(newFields).length > 0) {
|
|
this.setFields(newFields)
|
|
}
|
|
},
|
|
/**
|
|
* 表单对外暴露方法
|
|
*/
|
|
getForm() {
|
|
return {
|
|
getFieldsValue: this.getFieldsValue,
|
|
getFieldValue: this.getFieldValue,
|
|
setFieldsValue: this.setFieldsValue,
|
|
setFields: this.setFields,
|
|
resetFields: this.resetFields,
|
|
}
|
|
},
|
|
/**
|
|
* trigger onChange
|
|
*/
|
|
onChange(changedValues, allValues) {
|
|
this.triggerEvent('change', { form: this.getForm(), changedValues, allValues })
|
|
},
|
|
},
|
|
created() {
|
|
const methods = ['getFieldsValue', 'getFieldValue']
|
|
|
|
this.fieldsStore = createFieldsStore()
|
|
this.renderFields = {}
|
|
this.setFieldsValue = this.setFieldsValue.bind(this)
|
|
this.setFields = this.setFields.bind(this)
|
|
this.resetFields = this.resetFields.bind(this)
|
|
|
|
methods.forEach((method) => {
|
|
this[method] = (...args) => {
|
|
return this.fieldsStore[method](...args)
|
|
}
|
|
})
|
|
},
|
|
})
|
|
|