Commit 7f08f95a87e8438312040614f7f1c4a331e160a4

Authored by Aaron
1 parent f27f3d42
Exists in master and in 1 other branch legacy

优化新式表单渲染逻辑

examples/views/page/form-new/dynamic-render.js 0 → 100644
@@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
  1 +export default {
  2 + functional: true,
  3 + render(h, context) {
  4 + return context.props.render;
  5 + }
  6 +}
0 \ No newline at end of file 7 \ No newline at end of file
examples/views/page/form-new/form-render.vue
@@ -26,7 +26,17 @@ @@ -26,7 +26,17 @@
26 > 26 >
27 <el-form-item :label="item.label" :label-width="item.labelWidth" :prop="item.fullKey" :rules="item.rules" :class="itemClass || 'eagle-form__item'"> 27 <el-form-item :label="item.label" :label-width="item.labelWidth" :prop="item.fullKey" :rules="item.rules" :class="itemClass || 'eagle-form__item'">
28 <!-- 自定义组件 --> 28 <!-- 自定义组件 -->
29 - <component :is="item.type" :value="itemValue(item)" @input="v => onInput({ value: v, item })" 29 + <dynamic-render v-if="typeof item.type === 'function'"
  30 + :render="item.type($createElement, { model: value, config: {
  31 + props: { ...item.props, value: itemValue(item) },
  32 + style: item.style || { maxWidth: '100%' },
  33 + on: {
  34 + ...bindItemEvent(item),
  35 + input: v => onInput({ value: v, item })
  36 + }
  37 + } })"
  38 + ></dynamic-render>
  39 + <component v-else :is="item.type" :value="itemValue(item)" @input="v => onInput({ value: v, item })"
30 v-on="bindItemEvent(item)" v-bind="item.props" :style="item.style || { maxWidth: '100%' }" 40 v-on="bindItemEvent(item)" v-bind="item.props" :style="item.style || { maxWidth: '100%' }"
31 ></component> 41 ></component>
32 </el-form-item> 42 </el-form-item>
@@ -36,8 +46,11 @@ @@ -36,8 +46,11 @@
36 </template> 46 </template>
37 47
38 <script> 48 <script>
  49 +import DynamicRender from './dynamic-render';
  50 +
