Skip to content

Commit 742c4e0

Browse files
committed
feat: 表格组件获取远程数据
1 parent eb64c42 commit 742c4e0

File tree

3 files changed

+60
-16
lines changed

3 files changed

+60
-16
lines changed

src/components/generator/config.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,10 @@ export const layoutComponents = [
559559
changeTag: true,
560560
labelWidth: null,
561561
label: '表格[开发中]',
562+
dataType: 'dynamic',
563+
method: 'get',
564+
dataKey: 'list',
565+
url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/tableData',
562566
children: [{
563567
__config__: {
564568
layout: 'raw',
@@ -610,10 +614,10 @@ export const layoutComponents = [
610614
label: '操作'
611615
}]
612616
},
613-
data: [{
614-
date: '2016-05-02',
615-
name: '王小虎',
616-
address: '上海市普陀区金沙江路 1518 弄'
617+
data: [],
618+
directives: [{
619+
name: 'loading',
620+
value: true
617621
}],
618622
border: true,
619623
type: 'default',

src/views/index/Home.vue

+31
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
:form-conf="formConf"
9696
:show-field="!!drawingList.length"
9797
@tag-change="tagChange"
98+
@fetch-data="fetchData"
9899
/>
99100

100101
<form-drawer
@@ -266,18 +267,48 @@ export default {
266267
})
267268
},
268269
methods: {
270+
fetchData(component) {
271+
const {
272+
dataType, method, url, dataKey, renderKey
273+
} = component.__config__
274+
if (dataType === 'dynamic' && method && url) {
275+
this.setLoading(component, true)
276+
this.$axios({
277+
method,
278+
url
279+
}).then(resp => {
280+
this.setLoading(component, false)
281+
if (dataKey) {
282+
component.data = dataKey.split('.').reduce((pre, item) => pre[item], resp.data)
283+
} else {
284+
component.data = resp.data
285+
}
286+
const i = this.drawingList.findIndex(item => item.__config__.renderKey === renderKey)
287+
if (i > -1) this.$set(this.drawingList, i, component)
288+
})
289+
}
290+
},
291+
setLoading(component, val) {
292+
const { directives } = component
293+
if (Array.isArray(directives)) {
294+
const t = directives.find(d => d.name === 'loading')
295+
if (t) t.value = val
296+
}
297+
},
269298
activeFormItem(currentItem) {
270299
this.activeData = currentItem
271300
this.activeId = currentItem.__config__.formId
272301
},
273302
onEnd(obj) {
274303
if (obj.from !== obj.to) {
304+
this.fetchData(tempActiveData)
275305
this.activeData = tempActiveData
276306
this.activeId = this.idGlobal
277307
}
278308
},
279309
addComponent(item) {
280310
const clone = this.cloneComponent(item)
311+
this.fetchData(clone)
281312
this.drawingList.push(clone)
282313
this.activeFormItem(clone)
283314
},

src/views/index/RightPanel.vue

+21-12
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,9 @@
339339
<el-divider />
340340
</template>
341341

342-
<template v-if="['el-cascader'].indexOf(activeData.__config__.tag) > -1">
342+
<template v-if="['el-cascader', 'el-table'].includes(activeData.__config__.tag)">
343343
<el-divider>选项</el-divider>
344-
<el-form-item label="数据类型">
344+
<el-form-item v-if="activeData.__config__.dataType" label="数据类型">
345345
<el-radio-group v-model="activeData.__config__.dataType" size="small">
346346
<el-radio-button label="dynamic">
347347
动态数据
@@ -359,11 +359,13 @@
359359
:title="activeData.__config__.url"
360360
placeholder="请输入接口地址"
361361
clearable
362+
@blur="$emit('fetch-data', activeData)"
362363
>
363364
<el-select
364365
slot="prepend"
365366
v-model="activeData.__config__.method"
366367
:style="{width: '85px'}"
368+
@change="$emit('fetch-data', activeData)"
367369
>
368370
<el-option label="get" value="get" />
369371
<el-option label="post" value="post" />
@@ -373,17 +375,24 @@
373375
</el-input>
374376
</el-form-item>
375377
<el-form-item label="数据位置">
376-
<el-input v-model="activeData.__config__.dataKey" placeholder="请输入标签键名" />
377-
</el-form-item>
378-
<el-form-item label="标签键名">
379-
<el-input v-model="activeData.props.props.label" placeholder="请输入标签键名" />
380-
</el-form-item>
381-
<el-form-item label="值键名">
382-
<el-input v-model="activeData.props.props.value" placeholder="请输入值键名" />
383-
</el-form-item>
384-
<el-form-item label="子级键名">
385-
<el-input v-model="activeData.props.props.children" placeholder="请输入子级键名" />
378+
<el-input
379+
v-model="activeData.__config__.dataKey"
380+
placeholder="请输入数据位置"
381+
@blur="$emit('fetch-data', activeData)"
382+
/>
386383
</el-form-item>
384+
385+
<template v-if="activeData.props && activeData.props.props">
386+
<el-form-item label="标签键名">
387+
<el-input v-model="activeData.props.props.label" placeholder="请输入标签键名" />
388+
</el-form-item>
389+
<el-form-item label="值键名">
390+
<el-input v-model="activeData.props.props.value" placeholder="请输入值键名" />
391+
</el-form-item>
392+
<el-form-item label="子级键名">
393+
<el-input v-model="activeData.props.props.children" placeholder="请输入子级键名" />
394+
</el-form-item>
395+
</template>
387396
</template>
388397

389398
<!-- 级联选择静态树 -->

0 commit comments

Comments
 (0)