榆山数据端小程序
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

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)
}
})
},
})