Skip to content

Commit 7bf2e1b

Browse files
authored
feat: Field support messageVariables (#80)
* support messageVariables * add test case
1 parent ee6b749 commit 7bf2e1b

File tree

4 files changed

+49
-11
lines changed

4 files changed

+49
-11
lines changed

examples/validate-perf.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { ValidateMessages } from '../src/interface';
88

99
const myMessages: ValidateMessages = {
1010
default: '${name} 看起来怪怪的……',
11-
required: '你需要一个 ${name}',
11+
required: '你需要一个 ${displayName}',
1212
types: {
1313
number: '嗨,这个 ${name} 不是一个合格的 ${type}',
1414
},
@@ -46,13 +46,18 @@ export default class Demo extends React.Component {
4646
validateMessages={myMessages}
4747
initialValues={{ remember: true }}
4848
>
49-
<LabelField name="password" rules={[{ required: true }]}>
49+
<LabelField
50+
name="password"
51+
messageVariables={{ displayName: '密码' }}
52+
rules={[{ required: true }]}
53+
>
5054
<Input placeholder="password" />
5155
</LabelField>
5256

5357
<LabelField
5458
name="password2"
5559
dependencies={['password']}
60+
messageVariables={{ displayName: '密码2' }}
5661
rules={[
5762
{ required: true },
5863
({ getFieldValue }) => ({
@@ -71,6 +76,7 @@ export default class Demo extends React.Component {
7176
<LabelField
7277
name="field"
7378
label="Full of rules"
79+
messageVariables={{ displayName: '字段' }}
7480
rules={[
7581
{ required: true },
7682
{ required: true, message: <h1>我是 ReactNode</h1> },

src/Field.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ export interface FieldProps {
6868
validateTrigger?: string | string[] | false;
6969
validateFirst?: boolean;
7070
valuePropName?: string;
71+
messageVariables?: Record<string, string>;
7172
onReset?: () => void;
7273
}
7374

@@ -268,7 +269,7 @@ class Field extends React.Component<FieldProps, FieldState> implements FieldEnti
268269
};
269270

270271
public validateRules = (options?: ValidateOptions) => {
271-
const { validateFirst } = this.props;
272+
const { validateFirst = false, messageVariables } = this.props;
272273
const { triggerName } = (options || {}) as ValidateOptions;
273274
const namePath = this.getNamePath();
274275

@@ -284,7 +285,14 @@ class Field extends React.Component<FieldProps, FieldState> implements FieldEnti
284285
});
285286
}
286287

287-
const promise = validateRules(namePath, this.getValue(), filteredRules, options, validateFirst);
288+
const promise = validateRules(
289+
namePath,
290+
this.getValue(),
291+
filteredRules,
292+
options,
293+
validateFirst,
294+
messageVariables,
295+
);
288296
this.validatePromise = promise;
289297
this.errors = [];
290298

src/utils/validateUtil.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ function convertMessages(
3333
messages: ValidateMessages,
3434
name: string,
3535
rule: RuleObject,
36+
messageVariables?: Record<string, string>,
3637
): ValidateMessages {
3738
const kv = {
3839
...(rule as Record<string, string | number>),
@@ -48,7 +49,7 @@ function convertMessages(
4849
Object.keys(source).forEach(ruleName => {
4950
const value = source[ruleName];
5051
if (typeof value === 'string') {
51-
target[ruleName] = replaceFunc(value);
52+
target[ruleName] = replaceFunc(value, messageVariables);
5253
} else if (value && typeof value === 'object') {
5354
target[ruleName] = {};
5455
fillTemplate(value, target[ruleName]);
@@ -69,6 +70,7 @@ async function validateRule(
6970
value: StoreValue,
7071
rule: RuleObject,
7172
options: ValidateOptions,
73+
messageVariables?: Record<string, string>,
7274
): Promise<string[]> {
7375
const cloneRule = { ...rule };
7476
// We should special handle array validate
@@ -82,7 +84,12 @@ async function validateRule(
8284
[name]: [cloneRule],
8385
});
8486

85-
const messages: ValidateMessages = convertMessages(options.validateMessages, name, cloneRule);
87+
const messages: ValidateMessages = convertMessages(
88+
options.validateMessages,
89+
name,
90+
cloneRule,
91+
messageVariables,
92+
);
8693
validator.messages(messages);
8794

8895
let result = [];
@@ -106,7 +113,7 @@ async function validateRule(
106113
if (!result.length && subRuleField) {
107114
const subResults: string[][] = await Promise.all(
108115
(value as StoreValue[]).map((subValue: StoreValue, i: number) =>
109-
validateRule(`${name}.${i}`, subValue, subRuleField, options),
116+
validateRule(`${name}.${i}`, subValue, subRuleField, options, messageVariables),
110117
),
111118
);
112119

@@ -125,7 +132,8 @@ export function validateRules(
125132
value: StoreValue,
126133
rules: RuleObject[],
127134
options: ValidateOptions,
128-
validateFirst?: boolean,
135+
validateFirst: boolean,
136+
messageVariables?: Record<string, string>,
129137
) {
130138
const name = namePath.join('.');
131139

@@ -180,7 +188,9 @@ export function validateRules(
180188
};
181189
});
182190

183-
const rulePromises = filledRules.map(rule => validateRule(name, value, rule, options));
191+
const rulePromises = filledRules.map(rule =>
192+
validateRule(name, value, rule, options, messageVariables),
193+
);
184194

185195
const summaryPromise: Promise<string[]> = (validateFirst
186196
? finishOnFirstFailed(rulePromises)

tests/validate.test.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ describe('Form.Validate', () => {
4545
});
4646

4747
describe('validateMessages', () => {
48-
function renderForm(messages) {
48+
function renderForm(messages, fieldProps = {}) {
4949
return mount(
5050
<Form validateMessages={messages}>
51-
<InfoField name="username" rules={[{ required: true }]} />
51+
<InfoField name="username" rules={[{ required: true }]} {...fieldProps} />
5252
</Form>,
5353
);
5454
}
@@ -66,6 +66,20 @@ describe('Form.Validate', () => {
6666
await changeValue(wrapper, '');
6767
matchError(wrapper, 'Bamboo & Light');
6868
});
69+
70+
it('messageVariables', async () => {
71+
const wrapper = renderForm(
72+
{ required: "You miss '${label}'!" },
73+
{
74+
messageVariables: {
75+
label: 'Light&Bamboo',
76+
},
77+
},
78+
);
79+
80+
await changeValue(wrapper, '');
81+
matchError(wrapper, "You miss 'Light&Bamboo'!");
82+
});
6983
});
7084

7185
describe('customize validator', () => {

0 commit comments

Comments
 (0)