Skip to content

Commit 24dfd84

Browse files
sunshineLixunsendya
authored andcommitted
refactor: Select Text Password
1 parent a919651 commit 24dfd84

File tree

5 files changed

+62
-39
lines changed

5 files changed

+62
-39
lines changed

packages/pro-field/src/components/Password/index.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,33 @@ const FieldPassword = defineComponent({
1010
slots: ['render', 'renderFormItem'],
1111
setup(props, { slots }) {
1212
return () => {
13+
const { mode, text, fieldProps } = props;
1314
const render = props.render ?? slots.render;
1415
const renderFormItem = props.renderFormItem ?? slots?.renderFormItem;
1516

1617
const visible = ref(props.visible);
1718

18-
if (props.mode === 'read') {
19+
if (mode === 'read') {
1920
let dom = <>-</>;
20-
if (props.text) {
21+
if (text) {
2122
dom = (
2223
<Space>
23-
<span>{visible.value ? props.text : '* * * * *'}</span>
24+
<span>{visible.value ? text : '* * * * *'}</span>
2425
<a onClick={() => (visible.value = !visible.value)}>
2526
{visible.value ? <EyeOutlined /> : <EyeInvisibleOutlined />}
2627
</a>
2728
</Space>
2829
);
2930
}
3031
if (render) {
31-
return render(props.text, { mode: props.mode, fieldProps: props.fieldProps }, dom);
32+
return render(text, { mode, fieldProps }, dom);
3233
}
3334
return dom;
3435
}
35-
if (props.mode === 'edit' || props.mode === 'update') {
36+
if (mode === 'edit' || mode === 'update') {
3637
const renderDom = <InputPassword allowClear {...props.fieldProps} />;
3738
if (renderFormItem) {
38-
return renderFormItem(props.text, { mode: props.mode, ...props.fieldProps }, renderDom);
39+
return renderFormItem(text, { mode, fieldProps }, renderDom);
3940
}
4041
return renderDom;
4142
}

packages/pro-field/src/components/Text/index.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,27 @@ const FieldText = defineComponent({
99
props: textFieldPorps,
1010
slots: ['render', 'renderFormItem'],
1111
setup(props, { slots }) {
12-
const render = props.render ?? slots?.render;
13-
const renderFormItem = props.renderFormItem ?? slots?.renderFormItem;
14-
1512
return () => {
16-
if (props.mode === 'read') {
13+
const { type, mode, text, emptyText, fieldProps } = props;
14+
const render = props.render ?? slots?.render;
15+
const renderFormItem = props.renderFormItem ?? slots?.renderFormItem;
16+
if (mode === 'read') {
1717
const dom = (
1818
<>
19-
{props.fieldProps?.prefix}
20-
{props.text ?? (props.emptyText || '-')}
21-
{props.fieldProps?.suffix}
19+
{fieldProps?.prefix}
20+
{text ?? (emptyText || '-')}
21+
{fieldProps?.suffix}
2222
</>
2323
);
2424
if (render) {
25-
return render(props.text, { mode: props.mode, fieldProps: props.fieldProps }, dom) ?? props.emptyText;
25+
return render(text, { mode, fieldProps }, dom) ?? emptyText;
2626
}
2727
return dom;
2828
}
29-
if (props.mode === 'edit' || props.mode === 'update') {
30-
const renderDom = <Input type={props.type} allowClear {...props.fieldProps} />;
29+
if (mode === 'edit' || mode === 'update') {
30+
const renderDom = <Input type={type} allowClear {...fieldProps} />;
3131
if (renderFormItem) {
32-
return renderFormItem(props.text, { mode: props.mode, fieldProps: props.fieldProps }, renderDom);
32+
return renderFormItem(text, { mode, fieldProps }, renderDom);
3333
}
3434
return renderDom;
3535
}

packages/pro-field/src/index.tsx

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import {
2-
ref,
2+
unref,
33
defineComponent,
44
PropType,
5+
ref,
56
ExtractPropTypes,
67
VNode,
78
type App,
@@ -11,6 +12,7 @@ import {
1112
import { pickProProps, omitUndefined } from '@ant-design-vue/pro-utils';
1213
import { isValidElement } from 'ant-design-vue/es/_util/props-util';
1314
import { cloneVNodes } from 'ant-design-vue/es/_util/vnode';
15+
import { warning } from 'ant-design-vue/es/vc-util/warning';
1416
import { omit } from 'lodash-es';
1517
import type { NameType } from './components/typings';
1618

@@ -105,39 +107,55 @@ const ProField = defineComponent({
105107
inheritAttrs: false,
106108
props: proFieldProps,
107109
setup(props) {
108-
const inputValue = ref((props.formItemProps?.model || {})[props.formItemProps?.name as NameType]);
109-
const formItemProps = omitUndefined(props?.formItemProps || {});
110110
return () => {
111+
const { readonly, mode, text, valueType, formItemProps, fieldProps, renderFormItem } = props;
112+
const formItemName = formItemProps?.name as NameType;
113+
const formModel = formItemProps?.model;
114+
if (!formModel) {
115+
warning(false, 'model is required for validateFields to work.');
116+
return Promise.reject('Form `model` is required for validateFields to work.');
117+
}
118+
const modelValue = formModel[formItemName];
119+
120+
if (!(formItemName in Object.keys(formModel))) {
121+
warning(
122+
false,
123+
`The ${formItemName} attribute was not found in the model of the Form, Please set the name attribute of the form item correctly`
124+
);
125+
}
126+
const inputValue = ref(modelValue);
127+
const omitFormItemProps = omitUndefined(formItemProps || {});
128+
111129
// TODO:待优化
112-
const fieldProps = omitUndefined({
113-
...props?.fieldProps,
114-
value: inputValue.value,
130+
const omitFieldProps = omitUndefined({
131+
...fieldProps,
132+
value: unref(inputValue),
115133
'onUpdate:value'(value: string) {
116134
inputValue.value = value;
117-
props.fieldProps?.['onUpdate:value']?.(value);
135+
fieldProps?.['onUpdate:value']?.(value);
118136
},
119137
});
120138
return (
121139
<>
122140
{defaultRenderText(
123-
props.mode === 'edit' ? fieldProps?.value ?? props.text ?? '' : props.text ?? fieldProps?.value ?? '',
124-
props.valueType || 'text',
141+
mode === 'edit' ? omitFieldProps?.value ?? text ?? '' : text ?? omitFieldProps?.value ?? '',
142+
valueType || 'text',
125143
{
126144
...props,
127-
mode: props.readonly ? 'read' : props.mode,
128-
renderFormItem: props.renderFormItem
145+
mode: readonly ? 'read' : mode,
146+
renderFormItem: renderFormItem
129147
? (...restProps) => {
130-
const newDom = props.renderFormItem?.(...restProps) as VNode | JSX.Element;
148+
const newDom = renderFormItem?.(...restProps) as VNode | JSX.Element;
131149
if (isValidElement(newDom))
132150
return cloneVNodes(newDom, {
133-
...fieldProps,
151+
...omitFieldProps,
134152
...((newDom.props as any) || {}),
135153
});
136154
return newDom;
137155
}
138156
: undefined,
139-
fieldProps: pickProProps(fieldProps || {}),
140-
formItemProps: pickProProps(formItemProps || {}),
157+
fieldProps: pickProProps(omitFieldProps || {}),
158+
formItemProps: pickProProps(omitFormItemProps || {}),
141159
}
142160
)}
143161
</>

packages/pro-form/examples/views/ProForm.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@
8585
required
8686
/>
8787
<pro-form-text
88-
name="name7"
88+
name="name79"
8989
label="应用名称7"
9090
:field-props="{
9191
allowClear: true,
@@ -119,16 +119,16 @@
119119
<pro-form-select
120120
name="girlName"
121121
label="Girl姓名"
122-
:options="girlNameoptions"
123122
:field-props="{
124123
placeholder: '请选择',
125124
mode: 'multiple',
125+
options: girlNameoptions,
126126
}"
127127
required
128128
>
129129
<template #dropdownRender="{ menuNode: menu }">
130130
<v-nodes :vnodes="menu" />
131-
<a-divider style="margin: 4px 0" />
131+
<Divider style="margin: 4px 0" />
132132
<div style="padding: 4px 8px; cursor: pointer" @mousedown="(e) => e.preventDefault()" @click="addItem">
133133
<plus-outlined />
134134
Add item
@@ -141,7 +141,7 @@
141141
<script lang="ts" setup>
142142
import { reactive, ref, FunctionalComponent } from 'vue';
143143
import { PlusOutlined } from '@ant-design/icons-vue';
144-
import { RadioGroup, RadioButton, Switch, type SelectProps } from 'ant-design-vue';
144+
import { RadioGroup, RadioButton, Switch, Divider, type SelectProps } from 'ant-design-vue';
145145
import type { FormLayout } from 'ant-design-vue/es/form/Form';
146146
import { ProForm, ProFormText, ProFormPassword, ProFormSelect } from '@ant-design-vue/pro-form';
147147

packages/pro-form/src/components/Select/index.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defineComponent, type App, DefineComponent, Plugin, PropType, ExtractPropTypes } from 'vue';
1+
import { defineComponent, computed, unref, type App, DefineComponent, Plugin, PropType, ExtractPropTypes } from 'vue';
22
import { searchSelectSlots } from '@ant-design-vue/pro-field';
33
import { getSlot, type VueNode } from '@ant-design-vue/pro-utils';
44
import { pick } from 'lodash-es';
@@ -9,7 +9,7 @@ import { proFormItemProps } from '../FormItem';
99
const props = {
1010
...proFormFieldProps,
1111
fieldProps: {
12-
type: Object as PropType<Omit<SelectProps, 'value' | 'options'>>,
12+
type: Object as PropType<Omit<SelectProps, 'value'>>,
1313
},
1414
options: {
1515
type: Array as PropType<SelectProps['options']>,
@@ -44,13 +44,17 @@ export const ProFormSelect = defineComponent({
4444
const maxTagPlaceholder = getSlot(slots, props, 'maxTagPlaceholder');
4545
const optionLabel = getSlot(slots, props, 'optionLabel');
4646

47+
const options = computed(() => {
48+
return props.options || props.fieldProps?.options;
49+
});
50+
4751
return () => {
4852
return (
4953
<ProFormField
5054
valueType={'select'}
5155
fieldProps={{
5256
...props.fieldProps,
53-
options: props.options,
57+
options: unref(options),
5458
notFoundContent,
5559
suffixIcon,
5660
itemIcon,

0 commit comments

Comments
 (0)