Ant-design: โœจ Ant Design 4.0์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

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

Ant Design 4.0์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค!

์†Œ๊ฐœ

SEE Conf์—์„œ 4.0 rc ๋ฒ„์ „์„ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋‹ฌ์ด ๋„˜๋Š” ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘ ๋ฐ ์กฐ์ • ํ›„ 4.0์„ ์ถœ์‹œ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค! ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ ํ”ผ๋“œ๋ฐฑ, ์ œ์•ˆ ๋ฐ ๊ธฐ์—ฌ๋ฅผ ์ œ๊ณต ํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. rc ๋ฒ„์ „์— ์ด๋ฏธ ํฌํ•จ ๋œ ์—…๋ฐ์ดํŠธ์™€ ์ตœ๊ทผ ์—ฌ๊ธฐ์—์„œ ์ผ๋ถ€ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์—…๋ฐ์ดํŠธ ๋œ ๋ฌธ์„œ๋Š” ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . v4 ๋ฌธ์„œ ์ฃผ์†Œ : https://ant.design

v3 ๋ฒ„์ „์€ 2019 ๋…„ 12 ์›”์— 3.x-stable ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋˜์–ด ์œ ์ง€ ๊ด€๋ฆฌ์— ๋“ค์–ด๊ฐ”์Šต๋‹ˆ๋‹ค. v3 ๋ฒ„์ „์— ๋Œ€ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ ์ž‘์—…์€ ๋ฐ˜๋…„ ๋™์•ˆ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ ๊ฒ€ ๋งˆ๊ฐ์ผ์€ 2020 ๋…„ 5 ์›”์ž…๋‹ˆ๋‹ค.

์„ค๊ณ„ ์‚ฌ์–‘ ์—…๊ทธ๋ ˆ์ด๋“œ

๊ธฐ๋ณธ ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ๋ฅผ 4px ์—์„œ 2px . ํ•„๋ › ์ž์ฒด๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์ด๋ฉฐ ์ค‘๊ฐ„ ๋ฐ ๋ฐฐ๊ฒฝ ์žฅ๋ฉด์—์„œ ํšจ์œจ์„ฑ์„ ์ตœ์šฐ์„ ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‹œ๊ฐ์  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ค„์ด๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ์ •๋ณด ์ฝ๊ธฐ์˜ ํšจ์œจ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ •๋ณด ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ•์กฐํ•˜๋ฉด์„œ ์‹ค์ œ ๊ทธ๋ฆผ์ž์™€ ๋” ์ผ๊ด€๋˜๊ฒŒ ๊ทธ๋ฆผ์ž๋ฅผ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋‘์šด ํ…Œ๋งˆ

v3 ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ‰์ƒ ์‹œ์Šคํ…œ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์œผ๋ฉฐ v4๋Š” ์–ด๋‘์šด ํ…Œ๋งˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์—์„œ ํ…Œ๋งˆ ์ „ํ™˜ ๊ธฐ๋Šฅ์„ ํด๋ฆญํ•˜๋ฉด ์–ด๋‘์šด ํ…Œ๋งˆ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ„์„ ์—†๋Š” ๊ตฌ์„ฑ ์š”์†Œ

์ผ์ƒ์ ์ธ ์ž‘์—…์—์„œ ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๊ฒฝ๋Ÿ‰ ์„ ํƒ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์Šคํƒ€์ผ์„ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ๋ณด๋‹ค ์‰ฝ๊ฒŒ โ€‹โ€‹ํฌํ•จ ํ•  ์ˆ˜์žˆ๋Š” ์ƒˆ๋กœ์šด ๊ฒฝ๊ณ„์—†๋Š” ์Šคํƒ€์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

borderless

ํ˜ธํ™˜์„ฑ ์กฐ์ •

Ant Design 3.0์€ ์ด์ „ ๋ฒ„์ „์˜ IE์™€ ํ˜ธํ™˜๋˜๋„๋ก ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—…๊ณ„ ํ†ต๊ณ„์— ๋”ฐ๋ฅด๋ฉด ๊ธ€๋กœ๋ฒŒ ๋ฐ ๊ตญ๋‚ด IE9 / 10 ๋ธŒ๋ผ์šฐ์ €๋Š” Windows ์‹œ์Šคํ…œ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ์ถ•์†Œ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 4.0์—์„œ IE 9/10 ์ง€์›์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋Ÿฌ๋‚˜ IE 11์€ ๊ณ„์† ์ง€์›ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ๊ณผ๊ฑฐ์˜ ์ผ๋ถ€ ์ € ์„ฑ๋Šฅ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ƒˆ๋กœ์šด css ๊ธฐ๋Šฅ์œผ๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋™์‹œ์— v4๊ฐ€ ์˜์กดํ•˜๋Š” React์˜ ์ตœ์†Œ ๋ฒ„์ „๋„ React 16.9๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, v4 ๋ฒ„์ „์€ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ํ›„ํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ v3 ๋ฆด๋ฆฌ์Šค์—์„œ ๊ฒฝ๊ณ  ๋œ ์ผ๋ถ€ ์˜ค๋ž˜๋œ API๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋ฅผ v3์˜ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€์— ๋”ฐ๋ผ ์ง€์› ์ค‘๋‹จ ๋œ API๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋” ์ž‘์€ ํฌ๊ธฐ

antd @ 3.9.0 ์—์„œ๋Š” svg ์•„์ด์ฝ˜ ( ์™œ svg ์•„์ด์ฝ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? )์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด์ฝ˜ API๋Š” ์š”์ฒญ์‹œ๋กœ๋“œ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ svg ์•„์ด์ฝ˜ ํŒŒ์ผ์ด ์™„์ „ํžˆ ๋„์ž…๋˜์–ด ํŒจํ‚ค์ง€ ์ œํ’ˆ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 4.0์—์„œ๋Š” ํŠธ๋ฆฌ ํ”๋“ค๊ธฐ๋ฅผ ์ง€์›ํ•˜๋„๋ก ์•„์ด์ฝ˜ ์‚ฌ์šฉ API๋ฅผ ์กฐ์ •ํ•˜์—ฌ Antant์˜ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ํฌ๊ธฐ๋ฅผ ์•ฝ 150KB (Gzip)๋กœ ์ค„์˜€์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ์•„์ด์ฝ˜ ์‚ฌ์šฉ์€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

