Browse Source

表单upload 组件

old
wangqing 5 years ago
parent
commit
d9447fa020
  1. 2
      src/components/generator/config.js
  2. 26
      src/components/parser/Parser.vue
  3. 143
      src/components/render/render.js
  4. 4
      src/views/form/statistics.vue

2
src/components/generator/config.js

@ -501,7 +501,7 @@ export const selectComponents = [
__slot__: { __slot__: {
'list-type': true 'list-type': true
}, },
action: 'https://jsonplaceholder.typicode.com/posts/', action: 'https://api.freebrio.com/api/v1/file/upload',
disabled: false, disabled: false,
accept: '', accept: '',
name: 'file', name: 'file',

26
src/components/parser/Parser.vue

@ -135,6 +135,28 @@ function renderChildren(h, scheme) {
return renderFormItem.call(this, h, config.children) return renderFormItem.call(this, h, config.children)
} }
function setUpload(config, scheme, response, file, fileList) {
debugger
console.log(this[this.formConf.formModel][scheme.__vModel__])
let newValue = JSON.parse(this[this.formConf.formModel][scheme.__vModel__])
if (!newValue) {
newValue = []
}
newValue.push({name: file.name, url: response.data})
this.$set(config, 'defaultValue', JSON.stringify(newValue))
this.$set(this[this.formConf.formModel], scheme.__vModel__, JSON.stringify(newValue))
}
function deleteUpload(event, config, scheme, file, fileList) {
let newValue = []
fileList.forEach(element => {
newValue.push({name: element.name, url: element.url})
})
this.$set(config, 'defaultValue', JSON.stringify(newValue))
this.$set(this[this.formConf.formModel], scheme.__vModel__, JSON.stringify(newValue))
}
function setValue(event, config, scheme) { function setValue(event, config, scheme) {
this.$set(config, 'defaultValue', event) this.$set(config, 'defaultValue', event)
this.$set(this[this.formConf.formModel], scheme.__vModel__, event) this.$set(this[this.formConf.formModel], scheme.__vModel__, event)
@ -183,6 +205,8 @@ function buildListeners(scheme) {
}) })
// render.js vModel $emit('input', val) // render.js vModel $emit('input', val)
listeners.input = event => setValue.call(this, event, config, scheme) listeners.input = event => setValue.call(this, event, config, scheme)
listeners.upload = (response, file, fileList) => setUpload.call(this, config, scheme, response, file, fileList)
listeners.deleteUpload = event => setValue.call(this, event, config, scheme)
return listeners return listeners
} }
@ -230,7 +254,7 @@ export default {
let tagOptionKey = processType[temConfig.tag] let tagOptionKey = processType[temConfig.tag]
let defaultValue = temConfig.defaultValue let defaultValue = temConfig.defaultValue
let labelStr = '' let labelStr = ''
if (tagOptionKey&&defaultValue) { if (tagOptionKey && defaultValue) {
if (defaultValue instanceof Array) { if (defaultValue instanceof Array) {
defaultValue.forEach(item => { defaultValue.forEach(item => {
let {label} = getObject(_.get(cur, tagOptionKey), 'value', item) let {label} = getObject(_.get(cur, tagOptionKey), 'value', item)

143
src/components/render/render.js

@ -1,4 +1,4 @@
import { deepClone } from '@/utils/index' import {deepClone} from '@/utils/index'
const componentChild = {} const componentChild = {}
/** /**
@ -9,96 +9,109 @@ const componentChild = {}
const slotsFiles = require.context('./slots', false, /\.js$/) const slotsFiles = require.context('./slots', false, /\.js$/)
const keys = slotsFiles.keys() || [] const keys = slotsFiles.keys() || []
keys.forEach(key => { keys.forEach(key => {
const tag = key.replace(/^\.\/(.*)\.\w+$/, '$1') const tag = key.replace(/^\.\/(.*)\.\w+$/, '$1')
const value = slotsFiles(key).default const value = slotsFiles(key).default
componentChild[tag] = value componentChild[tag] = value
}) })
function vModel(dataObject, defaultValue) { function vModel(dataObject, defaultValue) {
dataObject.props.value = defaultValue let config = dataObject.attrs.__config__
//表单组件特殊处理
if (config.tag === 'el-upload') {
//增加上传回调事件
dataObject.attrs['on-success'] = (response, file, fileList) => {
this.$emit('upload', response, file, fileList)
}
dataObject.attrs['on-remove'] = (file, fileList) => {
this.$emit('deleteUpload', file, fileList)
}
} else {
dataObject.props.value = defaultValue
dataObject.on.input = val => {
this.$emit('input', val)
}
}
dataObject.on.input = val => {
this.$emit('input', val)
}
} }
function mountSlotFlies(h, confClone, children) { function mountSlotFlies(h, confClone, children) {
const childObjs = componentChild[confClone.__config__.tag] const childObjs = componentChild[confClone.__config__.tag]
if (childObjs) { if (childObjs) {
Object.keys(childObjs).forEach(key => { Object.keys(childObjs).forEach(key => {
const childFunc = childObjs[key] const childFunc = childObjs[key]
if (confClone.__slot__ && confClone.__slot__[key]) { if (confClone.__slot__ && confClone.__slot__[key]) {
children.push(childFunc(h, confClone, key)) children.push(childFunc(h, confClone, key))
} }
}) })
} }
} }
function emitEvents(confClone) { function emitEvents(confClone) {
['on', 'nativeOn'].forEach(attr => { ['on', 'nativeOn'].forEach(attr => {
const eventKeyList = Object.keys(confClone[attr] || {}) const eventKeyList = Object.keys(confClone[attr] || {})
eventKeyList.forEach(key => { eventKeyList.forEach(key => {
const val = confClone[attr][key] const val = confClone[attr][key]
if (typeof val === 'string') { if (typeof val === 'string') {
confClone[attr][key] = event => this.$emit(val, event) confClone[attr][key] = event => this.$emit(val, event)
} }
})
}) })
})
} }
function buildDataObject(confClone, dataObject) { function buildDataObject(confClone, dataObject) {
Object.keys(confClone).forEach(key => { Object.keys(confClone).forEach(key => {
const val = confClone[key] const val = confClone[key]
if (key === '__vModel__') { if (key === '__vModel__') {
vModel.call(this, dataObject, confClone.__config__.defaultValue) vModel.call(this, dataObject, confClone.__config__.defaultValue)
} else if (dataObject[key]) { } else if (dataObject[key]) {
dataObject[key] = { ...dataObject[key], ...val } dataObject[key] = {...dataObject[key], ...val}
} else { } else {
dataObject.attrs[key] = val dataObject.attrs[key] = val
} }
}) })
// 清理属性 // 清理属性
clearAttrs(dataObject) clearAttrs(dataObject)
} }
function clearAttrs(dataObject) { function clearAttrs(dataObject) {
delete dataObject.attrs.__config__ delete dataObject.attrs.__config__
delete dataObject.attrs.__slot__ delete dataObject.attrs.__slot__
delete dataObject.attrs.__methods__ delete dataObject.attrs.__methods__
} }
function makeDataObject() { function makeDataObject() {
return { return {
attrs: {}, attrs: {},
props: {}, props: {},
nativeOn: {}, nativeOn: {},
on: {}, on: {},
style: {} style: {}
} }
} }
export default { export default {
props: { props: {
conf: { conf: {
type: Object, type: Object,
required: true required: true
} }
}, },
render(h) { render(h) {
const dataObject = makeDataObject() const dataObject = makeDataObject()
const confClone = deepClone(this.conf) const confClone = deepClone(this.conf)
const children = this.$slots.default || [] const children = this.$slots.default || []
// 如果slots文件夹存在与当前tag同名的文件,则执行文件中的代码 // 如果slots文件夹存在与当前tag同名的文件,则执行文件中的代码
mountSlotFlies.call(this, h, confClone, children) mountSlotFlies.call(this, h, confClone, children)
// 将字符串类型的事件,发送为消息 // 将字符串类型的事件,发送为消息
emitEvents.call(this, confClone) emitEvents.call(this, confClone)
// 将json表单配置转化为vue render可以识别的 “数据对象(dataObject)” // 将json表单配置转化为vue render可以识别的 “数据对象(dataObject)”
buildDataObject.call(this, confClone, dataObject) buildDataObject.call(this, confClone, dataObject)
return h(this.conf.__config__.tag, dataObject, children) return h(this.conf.__config__.tag, dataObject, children)
} }
} }

4
src/views/form/statistics.vue

@ -25,7 +25,7 @@
</div> </div>
<div class="result-table-view"> <div class="result-table-view">
<el-table <el-table
stripe :header-cell-style="{background:'#2466a0'}" stripe
:data="projectResultList"> :data="projectResultList">
<el-table-column <el-table-column
type="selection" type="selection"
@ -198,7 +198,7 @@ export default {
.result-table-view { .result-table-view {
width: 80%; width: 80%;
margin: 0px auto; margin: 6px auto;
} }
.filter-table-view { .filter-table-view {

Loading…
Cancel
Save