Ant-design: Form ์ปดํฌ๋„ŒํŠธ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ ํ•จ์ˆ˜์—์„œ ํ•ญ์ƒ `callback()`์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 03์›” 03์ผ  ยท  38์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ant-design/ant-design

Form๊ณผ ๊ฐ™์€ ์ผ๋ จ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ์„ค๋ช…

์–‘์‹์˜ ๊ฐ ํ•„๋“œ๋Š” ์ œ์ถœ ์ „์— ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ validateFieldsAndScroll . ๊ทธ๋Ÿฌ๋‚˜ ๋ฐœ๊ฒฌ์€ ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋””๋ฒ„๊น… ํ›„ ์ง€์ •๋œ ํ•„๋“œ ์„ธํŠธ๊ฐ€ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋ฉด ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ํ•„๋“œ ์„ธํŠธ์— ๋ณด์กฐ ๊ฒ€์ฆ์„ ์œ„ํ•œ ๊ฒ€์ฆ ๊ทœ์น™์—์„œ validator ์˜ ์‚ฌ์šฉ์„ ์ง€์ •ํ•˜๋Š” ํ•ญ๋ชฉ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ํ•œ ์ „์ฒด validateFields ๋ฐฉ๋ฒ•์€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ, ์ฒ˜์Œ์— ํ•ด๋‹น validator ์ฝœ๋ฐฑ์—์„œ ํ•ญ์ƒ callback() ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ์“ฐ์ง€ ์•Š๊ณ  ๋‹จ์ผ ์ž…๋ ฅ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๊ฒ€์‚ฌ). ์ถ”๊ฐ€ํ•˜๊ณ  ๋‚˜๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

ํ˜ผ๋ž€์‹œํ‚ค๋‹ค

์‹ค๋ก€ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„๊ทธ์ธ๊ฐ€์š”? ์ด ๋ฌธ์„œ์—์„œ ์ง€์ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— validator ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค callback() .
callback ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์„œ์—์„œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ƒ๊ธฐ์‹œํ‚ค๊ฑฐ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ

handleSubmit = (e) => {
        e.preventDefault()

        const { onSubmit } = this.props
        const { validateFieldsAndScroll, getFieldsValue, resetFields } = this.props.form

        validateFieldsAndScroll((err, values) => {
              if (!err) {
                  onSubmit(getFieldsValue())
              }
        })
}
handleConfirmPassword = (rule, value, callback) => {
        const { getFieldValue } = this.props.form
        if (value && value !== getFieldValue('newPassword')) {
            callback('ไธคๆฌก่พ“ๅ…ฅไธไธ€่‡ด๏ผ')
        }

        // Note: ๅฟ…้กปๆ€ปๆ˜ฏ่ฟ”ๅ›žไธ€ไธช callback๏ผŒๅฆๅˆ™ validateFieldsAndScroll ๆ— ๆณ•ๅ“ๅบ”
        callback()
 }

render()

<FormItem
    {...formItemLayout}
    label="็กฎ่ฎคๅฏ†็ "
>
{
    getFieldDecorator('confirmPassword', {
           rules: [{
                  required: true,
                  message: '่ฏทๅ†ๆฌก่พ“ๅ…ฅไปฅ็กฎ่ฎคๆ–ฐๅฏ†็ ',
            }, {
                  validator: this.handleConfirmPassword
            }],
    })(<Input type="password" />)
}
</FormItem>

ํ™˜๊ฒฝ

  • ๊ฐœ๋ฏธ ๋ฒ„์ „: ์ตœ์‹ 
  • OS ๋ฐ ํ•ด๋‹น ๋ฒ„์ „: OS X
  • ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋ฒ„์ „: ์ตœ์‹  ํฌ๋กฌ
Usage โ“FAQ ๐Ÿ™…๐Ÿปโ€โ™€๏ธ WON'T RESOLVE

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ๋ถˆํ‰ํ–ˆ๋‹ค https://www.zhihu.com/question/33629737/answer/150154145

์šฐ๋ฆฌ์˜ ์˜คํ”ˆ ์†Œ์Šค ์›์น™ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฌผ๊ณผ ํ™์„ ๋ฎ๋Š” ๊ฒƒ์ด๋ผ๋Š” ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  38 ๋Œ“๊ธ€

์„ค๊ณ„: https://github.com/yiminghe/async-validator/