import { Icon, Button } from 'antd';

const Demo = () => (
  <div>
    <Icon type="smile" />
    <Button icon="smile" />
  </div>
);

4.0์—์„œ๋Š” ์ฃผ๋ฌธํ˜•์œผ๋กœ ๋„์ž…๋ฉ๋‹ˆ๋‹ค.

  import { Button } from 'antd';

 // tree-shaking supported
- import { Icon } from 'antd';
+ import { SmileOutlined } from '@ant-design/icons';

  const Demo = () => (
    <div>
-     <Icon type="smile" />
+     <SmileOutlined />
      <Button icon={<SmileOutlined />} />
    </div>
  );

  // or directly import
  import SmileOutlined from '@ant-design/icons/SmileOutlined';

๋˜ํ•œ gzip์œผ๋กœ ์••์ถ• ๋œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๊ด€๋ จ ์ข…์†์„ฑ๋„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

bundleSize

๊ตฌ์„ฑ ์š”์†Œ ์žฌ ์ž‘์„ฑ

์–‘์‹ ์žฌ ์ž‘์„ฑ

๊ณ ์ฃผํŒŒ ๊ตฌ์„ฑ ์š”์†Œ ์ธ Form์—๋Š” ์•ฝ๊ฐ„ ์ค‘๋ณต๋˜๋Š” API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” Form.create์˜ HOC๋ฅผ ํ†ตํ•ด Form ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ ์™€์„œ form.getFieldDecorator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ์–‘์‹์ด ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋ฏ€๋กœ ๋น… ๋ฐ์ดํ„ฐ ์–‘์‹์—์„œ ์„ฑ๋Šฅ์ด ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. v4 ๋ฒ„์ „์—์„œ Form์€ ์–‘์‹ ์ธ์Šคํ„ด์Šค์™€ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Form.Item์˜ name ์†์„ฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- const { form } = this.props;

- const onSubmit = () => {
-   form.validateFields((err, values) => {
-     if (!err) {
-      console.log('Received values of form: ', values);
-    }
-   });
- };

+ const onFinish = (values) => {
+   console.log('Received values of form: ', values);
+ };

- <Form onSubmit={onSubmit}>
+ <Form onFinish={onFinish}>
-   <Form.Item>
+   <Form.Item name="username">
-     {getFieldDecorator('username')(
-       <Input />,
-     )}
+     <Input />
    </Form.Item>
  </Form>

๋Œ€๋ถ€๋ถ„์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ฐœ๋ฐœ์ž๋Š” ์‹ค์ œ๋กœ ์–‘์‹์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ œ์ถœํ•˜๋Š” ๊ฐ’์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–‘์‹ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผ ํ•œ ํ›„์— ๋งŒ โ€‹โ€‹์‹คํ–‰๋˜๋Š” onFinish ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ validateFields ๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Form์€ ์–‘์‹ ์˜ˆ์ œ๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ›„ํฌ ๋ฉ”์„œ๋“œ Form.useForm ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

const [form] = Form.useForm();

React.useEffect(() => {
  form.setFieldValues({ ... });
});

<Form form={form} />

๋™์‹œ์— ๋ชฉ๋ก ํ•„๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋„๋ก Form.List ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

