Ant-design: FormItem์ด ๋‚ด๋ถ€์˜ ์ปจํŠธ๋กค ์ž…๋ ฅ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

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

ํ™˜๊ฒฝ

  • antd ๋ฒ„์ „ : 2.7.4
  • OS ๋ฐ ๋ฒ„์ „ : OS X 10.12.3
  • ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋ฒ„์ „ : Chrome 56

๋ญ ํ–ˆ์–ด? ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ์œ„ํ•œ ๋‹จ๊ณ„๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

์–‘์‹ ํ•„๋“œ๋ฅผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ์ž์ฒด ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ

UsernameInput.js

class UsernameInput extends Component {
  render() {
    return this.props.form.getFieldDecorator(this.props.id, {
      rules: [...]
    })(InputComponent);
  }
}

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์šฐ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

// imports here

class CustomForm {
  render() {
    return (<Form>
      <Form.Item>
        <UsernameInput form={this.props.form} />
      </Form.Item>
    </Form>);
  }
}

export default Form.create()(CustomForm);

FormItem.getControls ๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ปจํŠธ๋กค๋กœ ๊ฐ์ง€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ž˜ํผ๋ฅผ UsernameInput์œผ๋กœ ๋ด…๋‹ˆ๋‹ค.

๋ฌด์—‡์„ ๊ธฐ๋Œ€ ํ–ˆ์Šต๋‹ˆ๊นŒ?

FormItem ๋Š” UsernameInput ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋ชจ๋“  ์ž…๋ ฅ ์ปจํŠธ๋กค๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€, ํ”ผ๋“œ๋ฐฑ, ๋„์›€๋ง ๋“ฑ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์Šจ ์ผ์ด์•ผ?

FormItem ๋‚ด๋ถ€์—์„œ ์ปจํŠธ๋กค์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Inactive IssueHuntFest help wanted ๐Ÿ—ฃ Discussion

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

์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

CustomForm.js

// imports here

class CustomForm {
  render() {
    return (<Form>
      <Form.Item>
        {UsernameInput({ form: this.props.form })}
      </Form.Item>
    </Form>);
  }
}

export default Form.create()(CustomForm);

๊ทธ๋Ÿฌ๋‚˜ ์•„์ด๋””์–ด์— ๊ฐœ๋ฐฉ์ ์ด๋ผ๋ฉด ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์€ FormItem ์ปจํ…์ŠคํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ Input ๋Š” ์กด์žฌํ•  ๋•Œ ์Šค์Šค๋กœ ๋“ฑ๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ

FormItem.js

class FormItem extends Component {
  static childContextTypes = {
    registerControl: PropTypes.func
  };

  getChildContext() {
    return { registerControl: this.registerControl }; 
  }

  registerControl(control) {
    this.controls.push(control);
  }
}

Input.js

class Input extends Component {
  static contextTypes = {
    registerControl: PropTypes.func
  };

  componentDidMount() {
    if (this.context.registerControl) {
      this.registerControl(this);
    }
  }
}

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

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์กฐ์–ธ (๊ตฌํ˜„ ๋ฐฉ๋ฒ•)์„ ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

CustomForm.js

// imports here

class CustomForm {
  render() {
    return (<Form>
      <Form.Item>
        {UsernameInput({ form: this.props.form })}
      </Form.Item>
    </Form>);
  }
}

export default Form.create()(CustomForm);

๊ทธ๋Ÿฌ๋‚˜ ์•„์ด๋””์–ด์— ๊ฐœ๋ฐฉ์ ์ด๋ผ๋ฉด ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์€ FormItem ์ปจํ…์ŠคํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ Input ๋Š” ์กด์žฌํ•  ๋•Œ ์Šค์Šค๋กœ ๋“ฑ๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ

FormItem.js

class FormItem extends Component {
  static childContextTypes = {
    registerControl: PropTypes.func
  };

  getChildContext() {
    return { registerControl: this.registerControl }; 
  }

  registerControl(control) {
    this.controls.push(control);
  }
}

Input.js

class Input extends Component {
  static contextTypes = {
    registerControl: PropTypes.func
  };

  componentDidMount() {
    if (this.context.registerControl) {
      this.registerControl(this);
    }
  }
}

ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@gaastonsr ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ UsernameInput์— ๋Œ€ํ•œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@gaastonsr ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์€ ์ €๋ฅผ ๋งŽ์ด ๋„์™€์ค๋‹ˆ๋‹ค!

์—ฌ์ „ํžˆ ์œ ํšจํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ๋ฌธ๋งฅ ์ œ์•ˆ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ [email protected] ์—์„œ @gaastonsr ์˜ ํ•จ์ˆ˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ปจํ…์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์–‘์‹ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์šฐ์•„ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @gaastonsr. ๊ท€ํ•˜์˜ ์ œ์•ˆ / ํ”ผ๋“œ๋ฐฑ์ด ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Pull Request ๋ฅผ

์•ˆ๋…•ํ•˜์„ธ์š” @gaastonsr, ์šฐ๋ฆฌ๋Š” ๊ท€ํ•˜์˜ ์ œ์•ˆ / ํ”ผ๋“œ๋ฐฑ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Pull Request ๋ฅผ ์‹ญ์‹œ์˜ค . Pull Request๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ธŒ๋žœ์น˜ (๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์ƒˆ ๊ธฐ๋Šฅ, โ€‹โ€‹๋‹ค๋ฅธ ๊ธฐ๋Šฅ์€ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜)๋กœ ๋ณด๋‚ด ์ฃผ์‹œ๊ณ  , Pull Request

giphy

antd v4์—์„œ ์ƒˆ๋กœ์šด ์–‘์‹ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. v3 ์–‘์‹์€ ๋‹จ์‹œ๊ฐ„์— ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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