BTW, callback ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ฆฌ์ง€ ์•Š์œผ๋ฉด async-validator๊ฐ€ ๋น„๋™๊ธฐ ํ”„๋กœ์‹œ์ €๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์Œ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ถˆํ‰ํ–ˆ๋‹ค https://www.zhihu.com/question/33629737/answer/150154145

์šฐ๋ฆฌ์˜ ์˜คํ”ˆ ์†Œ์Šค ์›์น™ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฌผ๊ณผ ํ™์„ ๋ฎ๋Š” ๊ฒƒ์ด๋ผ๋Š” ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด ์‚ฌ์šฉ๋ฒ•์€ ์ˆ˜์—…์—์„œ๋งŒ ์“ธ ์ˆ˜ ์žˆ๋‚˜์š”?
์ˆœ์ „ํžˆ ๊ธฐ๋Šฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ React Component๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด API ๋””์ž์ธ์€ ์ •๋ง ์ดŒ์Šค๋Ÿฝ๋„ค์š”.. ํŠน์ • ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์„ ํƒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.

rules: [
            {
              message: 'You need to agree to our terms to sign up.',
              validator: (rule, value, cb) => (value === true ? cb() : cb(true)),
            },
          ],

๊ทธ๋ฆฌ๊ณ  ์ฝœ๋ฐฑ์—๊ฒŒ ์ฃผ์–ด์ง„ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š”์— ์ค‘๋ณต ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค message ๊ฐ€ ๊ธด ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ( message ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค, ๊ทธ๊ฒƒ์ด ์ ์šฉ๋˜์–ด์•ผํ•œ๋‹ค message ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€).

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ์‚ฌ์šฉ๋ฒ•์€ true ๋˜๋Š” false ๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์˜ณ๊ณ  ๊ทธ๋ฆ„์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

rules: [
            {
              message: 'You need to agree to our terms to sign up.',
              validator: (rule, value, cb) => value === true,
            },
          ],

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด API๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฆ‰, https://github.com/yiminghe/async-validator/ ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ANT๋Š” ์—ฌ๊ธฐ์—์„œ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ˜ธ์ถœ ์‹œ ์บก์Šํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@neekey ๋Š” async-validator์— ํ˜ธํ™˜๋˜๋Š” PR์„ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@nekey ์ด ์ด์ƒํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๋น„๋™๊ธฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์ง€์› ๋ฐ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ๋ฐ˜ํ™˜

๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

<Row>
                <Col span={24} key={"method"}>
                    <FormItem {...formItemMethodLayout} label="่ฏทๆฑ‚ๆ–นๆณ•">
                        {getFieldDecorator("method", {
                            initialValue: this.state.data.method,
                            validateTrigger: "onChange",
                            rules: [{
                                required: true,
                                message: `่ฏท้€‰ๆ‹ฉ่ฏทๆฑ‚ๆ–นๆณ•`
                            }, {
                                //validator: this.state.checkUnique ? this.checkConfirmMethod.bind(this) : (rule, value, callback) => {callback();},
                                validator: (่ฟ™ๅฆ‚ไฝ•ๅˆคๆ–ญๅฝ“ๅ‰็ป„ไปถๆ˜ฏๅฆๅผ€ๅง‹ๆ ก้ชŒไบ†) ๏ผŸ
 this.checkConfirmMethod.bind(this) : (ๅฆ‚ๆžœไธๆ˜ฏๅฝ“ๅ‰็ป„ไปถๅผ€ๅง‹ๆ ก้ชŒ๏ผŒๅฐฑ่ฐƒ็”จๅ…ถไป–ๅ‡ฝๆ•ฐ),
                            }]
                        })(
                            <Select placeholder={"่ฏท้€‰ๆ‹ฉ่ฏทๆฑ‚ๆ–นๆณ•"} onChange={::this.handleChange.bind(this)}>
                                {this.state.apiRequestMethodSelect}
                            </Select>
                        )}
                    </FormItem>
                </Col>
            </Row

๊ธฐ๋Šฅ๊ฒ€์ฆ ๋งŒ๋‚ ๋•Œ๋งˆ๋‹ค ํ•œ๋ฒˆ์”ฉ ๋ณด๋Ÿฌ ์™€์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค..๊ธฐ์–ตํ•˜๊ธฐ ์ •๋ง ํž˜๋“œ๋„ค์š”

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ ๊ธฐ๋Šฅ