<Form.List name="names">
  {(fields, { add, remove }) => (
    <div>
      {fields.map(field) => <Form.Item {...field}><Input /></Form.Item>}
      <Button onClick={() => add(initialValue)}>Add</Button>
    </div>
  }
</Form.List>

ํ…Œ์ด๋ธ” ์žฌ ์ž‘์„ฑ

ํ˜ธํ™˜์„ฑ์„์œ„ํ•œ ์ตœ์†Œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์กฐ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— sticky ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์ • ์—ด ๊ตฌํ˜„์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์–‘์‹์— ๊ณ ์ • ์—ด์ด์žˆ์„ ๋•Œ ์„ฑ๋Šฅ ์†Œ๋น„๋ฅผ ํฌ๊ฒŒ ์ค„์˜€์Šต๋‹ˆ๋‹ค. sticky ์ง€์›ํ•˜์ง€ ์•Š๋Š” IE 11์˜ ๊ฒฝ์šฐ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ ์ฒ˜๋ฆฌ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋™์‹œ์— ์š”์•ฝ ๋ผ์ธ์˜ ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด summary API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ฅ˜๊ธฐ๋Š” ๋‹ค์ค‘ ์—ด ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ fixedColumn , expandable ๋ฐ scroll ๋ฅผ ํ˜ผํ•ฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ ๋…ผ๋ฆฌ๋ฅผ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ ์Šคํฌ๋กค๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ํ…Œ์ด๋ธ” ์ปจํ…์ธ  ๊ตฌํ˜„์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ธฐ์œ„ํ•œ body API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด DatePicker, TimePicker ๋ฐ ๋‹ฌ๋ ฅ

๋‚ ์งœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ „์ฒด์ ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ moment ์—์„œ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” generate ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์„ ํƒ๊ธฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ Picker ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์—ฌ์ „ํžˆ moment ๋ฅผ ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งž์ถค ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—ฌ๊ธฐ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋˜ํ•œ ์‹œ๊ฐ„, ๋‚ ์งœ, ์ฃผ, ์›”, ์—ฐ๋„ ์„ ํƒ๊ธฐ ๋ฐ ํ•ด๋‹น ๋ฒ”์œ„ ์„ ํƒ๊ธฐ์˜ ์ „์ฒด ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“œ์˜ ์ œ์–ด ๋œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ํŠน์ˆ˜ ์„ ํƒ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€์‹  ์„ ํƒ๊ธฐ ์†์„ฑ์„ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<RangePicker />
<RangePicker showTime />
<RangePicker picker="week" />
<RangePicker picker="month" />
<RangePicker picker="year" />

๋ฒ”์œ„ ์„ ํƒ๊ธฐ์˜ ๊ฒฝ์šฐ ์ƒํ˜ธ ์ž‘์šฉ๋„ ์ตœ์ ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์‹œ์ž‘ ๋˜๋Š” ์ข…๋ฃŒ ์‹œ๊ฐ„์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ˆ˜๋™ ๋‚ ์งœ ์ž…๋ ฅ ํ™˜๊ฒฝ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๋ฆผ / ๋ชจ๋‹ฌ ์ง€์› ํ›„ํฌ

๊ณผ๊ฑฐ์—๋Š” Modal.xxx ๋ฐ Notification.xxx ํ˜ธ์ถœ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์— ๋Œ€ํ•ด ReactDOM.render ๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€๋กœ React ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…์ŠคํŠธ ์†์‹ค ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „์—์„œ๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•˜๋Š” ๊ณณ์— ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž… ํ•  ์ˆ˜์žˆ๋Š” hooks ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

const [api, contextHolder] = notification.useNotification();

return (
  <Context1.Provider value="Ant">
    {/* contextHolder is in Context1 which mean api will not get context of Context1 */}
    {contextHolder}
    <Context2.Provider value="Design">
      {/* contextHolder is out of Context2 which mean api will not get context of Context2 */}
    </Context2.Provider>
  </Context1.Provider>
);

๊ฐ€์ƒ ์Šคํฌ๋กค

v4์—์„œ๋Š” Tree, TreeSelect ๋ฐ Select๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ƒ ์Šคํฌ๋กค ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜์—ฌ ๋งŽ์€ ์–‘์˜ ์˜ต์…˜ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ƒํ™œ ๋ฐ๋ชจ

๋˜ํ•œ ํ‚ค๋ณด๋“œ ์ƒํ˜ธ ์ž‘์šฉ ๋ฐ ์ ‘๊ทผ์„ฑ์ด ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ / ๊ธฐ๋Šฅ / ์ตœ์ ํ™”

  • ConfigProvider๋Š” direction rtl ์–ธ์–ด ๊ตญ์ œํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด direction ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Form ๋ฐ ConfigProvider๋Š” ๊ตฌ์„ฑ ์š”์†Œ ํฌ๊ธฐ๋ฅผ ํฌํ•จํ•œ size ์„ค์ •์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ์ฒด๊ณ„๋Š” suffix ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง„ํ–‰๋ฅ ์€ steps ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • TextArea๋Š” onResize ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๋“œ๋Š” flex ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ......

์—ฌ๊ธฐ ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ „์ฒด ์—…๋ฐ์ดํŠธ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐฉ๋ฒ•

๊ฐ€๋Šฅํ•œ ํ•œ ์‰ฝ๊ฒŒ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ตœ๋Œ€ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋‹น์‚ฌ์—์„œ ์ œ๊ณตํ•˜๋Š” codemod ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹œ๋„ํ•˜๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ์ˆ˜์—†๋Š” ์ผ๋ถ€ ๋ถ€๋ถ„์„ ์ˆ˜๋™์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ์— ๋Œ€ํ•œ ๋ฌธ์„œ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ฌด์—‡๋ณด๋‹ค๋„

Ant Design 4.0์˜ ํƒ„์ƒ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ž์› ๋ด‰์‚ฌ์ž์˜ ๊ธฐ์—ฌ์™€ ์ง€์›๊ณผ ๋ถ„๋ฆฌ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. rtl ์˜ ๊ตญ์ œํ™”์— ๋Œ€ํ•ด @saeedrahimi , @shaodahong ํ˜ธํ™˜ ๊ธฐ๋Šฅ ํŒฉ์— ๋Œ€ํ•œ ๊ธฐ์—ฌ ๋ฐ ๊ฐœ๋ฐœ ์ง€์›์— ๊ด€๋ จ๋œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. Ant Design์„ ๋”์šฑ ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์˜คํ”ˆ ์†Œ์Šค์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ๊ณตํ—Œ์ž…๋‹ˆ๋‹ค!


Ant Design 4.0์˜ ๊ณต์‹ ๋ฒ„์ „์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

์†Œ๊ฐœ

SEE Conf๋ฅผ ๊ณ„๊ธฐ๋กœ 4.0 rc ๋ฒ„์ „์„ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋‹ฌ์ด ๋„˜๋Š” ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘ ๋ฐ ์กฐ์ • ๋์— ๋งˆ์นจ๋‚ด ๊ณต์‹ ๋ฒ„์ „ 4.0์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ ํ”ผ๋“œ๋ฐฑ, ์ œ์•ˆ ๋ฐ ๊ธฐ์—ฌ๋ฅผ ์ œ๊ณต ํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. rc ๋ฒ„์ „์— ์ด๋ฏธ ํฌํ•จ ๋œ ์—…๋ฐ์ดํŠธ์™€ ์—ฌ๊ธฐ์— ์—ด๊ฑฐ ํ•  ๋” ์ค‘์š”ํ•œ ์ƒˆ๋กœ์šด ์ถ”๊ฐ€ ์‚ฌํ•ญ์„ ๊ฒฐํ•ฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ์—…๋ฐ์ดํŠธ ๋œ ๋ฌธ์„œ๋Š” ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค . v4 ๋ฌธ์„œ ์ฃผ์†Œ : https://ant.design

v3 ๋ฒ„์ „์€ 2019 ๋…„ 12 ์›”์— 3.x-stable ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋˜์–ด ์œ ์ง€ ๊ด€๋ฆฌ ์ƒํƒœ๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. v3 ๋ฒ„์ „์€ ๋ฐ˜๋…„ ๋™์•ˆ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ ๊ฒ€ ๋งˆ๊ฐ์ผ์€ 2020 ๋…„ 5 ์›”์ž…๋‹ˆ๋‹ค.

์„ค๊ณ„ ์‚ฌ์–‘ ์—…๊ทธ๋ ˆ์ด๋“œ

๊ธฐ๋ณธ ํ•„๋ ›์„ 4px ์—์„œ 2px . ์ค‘๊ฐ„ ๋ฐ ๋ฐฑ์—”๋“œ ์ œํ’ˆ์€ ํšจ์œจ์„ฑ์„ ์ตœ์šฐ์„ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ ์Šคํƒ€์ผ์€ UI์˜ ์ค‘์š”ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ๊ฐ€ ์ž‘์„์ˆ˜๋ก ์ธํ„ฐํŽ˜์ด์Šค ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์‹œ๊ฐ์ ์œผ๋กœ ์ค„์–ด๋“ค๊ณ  ์ •๋ณด ์ฝ๊ธฐ์˜ ํšจ์œจ์„ฑ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ทธ๋ฆผ์ž๋ฅผ ์‹ค์ œ ๊ทธ๋ฆผ์ž์— ๋” ๊ฐ€๊น๊ฒŒ ๋งŒ๋“ค๊ณ  ๋™์‹œ์— ์ •๋ณด ์ˆ˜์ค€์„ ๋” ์ž˜ ๋ฐ˜์˜ํ•˜๋„๋ก ๊ทธ๋ฆผ์ž๋ฅผ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋‘์šด ํ…Œ๋งˆ

v3 ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ‰์ƒ ์‹œ์Šคํ…œ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์œผ๋ฉฐ v4๋Š” ์–ด๋‘์šด ํ…Œ๋งˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์—์„œ ํ…Œ๋งˆ ์ „ํ™˜ ๊ธฐ๋Šฅ์„ ํด๋ฆญํ•˜์—ฌ ์–ด๋‘์šด ํ…Œ๋งˆ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ„์„ ์—†๋Š” ๊ตฌ์„ฑ ์š”์†Œ

๋น„์ฆˆ๋‹ˆ์Šค์—์„œ ์šฐ๋ฆฌ๋Š” ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ฐ€๋ฒผ์šด ์„ ํƒ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์Šคํƒ€์ผ์„ ๋ฎ์–ด ์“ฐ์ง€ ์•Š๊ณ ๋„ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ํฌํ•จ ํ•  ์ˆ˜์žˆ๋Š” ์ƒˆ๋กœ์šด ๊ฒฝ๊ณ„์—†๋Š” ์Šคํƒ€์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

borderless

ํ˜ธํ™˜์„ฑ ์กฐ์ •

Ant Design 3.0์€ ์ด์ „ ๋ฒ„์ „์˜ IE์™€ ํ˜ธํ™˜๋˜๋„๋ก ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—…๊ณ„ ํ†ต๊ณ„์— ๋”ฐ๋ฅด๋ฉด IE9 / 10 ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธ€๋กœ๋ฒŒ ๋ฐ ๊ตญ๋‚ด ์ ์œ ์œจ์€ Windows ์‹œ์Šคํ…œ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ์ค„์–ด๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฒ„์ „ 4.0์— ์žˆ์œผ๋ฉฐ IE 9/10 ์ง€์›์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋Ÿฌ๋‚˜ IE 11์€ ๊ณ„์† ์ง€์›ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ๊ณผ๊ฑฐ์˜ ์ผ๋ถ€ ์ € ์„ฑ๋Šฅ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ƒˆ๋กœ์šด CSS ๊ธฐ๋Šฅ์œผ๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋™์‹œ์— v4๊ฐ€ ์˜์กดํ•˜๋Š” React์˜ ์ตœ์†Œ ๋ฒ„์ „๋„ React 16.9๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, v4 ๋ฒ„์ „์€ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ํ›„ํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ v3 ๋ฒ„์ „์—์„œ ๊ฒฝ๊ณ  ๋œ ์ผ๋ถ€ ์˜ค๋ž˜๋œ API๋„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋ฅผ v3์˜ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ๊ฒฝ๊ณ  ์ •๋ณด์— ๋”ฐ๋ผ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” API๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋” ์ž‘์€ ํฌ๊ธฐ

[email protected] ์—์„œ๋Š” svg ์•„์ด์ฝ˜์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค ( ์™œ svg ์•„์ด์ฝ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ). ๋ฌธ์ž์—ด ์ด๋ฆ„ ์ง€์ •์„ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด์ฝ˜ API๋Š” ์š”์ฒญ์‹œ๋กœ๋“œ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ svg ์•„์ด์ฝ˜ ํŒŒ์ผ์ด ์™„์ „ํžˆ ๋„์ž…๋˜์–ด ํŒจํ‚ค์ง€ ์ œํ’ˆ์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 4.0์—์„œ๋Š” ์•„์ด์ฝ˜ ์‚ฌ์šฉ API๋ฅผ ์กฐ์ •ํ•˜์—ฌ ํŠธ๋ฆฌ ํ”๋“ค๊ธฐ๋ฅผ ์ง€์›ํ•˜๊ณ  antd ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ํฌ๊ธฐ๋ฅผ ์•ฝ 150KB (Gzip)๋กœ ์ค„์˜€์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „์˜ ์•„์ด์ฝ˜ ์‚ฌ์šฉ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import { Icon, Button } from 'antd';

const Demo = () => (
  <div>
    <Icon type="smile" />
    <Button icon="smile" />
  </div>
);

4.0์—์„œ๋Š” ์ฃผ๋ฌธํ˜• ๋„์ž… ๋ฐฉ๋ฒ•์ด ์ฑ„ํƒ๋ฉ๋‹ˆ๋‹ค.

import { Button } from 'antd';

// tree-shaking supported
- import { Icon } from 'antd';
+ import { SmileOutlined } from '@ant-design/icons';

  const Demo = () => (
    <div>
-     <Icon type="smile" />
+     <SmileOutlined />
      <Button icon={<SmileOutlined />} />
    </div>
  );

  // or directly import
  import SmileOutlined from '@ant-design/icons/SmileOutlined';

๋˜ํ•œ ํŒจํ‚ค์ง€ ํฌ๊ธฐ (Gzipped)๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ด€๋ จ ์ข…์†์„ฑ์„ ๊ฐ„์†Œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

bundleSize

๊ตฌ์„ฑ ์š”์†Œ ๋‹ค์‹œ ์‹คํ–‰

์–‘์‹ ์žฌ์‹คํ–‰

Form์€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ด๋ฉฐ ํ•ด๋‹น API๋Š” ์•ฝ๊ฐ„ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” Form.create ์˜ HOC ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์–‘์‹ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ ์™€์„œ form.getFieldDecorator ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑ ์š”์†Œ์— ๋ฐ”์ธ๋”ฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ์–‘์‹์ด ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋ฏ€๋กœ ๋น… ๋ฐ์ดํ„ฐ ํ˜•์‹์—์„œ๋Š” ์„ฑ๋Šฅ์ด ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. v4 ๋ฒ„์ „์—์„œ Form์—๋Š” ์ž์ฒด ์–‘์‹ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ Form.Item์˜ name ์†์„ฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- const { form } = this.props;

- const onSubmit = () => {
-   form.validateFields((err, values) => {
-     if (!err) {
-      console.log('Received values of form: ', values);
-    }
-   });
- };

+ const onFinish = (values) => {
+   console.log('Received values of form: ', values);
+ };

- <Form onSubmit={onSubmit}>
+ <Form onFinish={onFinish}>
-   <Form.Item>
+   <Form.Item name="username">
-     {getFieldDecorator('username')(
-       <Input />,
-     )}
+     <Input />
    </Form.Item>
  </Form>

๋Œ€๋ถ€๋ถ„์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ฐœ๋ฐœ์ž๋Š” ์‹ค์ œ๋กœ ์„ฑ๊ณต์ ์ธ ์–‘์‹ ์ œ์ถœ์˜ ๊ฐ€์น˜์—๋งŒ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–‘์‹์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌ ํ•œ ํ›„์— ๋งŒ โ€‹โ€‹ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” onFinish ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ validateFields ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Form์€ ์–‘์‹ ์˜ˆ์ œ๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ›„ํฌ ๋ฉ”์„œ๋“œ Form.useForm ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

const [form] = Form.useForm();

React.useEffect(() => {
    form.setFieldValues({ ... });
});

<Form form={form} />

๋™์‹œ์— ๋ชฉ๋ก ํ•„๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋„๋ก Form.List ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

<Form.List name="names">
  {(fields, { add, remove }) => (
    <div>
      {fields.map(field) => <Form.Item {...field}><Input /></Form.Item>}
      <Button onClick={() => add(initialValue)}>Add</Button>
    </div>
  }
</Form.List>

ํ…Œ์ด๋ธ” ๋‹ค์‹œ ์‹คํ–‰

ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ์ตœ์†Œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋†’์˜€์œผ๋ฏ€๋กœ sticky ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์ • ์—ด์„ ๊ตฌํ˜„ํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–‘์‹์— ๊ณ ์ • ์—ด์ด์žˆ์„ ๋•Œ ์„ฑ๋Šฅ ์†Œ๋น„๊ฐ€ ํฌ๊ฒŒ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค. sticky ์ง€์›ํ•˜์ง€ ์•Š๋Š” IE 11์˜ ๊ฒฝ์šฐ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.

๋™์‹œ์— ์š”์•ฝ ๋ผ์ธ์˜ ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด summary API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ฅ˜๊ธฐ๋Š” ๋‹ค์ค‘ ์—ด ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ๋ณธ ๋กœ์ง์„ ์กฐ์ •ํ•˜์—ฌ ์ด์ œ fixedColumn , expandable , scroll ๋ฅผ ํ˜ผํ•ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. body API๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ…Œ์ด๋ธ” ์ปจํ…์ธ  ๊ตฌํ˜„์„ ์œ„ํ•ด ์ œ๊ณต๋˜๋ฏ€๋กœ ๊ฐ€์ƒ ์Šคํฌ๋กค๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด DatePicker, TimePicker ๋ฐ ๋‹ฌ๋ ฅ

๋‚ ์งœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ „์ฒด์ ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ moment ์—์„œ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” generate ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ํƒ๊ธฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ Picker ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์—ฌ์ „ํžˆ moment ๋ฅผ ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งž์ถค ๋‚ ์งœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋˜ํ•œ ์‹œ๊ฐ„, ๋‚ ์งœ, ์ฃผ, ์›”, ์—ฐ๋„ ์„ ํƒ๊ธฐ ๋ฐ ํ•ด๋‹น ๋ฒ”์œ„ ์„ ํƒ๊ธฐ์˜ ์ „์ฒด ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. picker ์†์„ฑ์„ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋” ์ด์ƒ mode ์˜ ์ œ์–ด ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ˆ˜ ์„ ํƒ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

<RangePicker />
<RangePicker showTime />
<RangePicker picker="week" />
<RangePicker picker="month" />
<RangePicker picker="year" />

๋ฒ”์œ„ ์„ ํƒ๊ธฐ์—์„œ ์ƒํ˜ธ ์ž‘์šฉ๋„ ์ตœ์ ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์‹œ์ž‘ ๋˜๋Š” ์ข…๋ฃŒ ์‹œ๊ฐ„์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚ ์งœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ž…๋ ฅํ•˜๋Š” ํ™˜๊ฒฝ์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.

์•Œ๋ฆผ / ๋ชจ๋‹ฌ์€ ํ›„ํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

์ด์ „ ๋ฒ„์ „์—์„œ๋Š” Modal.xxx ๋ฐ Notification.xxx ํ˜ธ์ถœ ๋ฉ”์„œ๋“œ๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์— ๋Œ€ํ•ด ReactDOM.render ๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€๋กœ React ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…์ŠคํŠธ ์†์‹ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „์—์„œ๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•˜๋Š” ์œ„์น˜์— ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž… ํ•  ์ˆ˜ ์žˆ๋„๋ก hooks ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

const [api, contextHolder] = notification.useNotification();

return (
  <Context1.Provider value="Ant">
    {/* contextHolder is in Context1 which mean api will not get context of Context1 */}
    {contextHolder}
    <Context2.Provider value="Design">
      {/* contextHolder is out of Context2 which mean api will not get context of Context2 */}
    </Context2.Provider>
  </Context1.Provider>
);

๊ฐ€์ƒ ์Šคํฌ๋กค

v4์—์„œ๋Š” ๊ฐ€์ƒ ์Šคํฌ๋กค ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜์—ฌ ์˜ต์…˜ ๋ Œ๋”๋ง์„ ์œ„ํ•ด ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” Tree, TreeSelect ๋ฐ Select๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒํ™œ ๋ฐ๋ชจ

๋˜ํ•œ ํ‚ค๋ณด๋“œ ์ƒํ˜ธ ์ž‘์šฉ ๋ฐ ์ ‘๊ทผ์„ฑ๋„ ์ตœ์ ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ / ํŠน์ง• / ์ตœ์ ํ™” ๋ถ€ํ’ˆ

  • ConfigProvider๋Š” direction rtl ์–ธ์–ด ๊ตญ์ œํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด direction ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Form ๋ฐ ConfigProvider๋Š” size ์„ค์ •์„ ์ง€์›ํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ ํฌ๊ธฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ์ฒด๊ณ„๋Š” suffix ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง„ํ–‰๋ฅ ์€ steps ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • TextArea๋Š” onResize ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๋“œ๋Š” flex ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ......

์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ „์ฒด ์—…๋ฐ์ดํŠธ ๋กœ๊ทธ

์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐฉ๋ฒ•

๊ฐ€๋Šฅํ•œ ํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ํ•œ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” codemod ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ์ˆ˜์—†๋Š” ์ผ๋ถ€ ์ฝ˜ํ…์ธ ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ์— ๋Œ€ํ•ด์„œ๋Š”์ด ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์œ„

๊ฐœ๋ฏธ ๋””์ž์ธ 4.0์˜ ํƒ„์ƒ์€. ๋•๋ถ„์— ๊ธฐ์—ฌ ๋ฐ ์ง€์—ญ ์‚ฌํšŒ ์ž์› ๋ด‰์‚ฌ์ž์˜ ์ง€์› ๋ถˆ๊ฐ€๋ถ„์˜ ๊ด€๊ณ„ ์— ๋Œ€ํ•œ @saeedrahimi ์˜ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ rtl , @shaodahong ํ˜ธํ™˜ ํŒจํ‚ค์ง€์˜ ๊ธฐ์—ฌ์™€ ์ฐธ์—ฌ ๋ชจ๋‘ ๊ฐœ๋ฐœ. Ant Design์„ ๋”์šฑ ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์˜คํ”ˆ ์†Œ์Šค์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ๊ณตํ—Œ์ž…๋‹ˆ๋‹ค!

4.x โœจ Announcement

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

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค!!!

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

๋ฌธ์„œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌํ•ด์•ผํ•˜๋ฉฐ ๋‹ค์Œ์„ ๋” ์ด์ƒ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

ํ…Œ๋‘๋ฆฌ์—†๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ทธ๋ฆผ์ด ๊ฑธ๋ ค์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ๋…ธ๋ ฅ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค!!!

Hooks๋Š” 16.8๋ถ€ํ„ฐ ์ง€์›๋ฉ๋‹ˆ๋‹ค. package.json์€ ํ˜„์žฌ 16.8์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์„ค๋ช… ๋œ ์ตœ์†Œ ์š”๊ตฌ ์‚ฌํ•ญ์€ React 16.9์ž…๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ์ˆ˜์ • ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์„œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌํ•ด์•ผํ•˜๋ฉฐ ๋‹ค์Œ์„ ๋” ์ด์ƒ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

next.ant.design ant.design ์ง€๊ธˆ

next.ant.design ์ด ์ด์ œ ant.design ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.

๐Ÿ™๐Ÿผ

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ์ƒˆ๋กœ์šด ํ˜•ํƒœ ์„ฑ๋Šฅ์ด ๋Œ€๋‹จํ•ฉ๋‹ˆ๋‹ค

์˜ฌ๋ฆฌ

[๊ณผ๊ฑฐ ๋ฒ„์ „์—์„œ๋Š” Modal.xxx ๋ฐ Notification.xxx ํ˜ธ์ถœ ๋ฉ”์†Œ๋“œ๊ฐ€ Context๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜์—†๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์— ๋Œ€ํ•œ ReactDOM.render๋ฅผ ํ†ตํ•ด React ์ธ์Šคํ„ด์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ, ์ปจํ…์ŠคํŠธ ์†์‹ค ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.]

์—ฌ๊ธฐ์„œ ReactDOM.createPortal ์„ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„

@kpaxqin ์ง์ ‘ PR์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฝค ์•ˆ์ •์ ์ธ rc-3์—์„œ ์ƒ์‚ฐ์— ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์–ด์จŒ๋“ , Teme์ด ๋“œ๋””์–ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Huaxie๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š” :) :)