39 export default { 51 export default {
40 name: 'form-render', 52 name: 'form-render',
  53 + components: { DynamicRender },
41 props: { 54 props: {
42 list: Array, 55 list: Array,
43 model: Object, 56 model: Object,
examples/views/page/form-new/index.vue
@@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
17 17
18 <template> 18 <template>
19 <el-form ref="form" size="mini" :class="formClass" :model="formModel" :label-width="labelWidth" :label-position="labelPosition || labelWidth ? 'right' : 'top'"> 19 <el-form ref="form" size="mini" :class="formClass" :model="formModel" :label-width="labelWidth" :label-position="labelPosition || labelWidth ? 'right' : 'top'">
  20 + <!-- <dynamic-render :render="$createElement('el-tag', { props: { type: 'danger' } }, ['Tag', $createElement('el-tag', { props: { size: 'mini' } }, ['Tag'])])"></dynamic-render> -->
20 <form-render :title-class="titleClass" :content-class="contentClass" :item-class="itemClass" :group-class="groupClass" 21 <form-render :title-class="titleClass" :content-class="contentClass" :item-class="itemClass" :group-class="groupClass"
21 :list="formList" :value="model" :model="model" :span="span" :type="type" 22 :list="formList" :value="model" :model="model" :span="span" :type="type"
22 @item-change="onItemChange" @form-item-change="onFormItemChange" @item-update="onItemUpdate" 23 @item-change="onItemChange" @form-item-change="onFormItemChange" @item-update="onItemUpdate"
@@ -26,11 +27,12 @@ @@ -26,11 +27,12 @@
26 27
27 <script> 28 <script>
28 import FormRender from './form-render'; 29 import FormRender from './form-render';
  30 +import DynamicRender from './dynamic-render';
29 import { cloneDeep, set } from './util'; 31 import { cloneDeep, set } from './util';
30 32
31 export default { 33 export default {
32 name: 'FormNew', 34 name: 'FormNew',
33 - components: { FormRender }, 35 + components: { FormRender, DynamicRender },
34 props: { 36 props: {
35 value: Object, 37 value: Object,
36 list: Array, 38 list: Array,
@@ -48,6 +50,9 @@ export default { @@ -48,6 +50,9 @@ export default {
48 } 50 }
49 }, 51 },
50 data() { 52 data() {
  53 + const $fullProps = { ...this.$attrs, ...this.$props };
  54 + console.log($fullProps);
  55 + console.log(this);
51 return { 56 return {
52 model: {}, 57 model: {},
53 formModel: {}, 58 formModel: {},
@@ -88,6 +93,9 @@ export default { @@ -88,6 +93,9 @@ export default {
88 } 93 }
89 }, 94 },
90 methods: { 95 methods: {
  96 + handleInput(value) {
  97 + console.log(value);
  98 + },
91 /** 99 /**
92 * @description 表单项值变化 100 * @description 表单项值变化
93 * @param {Object} item 表单项值对象 101 * @param {Object} item 表单项值对象
examples/views/page/other.vue
@@ -47,7 +47,7 @@ @@ -47,7 +47,7 @@
47 <!-- <eg-form ref="form" v-model="model" :list="option.list" @validate="onValidate" label-width="80px" :span="6" type="div"></eg-form> --> 47 <!-- <eg-form ref="form" v-model="model" :list="option.list" @validate="onValidate" label-width="80px" :span="6" type="div"></eg-form> -->
48 <eg-form 48 <eg-form
49 ref="form" v-model="model" :list="option.list" @validate="onValidate" :span="4" 49 ref="form" v-model="model" :list="option.list" @validate="onValidate" :span="4"
50 - group-class="custom-group" 50 + group-class="custom-group" :just-a-text-props="() => 'test'"
51 form-class="custom-form" title-class="custom-title" content-class="custom-content" item-class="custom-item" 51 form-class="custom-form" title-class="custom-title" content-class="custom-content" item-class="custom-item"
52 ></eg-form> 52 ></eg-form>
53 </div> 53 </div>
@@ -74,7 +74,17 @@ export default { @@ -74,7 +74,17 @@ export default {
74 { 74 {
75 group: { title: '基础信息', span: 12 }, 75 group: { title: '基础信息', span: 12 },
76 list: [ 76 list: [
77 - { type: 'el-input', label: '名称', key: 'name' }, 77 + {
  78 + type(h, { config }) {
  79 + return h(
  80 + 'el-tooltip',
  81 + { props: { content: '这里是提示', placement: 'top', effect: 'dark' } },
  82 + [h('el-input', config)]
  83 + )
  84 + },
  85 + label: '名称',
  86 + key: 'name'
  87 + },
78 { type: 'el-input-number', label: '年龄', key: 'age', 88 { type: 'el-input-number', label: '年龄', key: 'age',
79 render(h, { row, value }) { 89 render(h, { row, value }) {
80 return h('el-tag', { props: { type: 'warning', size: 'mini' } }, [h('span', `${value}[${row.name}]`)]) 90 return h('el-tag', { props: { type: 'warning', size: 'mini' } }, [h('span', `${value}[${row.name}]`)])
examples/views/page/table-new/index.vue
@@ -17,7 +17,7 @@ @@ -17,7 +17,7 @@
17 <!-- 如果有表格列具名插槽 --> 17 <!-- 如果有表格列具名插槽 -->
18 <slot v-if="$scopedSlots[item.keyPath.join('-')]" :name="item.keyPath.join('-')" v-bind="item"></slot> 18 <slot v-if="$scopedSlots[item.keyPath.join('-')]" :name="item.keyPath.join('-')" v-bind="item"></slot>
19 <!-- 默认表格列渲染 --> 19 <!-- 默认表格列渲染 -->
20 - <el-table-column v-else v-bind="item" :prop="item.fullKey || item.key" :key="index" :min-width="minWidth || item.minWidth || item['min-width']"> 20 + <el-table-column v-else v-bind="{ ...item, type: undefined }" :prop="item.fullKey || item.key" :key="index" :min-width="minWidth || item.minWidth || item['min-width']">
21 <template #default="{ row, column, $index }"> 21 <template #default="{ row, column, $index }">
22 <cell-render :row="row" :item="item"> 22 <cell-render :row="row" :item="item">
23 <!-- 如果有表格列值渲染具名插槽 --> 23 <!-- 如果有表格列值渲染具名插槽 -->