startNumValidator = (rule, value, callback) => {
    const { exportDataCount } = this.props;
    const reg = /^[1-9][0-9]*$/;
    let errors = [];
    if (!reg.test(value) || value > exportDataCount) {
      errors.push(new Error('illegal value'));
    }
    callback(errors);
  }

ํ†ตํ•ฉ ์ฝœ๋ฐฑ ์˜ค๋ฅ˜ ์•„๋‹Œ๊ฐ€์š”? ์ƒ๋‹นํžˆ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.
antd์˜ ์ƒˆ ๋ฒ„์ „์ด ๋น„๋™๊ธฐ์‹๊ณผ ๋™๊ธฐ์‹ ๊ฒ€์ฆ์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. validator(๋™๊ธฐ์‹) asyncValidator(๋น„๋™๊ธฐ์‹)

์š”์ฒญ ํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฐ˜ํ™˜๋œ ์ฝœ๋ฐฑ์—์„œ ์ด ๋ฉ”์‹œ์ง€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ทœ์น™์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
validateFunc = (๊ทœ์น™, ๊ฐ’, ์ฝœ๋ฐฑ) => {
์‚ฌ์‹ค์ด๋ฉด) {
console.log(11);
callback('์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€');
๋ฐ˜ํ’ˆ;
}
์ฝœ๋ฐฑ();
};
ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— ํ™•์ธ ๊ฒฐ๊ณผ 'Error message'๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€๋ฐ ์ฝœ๋ฐฑ ์‹คํ–‰ ํ›„ ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— 'Error message'๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ์ด์œ ๋Š”?

ๅœจๅฏนๅบ”็š„FormItem็ป„ไปถไธ‹ๆ˜พ็คบ ์˜ ๋…ผ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๊นŒ?

@neekey ๋Š” async-validator์— ํ˜ธํ™˜๋˜๋Š” PR์„ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์„ ์–ธ๊ธ‰ํ–ˆ๋‹ค๊ณ  yminghe๊ฐ€ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค .

ๅœจๅฏนๅบ”็š„FormItem็ป„ไปถไธ‹ๆ˜พ็คบ ์˜ ๋…ผ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๊นŒ?