antd 4.0์„ ์ฆ๊ธฐ๊ณ  ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ํ–‰๋ณตํ•œ ์ผ์„ ๋งŒ๋“œ์‹ญ์‹œ์˜ค :) :)

๋‹คํฌ ๋ชจ๋“œ๋Š” ํ•˜๋‚˜์˜ ๊ฒ€์€ ์ƒ‰ ์„ ๋งŒ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

image

๋‹คํฌ ๋ชจ๋“œ๋Š” ํ•˜๋‚˜์˜ ๊ฒ€์€ ์ƒ‰ ์„ ๋งŒ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

image

์ž ์‹œ๋งŒ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”. dark.css ์ด (๊ฐ€) ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@ ycjcl868 # 21656 (์ฝ”๋ฉ˜ํŠธ)

๋๋‚œ

๋‹น์‹ ์˜ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๊ตญ๋‚ด ๋ฏธ๋Ÿฌ ์‚ฌ์ดํŠธ https://ant-design.gitee.io/index-cn์€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

antd

๊ณ ๋งˆ์›Œ์š” ๐Ÿป

๋“œ๋””์–ด ์—…๊ทธ๋ ˆ์ด๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค

๋“œ๋””์–ด ์ถœ์‹œ! ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋…ธ๋ ฅ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผ์„ฑ์— ๋Œ€ํ•ด ์–ด๋–ค ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ถ•ํ•˜ํ•ด ์ถ•ํ•˜ํ•ด

