fourteendp
2024-07-04 64a4992a84dadb33614e937f5d7464dcd312a1bd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { h } from 'vue';
import {
  FormItemContentRenderParams,
  VxeFormItemPropTypes,
  VxeGlobalRendererHandles,
  VxeGlobalRendererOptions,
} from 'vxe-table';
import XEUtils from 'xe-utils';
import { cellText, createEvents, createProps, getComponent } from './common';
 
const COMPONENT_NAME = 'AButton';
 
export function createEditRender() {
  return function (
    renderOpts: VxeGlobalRendererHandles.RenderTableEditOptions,
    params: VxeGlobalRendererHandles.RenderTableEditParams,
  ) {
    const { attrs } = renderOpts;
    const Component = getComponent(COMPONENT_NAME);
 
    return [
      h(Component, {
        ...attrs,
        ...createProps(renderOpts, null),
        ...createEvents(renderOpts, params),
      }),
    ];
  };
}
 
export function createDefaultRender() {
  return function (
    renderOpts: VxeGlobalRendererHandles.RenderTableEditOptions,
    params: VxeGlobalRendererHandles.RenderTableEditParams,
  ) {
    const { attrs } = renderOpts;
    const Component = getComponent(COMPONENT_NAME);
 
    return [
      h(
        Component,
        {
          ...attrs,
          ...createProps(renderOpts, null),
          ...createEvents(renderOpts, params),
        },
        cellText(renderOpts.content),
      ),
    ];
  };
}
 
export function createFormItemRender() {
  return function (
    renderOpts: VxeFormItemPropTypes.ItemRender,
    params: FormItemContentRenderParams,
  ) {
    const { attrs, content } = renderOpts;
    const { property, $form, data } = params;
    const props = createProps(renderOpts, null);
    const Component = getComponent(COMPONENT_NAME);
 
    return [
      h(
        Component,
        {
          ...attrs,
          ...props,
          ...createEvents(
            renderOpts,
            params,
            (value: any) => {
              // 处理 model 值双向绑定
              XEUtils.set(data, property, value);
            },
            () => {
              // 处理 change 事件相关逻辑
              $form.updateStatus({
                ...params,
                field: property,
              });
            },
          ),
        },
        {
          default: () => cellText(content || props.content),
        },
      ),
    ];
  };
}
 
function createToolbarButtonRender() {
  return function (
    renderOpts: VxeGlobalRendererHandles.RenderToolOptions,
    params: VxeGlobalRendererHandles.RenderButtonParams,
  ) {
    const { attrs } = renderOpts;
    const { button } = params;
    const props = createProps(renderOpts, null);
    const Component = getComponent(COMPONENT_NAME);
 
    return [
      h(
        Component,
        {
          ...attrs,
          ...props,
          ...createEvents(renderOpts, params),
        },
        {
          default: () => cellText(button?.content || props.content),
        },
      ),
    ];
  };
}
 
export default {
  renderTableEdit: createEditRender(),
  renderTableDefault: createDefaultRender(),
  renderFormItemContent: createFormItemRender(),
  renderToolbarButton: createToolbarButtonRender(),
} as VxeGlobalRendererOptions;