์ปค์Šคํ…€ ๊ฒ€์ฆ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜์—ฌ onFieldsChange()์—์„œ ํŒ๋‹จํ–ˆ๋Š”๋ฐ, ์ปค์Šคํ…€ ๋ฃฐ์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ์ง์ ‘ ๋ณ€๊ฒฝ๋˜๊ณ , ์ปจํŠธ๋กค์— ์—๋Ÿฌ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
onFieldsChange(props, changedFields) { const { dispatch, detail } = props; const finalChangedFields = { ...changedFields }; // ๆ ก้ชŒๆ—ถ้—ดๅคงๅฐๆ˜ฏๅฆ็ฌฆๅˆ่ง„ๅˆ™ if ( _.has(changedFields, 'currentDate') && detail?.targetDate && compareCurrentTimeEarlierThanTargetTime( finalChangedFields.currentDate, detail?.targetDate ) ) { finalChangedFields.currentDate.errors = [ { message: 'current Date should be latter than target Date', field: 'currentDate', }, ]; } dispatch({ type: 'controllerModel/saveDetail', payload: { changedFields: finalChangedFields, data: detail, }, }); }

ํ™•์ธ์„ ํ†ต๊ณผํ•œ ํ›„ ๋‹ค์Œ ๋ฉ”์‹œ์ง€๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์งˆ๋ฌธํ•˜์‹ญ์‹œ์˜ค. ์ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@neekey
์ฝœ๋ฐฑ ๊ธฐ๋Šฅ์„

<Form>
          <Form.Item ...>
            {getFieldDecorator('name', {validator: (rule, value, callback) => setTimeout(callback(), 1000)})(
                <Input placeholder="name" />
            )}
          </Form.Item>
....

setTimeout์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ „์ฒด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋งˆ์šดํŠธ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ฝœ๋ฐฑ์ด ์‹œ์ž‘๋˜๊ณ 

๊ตฌ์„ฑ ์š”์†Œ๋Š” setState ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๊ณ : ๋งˆ์šดํŠธ๋˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ React ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ˆ˜์ •ํ•˜๋ ค๋ฉด componentWillUnmount ๋ฉ”์„œ๋“œ์—์„œ ๋ชจ๋“  ๊ตฌ๋… ๋ฐ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ทจ์†Œํ•˜์„ธ์š”.

์Šฌํ”„๊ฒŒ๋„ ์ฝœ๋ฐฑ์€ ์ทจ์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค! ์ด ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•  ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค!

@jiufengdadi
์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ์†”๋ฃจ์…˜์€ undefined ์„ callback ์ž…๋‹ˆ๋‹ค. callback ์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ด๋ฉด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜๋ฏ€๋กœ undefined ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

callback ์ •์˜: L146

๋‚ด ์‚ฌ์šฉ์ž ์ง€์ • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ํ†ต๊ณผ๋œ ํ›„ async-validator: [""]๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‘ ๊ฐœ์˜ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ๊ฒ€์‚ฌ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
```
๊ทœ์น™: [
{
ํ•„์ˆ˜: ์‚ฌ์‹ค,
๋ฉ”์‹œ์ง€: '์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”',
},
{
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ: (๊ทœ์น™, ๊ฐ’, ์ฝœ๋ฐฑ) => {
๋…ธ๋ ฅํ•˜๋‹ค {
if (this.props.form.getFieldValue('์ ‘๋‘์‚ฌ') == 86 && ๊ฐ’) {
์ƒ์ˆ˜ ๋“ฑ๋ก = /^1d{10}$/;
if (!reg.test(๊ฐ’)) {
throw new Error('๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค!');
}
}
} ์žก๊ธฐ(์˜ค๋ฅ˜) {
์ฝœ๋ฐฑ(์˜ค๋ฅ˜);
}
},
๋ฉ”์‹œ์ง€: '์œ ํšจํ•œ ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”',
},
],

 rules: [
                {
                  required: true,
                  message: '่ฏท่พ“ๅ…ฅๆ‰‹ๆœบๅท',
                },
                {
                  validator: (rule, value, callback) => {
                    try {
                      if (this.props.form.getFieldValue('prefix') == 86 && value) {
                        const reg = /^1\d{10}$/;
                        if (!reg.test(value)) {
                          throw new Error('Something wrong!');
                        }
                      }
                    } catch (err) {
                      callback(err);
                       return // +
                    }
                     callback() // +
                  },
                  message: '่ฏท่พ“ๅ…ฅๆœ‰ๆ•ˆๆ‰‹ๆœบๅท',
                },
              ],

๊ทœ์น™์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
validateFunc = (๊ทœ์น™, ๊ฐ’, ์ฝœ๋ฐฑ) => {
์‚ฌ์‹ค์ด๋ฉด) {
console.log(11);
callback('์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€');
๋ฐ˜ํ’ˆ;
}
์ฝœ๋ฐฑ();
};
ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— ํ™•์ธ ๊ฒฐ๊ณผ 'Error message'๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€๋ฐ ์ฝœ๋ฐฑ ์‹คํ–‰ ํ›„ ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— 'Error message'๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ์ด์œ ๋Š”?

๊ทœ์น™์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
validateFunc = (๊ทœ์น™, ๊ฐ’, ์ฝœ๋ฐฑ) => {
์‚ฌ์‹ค์ด๋ฉด) {
console.log(11);
callback('์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€');
๋ฐ˜ํ’ˆ;
}
์ฝœ๋ฐฑ();
};
ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— ํ™•์ธ ๊ฒฐ๊ณผ 'Error message'๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€๋ฐ ์ฝœ๋ฐฑ ์‹คํ–‰ ํ›„ ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— 'Error message'๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ์ด์œ ๋Š”?

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๊นŒ, ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค

 rules: [
                {
                  required: true,
                  message: '่ฏท่พ“ๅ…ฅๆ‰‹ๆœบๅท',
                },
                {
                  validator: (rule, value, callback) => {
                    try {
                      if (this.props.form.getFieldValue('prefix') == 86 && value) {
                        const reg = /^1\d{10}$/;
                        if (!reg.test(value)) {
                          throw new Error('Something wrong!');
                        }
                      }
                    } catch (err) {
                      callback(err);
                       return // +
                    }
                     callback() // +
                  },
                  message: '่ฏท่พ“ๅ…ฅๆœ‰ๆ•ˆๆ‰‹ๆœบๅท',
                },
              ],

๋ฉ”์‹œ์ง€ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๊นŒ? ์ด์™€ ์œ ์‚ฌํ•œ 'ํœด๋Œ€์ „ํ™” ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค. ์œ ํšจํ•œ ํœด๋Œ€์ „ํ™” ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.'

 rules: [
                {
                  required: true,
                  message: '่ฏท่พ“ๅ…ฅๆ‰‹ๆœบๅท',
                },
                {
                  validator: (rule, value, callback) => {
                    try {
                      if (this.props.form.getFieldValue('prefix') == 86 && value) {
                        const reg = /^1\d{10}$/;
                        if (!reg.test(value)) {
                          throw new Error('Something wrong!');
                        }
                      }
                    } catch (err) {
                      callback(err);
                       return // +
                    }
                     callback() // +
                  },
                  message: '่ฏท่พ“ๅ…ฅๆœ‰ๆ•ˆๆ‰‹ๆœบๅท',
                },
              ],

๋ฉ”์‹œ์ง€ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๊นŒ? ์ด์™€ ์œ ์‚ฌํ•œ 'ํœด๋Œ€์ „ํ™” ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค. ์œ ํšจํ•œ ํœด๋Œ€์ „ํ™” ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.'

ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค

image

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์‹ญ์‹œ์˜ค
image

๋นจ๊ฐ„์ƒ‰ ์ฒดํฌ๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ? ? ์‚ฌ์–‘์„ ์ถฉ์กฑํ•˜๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ƒํ˜ธ ์˜ํ–ฅ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ? ?

๊ทœ์น™์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ์˜ ์ฝœ๋ฐฑ์€ ์„ฑ๊ณต ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋ฉฐ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทœ์น™์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
validateFunc = (๊ทœ์น™, ๊ฐ’, ์ฝœ๋ฐฑ) => {
์‚ฌ์‹ค์ด๋ฉด) {
console.log(11);
callback('์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€');
๋ฐ˜ํ’ˆ;
}
์ฝœ๋ฐฑ();
};
ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— ํ™•์ธ ๊ฒฐ๊ณผ 'Error message'๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€๋ฐ ์ฝœ๋ฐฑ ์‹คํ–‰ ํ›„ ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— 'Error message'๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ์ด์œ ๋Š”?

๊ทœ์น™์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
validateFunc = (๊ทœ์น™, ๊ฐ’, ์ฝœ๋ฐฑ) => {
์‚ฌ์‹ค์ด๋ฉด) {
console.log(11);
callback('์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€');
๋ฐ˜ํ’ˆ;
}
์ฝœ๋ฐฑ();
};
ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— ํ™•์ธ ๊ฒฐ๊ณผ 'Error message'๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€๋ฐ ์ฝœ๋ฐฑ ์‹คํ–‰ ํ›„ ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— 'Error message'๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ์ด์œ ๋Š”?

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๊นŒ, ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค

์ €๋„ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.์ดˆ๊ธฐ๊ฐ’์ด ๋น„์–ด์žˆ์œผ๋ฉด ์ •์ƒ ์ž…๋ ฅ ํ›„ onblur ์‹œ๊ฐ„์„ ํ†ตํ•ด ์ปค์Šคํ…€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ‘œ์‹œ๋˜์ง€๋งŒ ์ดˆ๊ธฐ ์ดˆ๊ธฐ๊ฐ’์— ๊ฐ’์ด ์žˆ์„ ๋•Œ validatefields๋Š” ๋ชจ๋“  ์–‘์‹ ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ†ตํ•ฉ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  err์€ null๋กœ ์ถœ๋ ฅ๋˜๋ฉฐ ์ž ์‹œ ํ›„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์‹คํŒจ๊ฐ€ ์ฝ˜์†”์— ๋‹ค์‹œ ํŒ์—…๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋ฐ˜ํ™˜์„ ์‚ญ์ œํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค; ๊ธฐ๋Šฅ์—์„œ ๋‹ค์‹œ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

------------------ ์›๋ณธ ๋ฉ”์‹œ์ง€ ------------------
๋ณด๋‚ธ ์‚ฌ๋žŒ: "Ivan-hl"< [email protected]>;
๋ฐฐ์†ก ์‹œ๊ฐ„: 2019๋…„ 11์›” 20์ผ(์ˆ˜์š”์ผ) ์˜คํ›„ 5์‹œ 19๋ถ„
๋ฐ›๋Š” ์‚ฌ๋žŒ: "ant-design/ant-design"< [email protected]>;
์ฐธ์กฐ: "์ฃผ"< [email protected]>, "์ˆ˜๋™"< [email protected]>;
์ œ๋ชฉ: Re: [ant-design/ant-design] Form ์ปดํฌ๋„ŒํŠธ์˜ validator ํ•จ์ˆ˜์— ํ•ญ์ƒ callback() ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?ํผ ๊ทœ์น™์—์„œ validator๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฉ”์„œ๋“œ ๋ณธ๋ฌธ์ด ํ•ญ์ƒ callback()์„ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ์ด์œ  ๊ฒ€์ฆ?(#5155)

๊ทœ์น™์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
validateFunc = (๊ทœ์น™, ๊ฐ’, ์ฝœ๋ฐฑ) => {
์‚ฌ์‹ค์ด๋ฉด) {
console.log(11);
callback('์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€');
๋ฐ˜ํ’ˆ;
}
์ฝœ๋ฐฑ();
};
ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— ํ™•์ธ ๊ฒฐ๊ณผ 'Error message'๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€๋ฐ ์ฝœ๋ฐฑ ์‹คํ–‰ ํ›„ ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— 'Error message'๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ์ด์œ ๋Š”?

๊ทœ์น™์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
validateFunc = (๊ทœ์น™, ๊ฐ’, ์ฝœ๋ฐฑ) => {
์‚ฌ์‹ค์ด๋ฉด) {
console.log(11);
callback('์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€');
๋ฐ˜ํ’ˆ;
}
์ฝœ๋ฐฑ();
};
ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— ํ™•์ธ ๊ฒฐ๊ณผ 'Error message'๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€๋ฐ ์ฝœ๋ฐฑ ์‹คํ–‰ ํ›„ ํ•ด๋‹น FormItem ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜์— 'Error message'๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ์ด์œ ๋Š”?

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๊นŒ, ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค

์ €๋„ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.์ดˆ๊ธฐ๊ฐ’์ด ๋น„์–ด์žˆ์œผ๋ฉด ์ •์ƒ ์ž…๋ ฅ ํ›„ onblur ์‹œ๊ฐ„์„ ํ†ตํ•ด ์ปค์Šคํ…€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ‘œ์‹œ๋˜์ง€๋งŒ ์ดˆ๊ธฐ ์ดˆ๊ธฐ๊ฐ’์— ๊ฐ’์ด ์žˆ์„ ๋•Œ validatefields๋Š” ๋ชจ๋“  ์–‘์‹ ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ†ตํ•ฉ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  err์€ null๋กœ ์ถœ๋ ฅ๋˜๋ฉฐ ์ž ์‹œ ํ›„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์‹คํŒจ๊ฐ€ ์ฝ˜์†”์— ๋‹ค์‹œ ํŒ์—…๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ๊ตฌ๋…์„ ์ทจ์†Œํ•˜์„ธ์š”.

๋„ˆ๋ฌด ๋‚˜์จ

ํ™•์ธ ๊ธฐ๋Šฅ์— ์˜ˆ์™ธ๊ฐ€ ์žˆ์œผ๋ฉด ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์˜ค๋žซ๋™์•ˆ ๊ตฌ๋ฉ์ด์— ๋น ์กŒ์Šต๋‹ˆ๋‹ค. . .

์ด AntdV๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@kongling94 ?

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ๋” ์ด์ƒ ํ…์ŠคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ?

<a-input id="code" placeholder="่ฏท่พ“ๅ…ฅ็”จๆˆทID"v-decorator="[ 'code', {rules: [{ required: true, message: '่ฏท่พ“ๅ…ฅ็”จๆˆทID' }, { validator: handleUsername }], validateTrigger: 'change'} ]" > </a-input>
handleUsername(rule, value, callback) { value = value.trim() if (value.length == 0) { this.username = ''; callback(); } else { fetchUsername({ code: value }) .then((rest) => { if (rest.code == 200) { this.username = rest.data; //callback(); } else { this.username = ''; callback(new Error(rest.msg)) return; } }).finally(() => { callback() }) } },
<a-form :label-col="labelCol" :wrapper-col="wrapperCol" :form="form" @submit="handleSubmit"> <a-button type="primary" htmlType="submit">็กฎๅฎš</a-button> </a-form>
์‘๋‹ต๊ณผ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ํด๋ฆญํ•˜๊ณ  ์ฝ˜์†”์— async-validator:["code is required"]๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
validateFields๋ฅผ ์ „ํ˜€ ์ž…๋ ฅํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ์™€ validateTrigger๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ™•์ธ์„ ํด๋ฆญํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

<a-input id="code" placeholder="่ฏท่พ“ๅ…ฅ็”จๆˆทID"v-decorator="[ 'code', {rules: [{ required: true, message: '่ฏท่พ“ๅ…ฅ็”จๆˆทID' }, { validator: handleUsername }], validateTrigger: 'change'} ]" > </a-input>
handleUsername(rule, value, callback) { value = value.trim() if (value.length == 0) { this.username = ''; callback(); } else { fetchUsername({ code: value }) .then((rest) => { if (rest.code == 200) { this.username = rest.data; //callback(); } else { this.username = ''; callback(new Error(rest.msg)) return; } }).finally(() => { callback() }) } },
<a-form :label-col="labelCol" :wrapper-col="wrapperCol" :form="form" @submit="handleSubmit"> <a-button type="primary" htmlType="submit">็กฎๅฎš</a-button> </a-form>
์‘๋‹ต๊ณผ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ํด๋ฆญํ•˜๊ณ  ์ฝ˜์†”์— async-validator:["code is required"]๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
validateFields๋ฅผ ์ „ํ˜€ ์ž…๋ ฅํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ์™€ validateTrigger๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ™•์ธ์„ ํด๋ฆญํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์…จ์Šต๋‹ˆ๊นŒ?๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

<a-input id="code" placeholder="่ฏท่พ“ๅ…ฅ็”จๆˆทID"v-decorator="[ 'code', {rules: [{ required: true, message: '่ฏท่พ“ๅ…ฅ็”จๆˆทID' }, { validator: handleUsername }], validateTrigger: 'change'} ]" > </a-input>
handleUsername(rule, value, callback) { value = value.trim() if (value.length == 0) { this.username = ''; callback(); } else { fetchUsername({ code: value }) .then((rest) => { if (rest.code == 200) { this.username = rest.data; //callback(); } else { this.username = ''; callback(new Error(rest.msg)) return; } }).finally(() => { callback() }) } },
<a-form :label-col="labelCol" :wrapper-col="wrapperCol" :form="form" @submit="handleSubmit"> <a-button type="primary" htmlType="submit">็กฎๅฎš</a-button> </a-form>
์‘๋‹ต๊ณผ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ํด๋ฆญํ•˜๊ณ  ์ฝ˜์†”์— async-validator:["code is required"]๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
validateFields๋ฅผ ์ „ํ˜€ ์ž…๋ ฅํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ์™€ validateTrigger๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ™•์ธ์„ ํด๋ฆญํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์…จ์Šต๋‹ˆ๊นŒ?๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

// ่‡ชๅฎšไน‰ๅฏ†็ ๆ ก้ชŒ
  handleConfirmPassword = (rule, value, callback) => {
    const { getFieldValue } = this.props.form;
    if (value && value !== getFieldValue('newPwd')) {
      callback('ไธคๆฌก่พ“ๅ…ฅไธไธ€่‡ด๏ผ');
    }

    // Note: ๅฟ…้กปๆ€ปๆ˜ฏ่ฟ”ๅ›žไธ€ไธช callback๏ผŒๅฆๅˆ™ validateFieldsAndScroll ๆ— ๆณ•ๅ“ๅบ”
    callback();
  };
ๆˆ‘ๆ˜ฏ่ฟ™ไนˆ่งฃๅ†ณ็š„

validatorFun(๊ทœ์น™, ๊ฐ’, ์ฝœ๋ฐฑ) {
const psw = this.form.getFieldValue('newPwd')
if (๊ฐ’ && ๊ฐ’ !== psw) {
rule.message = 'ไธคๆฌกๅฏ†็ ไธไธ€่‡ด'
์ฝœ๋ฐฑ(๊ทœ์น™)
}
์ฝœ๋ฐฑ()
}

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