์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ด๋ฏ€๋กœ antd ๐Ÿ™ ๋•๋ถ„์— ์ง์žฅ์—์„œ antd๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด์ด ํŽ˜์ด์ง€์—์„œ ๋‚ด ๊ฒฝ๋ ฅ์ด ์™„์ „ํžˆ ์–ด๋‘์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ wlc534 ๊ฐ€ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์–‘์‹ ํ›„ํฌ API ์‚ฌ์šฉ์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. RangePicker๋Š” UX ์ธก๋ฉด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์› ์ง€๋งŒ ์ด์ œ ๊ฑฐ์˜ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ž˜ ํ–ˆ์–ด!

์ž˜ ํ–ˆ์–ด !! ๋” ์ ์€ dep๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™„๋ฒฝํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค !!

๋งˆ์ง€๋ง‰์œผ๋กœ devtool์—์„œ ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๋ƒ„์ƒˆ ...

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค !!! ๋‚˜๋Š” ์ด๊ฒƒ์„ ์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค

์ด ๋ฒˆ์—ญ์€ ์•ฝ๊ฐ„ ์นญ ๊ธ€๋ฆฌ์‹œ์ž…๋‹ˆ๋‹ค .. ์ข€ ์ด์ƒ ํ•ด์š”

์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋Š” ์‰ฝ์ง€ ์•Š์œผ๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ์ƒˆ ๋ฒ„์ „์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๐Ÿ‘
๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ์žฅ์†Œ๋Š” ๋‹ค์Œ ๊ทธ๋ฆผ์ž์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ณ  2px์˜ ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ๋Š” ์ •๋ง ์ต์ˆ™ํ•ด ์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค ๐Ÿธ.

์˜คํ›„์—, ๋‚˜๋Š” ์ž๋™์œผ๋กœ ์ด์ „ ๋ฒ„์ „์˜ ์„œ๋ฉด์œผ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์€ ๋„๊ตฌ ์ผ๋‹ค form ๊ฐ™์€ getFieldDecorator V4์—์„œ ์“ฐ๊ธฐ์—, // github์˜ : HTTPS๋ฅผ. com / AshoneA / antd-form- migration

๋‹ค์Œ์€ 4.0์˜ ๋ณ€๊ฒฝ ๋ฐ ์—…๊ทธ๋ ˆ์ด๋“œ์— ๋Œ€ํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํŽธ์ง‘ ํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋˜ํ•œ ์ข‹์Šต๋‹ˆ๋‹ค. Ant Design 4.0์˜ ๊ณต์‹ ๋ฒ„์ „์— ๋Œ€ํ•œ ์˜ˆ๋น„ ์—ฐ๊ตฌ

๊ตฌ๊ธ€ ๋ฒˆ์—ญ์œผ๋กœ ์ฒœ์ฒœํžˆ ์ฝ์€ ํ›„, ์•„๋ž˜์— ์ค‘๊ตญ์–ด ๋ฒ„์ „์ด ์žˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‚ ๊ตฌ๊ธ€ ๋ฒˆ์—ญ์˜ ํšจ๊ณผ๋Š” ์—ฌ์ „ํžˆ ๊ฝค ์ข‹์Šต๋‹ˆ๋‹ค ...

๋‚˜๋Š” ์ง€๋‚œ 9 ์›” (๊ณต์‹ ํ”„๋กœ์ ํŠธ)์„ ์‚ฌ์šฉํ–ˆ๊ณ  ๋๊นŒ์ง€ ๋”ฐ๋ผ ๊ฐ”๋‹ค.๊ฐ์‚ฌ

@PeiTianHuang์€ ๋จผ์ € ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํƒ€์ผ ๋ฒ”์œ„๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฝ๋‹ˆ ๋‹ค.

์ƒˆํ•ด ์„ ๋ฌผ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ›Œ๋ฅญํ•œ ์ผ์„ํ–ˆ๋‹ค.

image
export default Form.create()(DepartmentModal);
3.0 ์—…๊ทธ๋ ˆ์ด๋“œ, ์ „ ์„ธ๊ณ„์ ์œผ๋กœ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•„์š”์— ๋”ฐ๋ผ ๊ธ€๊ผด ์•„์ด์ฝ˜์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฒˆ๋“ค ํŒŒ์ผ์ด ๋” ์ž‘์•„ ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

SASS ๋“ฑ๊ณผ ๊ฐ™์€ ํ›จ์”ฌ ๋” ๋‚˜์€ ๊ฒƒ์„ ์œ„ํ•ด์ด ๊ธฐํšŒ๋ฅผ ๋œ์–ด์ฃผ์ง€ ์•Š์€ ๊ฒƒ์€ ์Šฌํ”„๋‹ค.
์ด๋Ÿฌํ•œ ํ”„๋กœ UI ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด MUI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋Ÿฐํƒ€์ž„์—์„œ ํ…Œ๋งˆ๋ฅผ ๊ต์ฒด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด react> = 16.8.0์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋Š” 4.0 https://github.com/ant-design/ant-design/issues/12430์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•œ ํ›„ ๋‹ค์‹œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

4.0์—์„œ ์ œ๋Œ€๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ!
์ด ์ƒˆ ๋ฒ„์ „์˜ ๋ชจ๋“  ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•„ ์ˆ˜์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

React์—†์ด Ant Design์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•? ํ‰๋ฒ”ํ•œ CSS

๋กœ์ปฌ ํ…Œ์ŠคํŠธ์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•œ ๋‹ค์Œ react ๋ฐ react-dom์„ 16.9๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค. antd v4๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ๋•Œ
์ผ๋ถ€ ๋‚ด๋ณด๋‚ด๊ธฐ const data = {constant} ์ „์— ๋กœ๊ทธ๋Š” ๊ฐ€์ ธ ์˜ค๊ธฐ ๋˜๋Š” require ์ค‘์— {data : undefined}๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
์›์ธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

form.item์˜ ์ด๋ฆ„ ์†์„ฑ์€ ๋” ์ด์ƒ abc ํ˜•์‹์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ?

@ yoyo837 ์„ธ ์ž…, ๋ณด์ž

const validateMessages = {
  required: "'${name}' ๆ˜ฏๅฟ…้€‰ๅญ—ๆฎต",
  // ...
};

์ด $ {name}์— ์–ด๋–ค ๊ฐ’์„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ถ•๊ดด์— ์‹คํŒจํ•œ ์‚ฌ๋žŒ?
๋†๋‹ด + ํšจ์†Œ์˜ <Collapse/> <Collapse.Panel> ๋Š” ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์„ ์ค€๋‹ค :

TypeError: (0 , _insertCss.insertCss) is not a function
  in IconReact (created by ForwardRef(AntdIcon))
        in span (created by ForwardRef(AntdIcon))
        in ForwardRef(AntdIcon) (created by ForwardRef(RightOutlined))
        in ForwardRef(RightOutlined) (created by CollapsePanel)
        in div (created by CollapsePanel)
        in div (created by CollapsePanel)
        in CollapsePanel (created by Context.Consumer)
        in CollapsePanel (created by Collapse)
        in div (created by Collapse)
        in Collapse (created by Context.Consumer)
        in Collapse (created by Collapse)

/@ant-design/icons/lib/utils.js:110:32

22328์ด ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? rtl.less๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Cascader ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ด€๋ จ๋œ ํŒจํ‚ค์ง• ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์‹ ๊ณ  ํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์ฃ„์†กํ•˜์ง€๋งŒ ๋ฌธ์ œ ์ œ์ž‘์ž๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜๋Š” ๋ฐ ํฐ ์–ด๋ ค์›€์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Input.password๋Š” ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

4.0 ํ…Œ์ด๋ธ” ๊ฐ€์ƒ ์Šคํฌ๋กค๋ง ์—ด์ด ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?๊ณต์‹ ์›น ์‚ฌ์ดํŠธ ์˜ˆ์— ๋”ฐ๋ฅด๋ฉด ๊ณ ์ • ์—ด์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

npm ํŒจํ‚ค์ง€๊ฐ€ 4.0์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋Š”์‹œ๊ธฐ์— ๋Œ€ํ•ด ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@DenisMirandaJ ์ด๋ฏธ

@stolenng ํšจ์†Œ๊ฐ€ ํ›„ํฌ๋ฅผ ์™„์ „ํžˆ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/enzymejs/enzyme/issues/2011 ์ฐธ์กฐ

antd4์˜ ๋ชจ๋“  ํŒ์—… ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ IE๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
IE11์—์„œ โ‘  ๋™๊ฒฐ, โ‘ก ํ•œ ๋ฒˆ ๊นœ๋ฐ•์ž„
https://ant.design/components/dropdown-cn/

์ƒˆ๋กœ์šด CRA ๊ฐœ๋ฏธ ๋””์ž์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋‚ด ๋ฌธ์ œ๋Š” ๋‚ด ์‚ฌ์šฉ์ž ์ •์˜์™€ ํ•จ๊ป˜ ์ ๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  SASS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ๊ฐ€ ๋” ์ด์ƒ ๋ณด์ด์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? v3 ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ๊ฐ€ ๋” ์ด์ƒ ๋ณด์ด์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? v3 ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@zombieJ

์ˆ˜๊ณ  ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
๋‚ด ๊ธฐ๋Šฅ์—์„œ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
if (! err) {
this.props.history.push ( '/');
}
ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค!
๐Ÿ‘

antd3.0์„ antd4.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋ฉ”๋‰ด ๋ฐ”์˜ ์•„์ด์ฝ˜์ด ๋™์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์–ด ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„ ์›๋ž˜ ์•„์ด์ฝ˜์ด ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํƒ์ƒ‰ ๋ฐ”๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐฉ๋ฒ•์ด ์—†์Œ 3.0 ๊ธ€๊ผด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ scriptUrl์ด ์žˆ๋‚˜์š”? ์ง€๊ธˆ ์›ํ™œํ•˜๊ฒŒ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

antd4. * next.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๊ตญ์–ด ์–ธ์–ด ํŒŒ์ผ๋กœ๋“œ
./node_modules/antd/lib/locale/et_EE.d.ts 1 : 8
๋ชจ๋“ˆ ๊ตฌ๋ฌธ ๋ถ„์„ ์‹คํŒจ : ์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ† ํฐ (1 : 8)
์ด ํŒŒ์ผ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์ ์ ˆํ•œ ๋กœ๋”๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const _default ์„ ์–ธ : {
| ๋กœ์ผ€์ผ : ๋ฌธ์ž์—ด;
| ํŽ˜์ด์ง€ ๋งค๊น€ : ์ž„์˜;
์ด ์œ ํ˜•์˜ ๋งŽ์€ ์˜ค๋ฅ˜

ํ˜•์ œ ์—ฌ๋Ÿฌ๋ถ„, antd ๋ฒ„์ „์„ 4.1.3์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•œ ํ›„ ์‹œ๊ฐ„ ์„ ํƒ๊ธฐ๊ฐ€ IE11์—์„œ ์˜ค๋ฅ˜๋ฅผ๋ณด๊ณ ํ•˜๊ณ  ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ ๋  ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ?

ํ˜•์ œ ์—ฌ๋Ÿฌ๋ถ„, antd ๋ฒ„์ „์„ 4.1.3์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•œ ํ›„ ์‹œ๊ฐ„ ์„ ํƒ๊ธฐ๊ฐ€ IE11์—์„œ ์˜ค๋ฅ˜๋ฅผ๋ณด๊ณ ํ•˜๊ณ  ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ ๋  ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ?

์ •ํ™•ํžˆ ๋งํ•˜๋ฉด DatePicker ๋ฐ RangePicker

IE์™€์˜ ํ˜ธํ™˜์ด ํ•„์š”ํ•œ ํ˜•์ œ๋Š” ์กฐ์‹ฌํ•˜์„ธ์š”

next.js๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋Š”์‹œ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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