diff --git a/.prettierignore b/.prettierignore
index 5676463006..329a7f4e28 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,4 +1,8 @@
+**/*.png
**/*.svg
+CODEOWNERS
+.dockerignore
+Dockerfile.ui-test
package.json
.umi
.umi-production
@@ -17,6 +21,8 @@ yarn-error.log
*.snap
components/*/*.js
components/*/*.jsx
+components/*/*.md
+docs/**/*.md
.gitignore
.npmignore
.prettierignore
diff --git a/CHANGELOG.en-US.md b/CHANGELOG.en-US.md
index 1796557dd9..12d134dc76 100644
--- a/CHANGELOG.en-US.md
+++ b/CHANGELOG.en-US.md
@@ -15,6 +15,42 @@ timeline: true
---
+## 4.7.2
+
+`2020-10-19`
+
+- 💄 Fix Layout.Sider `light` theme lost styles. [#27227](https://github.com/ant-design/ant-design/pull/27227) [@lingjieee](https://github.com/lingjieee)
+- 💄 Fix TextArea wrapped with additional div when `showCount` is `false`, and pass `className` and `style` to outer wrapper when `showCount` is `true`. [#27216](https://github.com/ant-design/ant-design/pull/27216)
+- 🐞 Fix Checkbox.Group TS2559 error. [#27231](https://github.com/ant-design/ant-design/pull/27231)
+
+## 4.7.1
+
+`2020-10-18`
+
+- DatePicker
+ - 🐞 Fix DatePicker don't work correctly when `showTime` is `true` and `format` is function. [#27156](https://github.com/ant-design/ant-design/pull/27156)
+ - 💄 Fix DatePicker wrong animation direction when auto overflow. [#27101](https://github.com/ant-design/ant-design/pull/27101)
+- Typography
+ - 💄 Fix Typography miss `pre` and `blockquote` style. [#27150](https://github.com/ant-design/ant-design/pull/27150)
+ - 🐞 Fix Typography.Link hover color. [#27119](https://github.com/ant-design/ant-design/pull/27119)
+ - 🐞 Fix Typography.Link hover color when type is danger. [#27104](https://github.com/ant-design/ant-design/pull/27104)
+- 💄 Fix Descriptions `ant-descriptions-item-content` and add style `word-break:break-word;`. [#27195](https://github.com/ant-design/ant-design/pull/27195) [@WLyKan](https://github.com/WLyKan)
+- 🐞 Fix clear Password value attribute in controlled mode. [#27191](https://github.com/ant-design/ant-design/pull/27191)
+- 🐞 Optimize Notification width in small screen. [#27189](https://github.com/ant-design/ant-design/pull/27189)
+- 🐞 Fix Cascader className duplicate. [#27187](https://github.com/ant-design/ant-design/pull/27187) [@huntdream](https://github.com/huntdream)
+- 🐞 Fix the issue that the Drawer will trigger form submit. [#27175](https://github.com/ant-design/ant-design/pull/27175)
+- 🐞 Fix Dropdown icon missing margin. [#27165](https://github.com/ant-design/ant-design/pull/27165)
+- 💄 Fix Layout.Sider `collapsedWidth` cannot work without modifying `@menu-collapsed-width`. [#27154](https://github.com/ant-design/ant-design/pull/27154)
+- 🐞 Fix Tabs `animated={true}` not working for panels. [#27145](https://github.com/ant-design/ant-design/pull/27145)
+- 🐞 Fix Divider color when contains text. [#27134](https://github.com/ant-design/ant-design/pull/27134)
+- 💄 Fix the cursor style when the Radio option is selected and disabled. [#27125](https://github.com/ant-design/ant-design/pull/27125)
+- 🇪🇸 Add missing translations in es_ES. [#27079](https://github.com/ant-design/ant-design/pull/27079) [@gersongams](https://github.com/gersongams)
+- RTL
+ - 💄 Optimize the style of Input.TextArea character count in RTL mode. [#27098](https://github.com/ant-design/ant-design/pull/27098)
+- TypeScript
+ - 🤖 Button shape remove undeclared doc type. [#27159](https://github.com/ant-design/ant-design/pull/27159)
+ - 🤖 Add optional `rules` property into `FormListProps`. [#27164](https://github.com/ant-design/ant-design/pull/27164) [@huntdream](https://github.com/huntdream)
+
## 4.7.0
`2020-10-10`
@@ -35,7 +71,7 @@ timeline: true
- 🆕 Table `sticky` now support `getContainer`. [#26973](https://github.com/ant-design/ant-design/pull/26973)
- 🐞 Fix Table should not render dropdown filter icon when filterDropdown is `undefined`. [#27002](https://github.com/ant-design/ant-design/pull/27002) [@shangyilim](https://github.com/shangyilim)
- Modal
- - 🛠 Refactor Modal animation code so that it will remove all dom element when closed. [#26940](https://github.com/ant-design/ant-design/pull/26940)
+ - 🛠 Refactor Modal animation code so that it will remove all dom element by `destroyOnClose` when closed. [#26940](https://github.com/ant-design/ant-design/pull/26940)
- 🆕 Modal add `modalRender` prop which can be used for draggable dialog. [#26507](https://github.com/ant-design/ant-design/pull/26507) [@jhoneybee](https://github.com/jhoneybee)
- 🆕 Space add `split` prop. [#26948](https://github.com/ant-design/ant-design/pull/26948)
- 🆕 Image `preview` prop now support `visible` and `onVisibleChange`. [#26915](https://github.com/ant-design/ant-design/pull/26915)
diff --git a/CHANGELOG.zh-CN.md b/CHANGELOG.zh-CN.md
index 170aed71a9..49b78dd9fe 100644
--- a/CHANGELOG.zh-CN.md
+++ b/CHANGELOG.zh-CN.md
@@ -15,6 +15,42 @@ timeline: true
---
+## 4.7.2
+
+`2020-10-19`
+
+- 💄 修复 Layout.Sider `light` 主题失效问题。[#27227](https://github.com/ant-design/ant-design/pull/27227) [@lingjieee](https://github.com/lingjieee)
+- 💄 修复 TextArea 没有设置 `showCount` 时仍然会包裹 div 的问题,同时解决 `showCount` 下 `className` 和 `style` 没有传递给最外层节点的问题。[#27216](https://github.com/ant-design/ant-design/pull/27216)
+- 🐞 修复 Checkbox.Group TS2559 错误。[#27231](https://github.com/ant-design/ant-design/pull/27231)
+
+## 4.7.1
+
+`2020-10-18`
+
+- DatePicker
+ - 🐞 修复 DatePicker `showTime` 为 `true` 并且 `format` 为一个函数时报错的问题。[#27156](https://github.com/ant-design/ant-design/pull/27156)
+ - 💄 修复 DatePicker 在下拉空间不足时的动画方向问题。[#27101](https://github.com/ant-design/ant-design/pull/27101)
+- Typography
+ - 💄 修复 Typography 没有 `pre` 和 `blockquote` 样式的问题。[#27150](https://github.com/ant-design/ant-design/pull/27150)
+ - 🐞 修复 Typography.Link 悬浮颜色错误的问题。[#27119](https://github.com/ant-design/ant-design/pull/27119)
+ - 🐞 修复 Typography.Link 危险类型的悬浮颜色问题。[#27104](https://github.com/ant-design/ant-design/pull/27104)
+- 💄 修复 Descriptions 组件的内容含有超长数字时无法换行的问题。[#27195](https://github.com/ant-design/ant-design/pull/27195) [@WLyKan](https://github.com/WLyKan)
+- 🐞 修复 Password 在受控模式下未清除 `value` 属性的问题。[#27191](https://github.com/ant-design/ant-design/pull/27191)
+- 🐞 修复 Notification 在小尺寸屏幕下的宽度问题。[#27189](https://github.com/ant-design/ant-design/pull/27189)
+- 🐞 修复 Cascader 类名重复的问题。[#27187](https://github.com/ant-design/ant-design/pull/27187) [@huntdream](https://github.com/huntdream)
+- 🐞 修复 Drawer 会触发 Form 提交事件的问题。[#27175](https://github.com/ant-design/ant-design/pull/27175)
+- 🐞 修复 Dropdown 下拉菜单图标间距丢失的问题。[#27165](https://github.com/ant-design/ant-design/pull/27165)
+- 💄 修复 Layout.Sider 指定 `collapsedWidth` 后侧边菜单部分宽度不对的问题。[#27154](https://github.com/ant-design/ant-design/pull/27154)
+- 🐞 修复 Tabs `animated` 属性为 `true` 时未开启内容切换动画的问题。[#27145](https://github.com/ant-design/ant-design/pull/27145)
+- 🐞 修复 Divider 带标题时的分割线颜色。[#27134](https://github.com/ant-design/ant-design/pull/27134)
+- 💄 修复 Radio 选项选中并禁用时的鼠标样式。[#27125](https://github.com/ant-design/ant-design/pull/27125)
+- 🇪🇸 为西班牙语 es_ES 中添加缺少的翻译。[#27079](https://github.com/ant-design/ant-design/pull/27079) [@gerongams](https://github.com/gersongams)
+- RTL
+ - 💄 优化 Input.TextArea 字数提示在 RTL 模式下的样式。[#27098](https://github.com/ant-design/ant-design/pull/27098)
+- TypeScript
+ - 🤖 Button `shape` 移除文档中未声明的类型。[#27159](https://github.com/ant-design/ant-design/pull/27159)
+ - 🤖 修复 Form.List `rules` 属性缺失的问题。[#27164](https://github.com/ant-design/ant-design/pull/27164) [@huntdream](https://github.com/huntdream)
+
## 4.7.0
`2020-10-10`
@@ -35,7 +71,7 @@ timeline: true
- 🆕 Table `sticky` 支持 `getContainer` 以指定滚动容器。[#26973](https://github.com/ant-design/ant-design/pull/26973)
- 🐞 修复 Table `column.filterDropdown` 为 `undefined` 时依旧会展示筛选菜单的问题。[#27002](https://github.com/ant-design/ant-design/pull/27002) [@shangyilim](https://github.com/shangyilim)
- Modal
- - 🛠 重构 Modal 组件动画,现在关闭时将完全清理相关 Dom 节点。[#26940](https://github.com/ant-design/ant-design/pull/26940)
+ - 🛠 重构 Modal 组件动画,现在 `destroyOnClose` 关闭时将完全清理相关 Dom 节点。[#26940](https://github.com/ant-design/ant-design/pull/26940)
- 🆕 Modal 新增 `modalRender` 属性,支持可拖拽的对话框。[#26507](https://github.com/ant-design/ant-design/pull/26507) [@jhoneybee](https://github.com/jhoneybee)
- 🆕 Space 增加 `split` 属性以支持分隔符间隔。[#26948](https://github.com/ant-design/ant-design/pull/26948)
- 🆕 Image `preview` 属性扩展支持 `visible` 和 `onVisibleChange`。[#26915](https://github.com/ant-design/ant-design/pull/26915)
@@ -326,7 +362,7 @@ timeline: true
- 🐞 修复 Form 垂直布局时 Form.Item 设置 `labelCol={{ offset: number }}` 不生效的问题。[#25713](https://github.com/ant-design/ant-design/pull/25713) [@zhangchen915](https://github.com/zhangchen915)
- ⌨️ Form 错误信息节点增加属性 `role="alert"` 以增强可访问性。[#25735](https://github.com/ant-design/ant-design/pull/25735) [@AlbertAZ1992](https://github.com/AlbertAZ1992)
- Calendar
- - 🐞 修复 Calendar 组件的 `validRange` 导致 `disabledDate` 不生效 。[#25626](https://github.com/ant-design/ant-design/pull/25626) [@zhangchen915](https://github.com/zhangchen915)
+ - 🐞 修复 Calendar 组件的 `validRange` 导致 `disabledDate` 不生效。[#25626](https://github.com/ant-design/ant-design/pull/25626) [@zhangchen915](https://github.com/zhangchen915)
- 🐞 修复 Calendar `validRange` 对月份下拉菜单不生效的问题。[#25626](https://github.com/ant-design/ant-design/pull/25626) [@zhangchen915](https://github.com/zhangchen915)
- 🐞 修复 Table `getCheckboxProps` 返回的 `indeterminate` 不生效。[#25649](https://github.com/ant-design/ant-design/pull/25649)
- 🐞 修复 Select 清除按钮在 Form.Item 下位置不对的问题。[#25728](https://github.com/ant-design/ant-design/pull/25728)
diff --git a/README-zh_CN.md b/README-zh_CN.md
index 51359f393a..c0f5062967 100644
--- a/README-zh_CN.md
+++ b/README-zh_CN.md
@@ -10,7 +10,6 @@
一套企业级 UI 设计语言和 React 组件库。
-
[![CircleCI status][circleci-image]][circleci-url] [![CI status][github-action-image]][github-action-url] [![codecov][codecov-image]][codecov-url] [![NPM version][npm-image]][npm-url] [![NPM downloads][download-image]][download-url]
[![david deps][david-image]][david-url] [![david devDeps][david-dev-image]][david-dev-url] [![Total alerts][lgtm-image]][lgtm-url] [![FOSSA Status][fossa-image]][fossa-url] [![Issues need help][help-wanted-image]][help-wanted-url]
diff --git a/SECURITY.md b/SECURITY.md
index f707d665a7..b751c38389 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,8 +2,7 @@
## Supported Versions
-Use this section to tell people about which versions of your project are
-currently being supported with security updates.
+Use this section to tell people about which versions of your project are currently being supported with security updates.
| Version | Supported |
| ------- | ------------------ |
@@ -14,6 +13,4 @@ currently being supported with security updates.
Use this section to tell people how to report a vulnerability.
-Tell them where to go, how often they can expect to get an update on a
-reported vulnerability, what to expect if the vulnerability is accepted or
-declined, etc.
+Tell them where to go, how often they can expect to get an update on a reported vulnerability, what to expect if the vulnerability is accepted or declined, etc.
diff --git a/components/_util/hooks/useCombinedRefs.tsx b/components/_util/hooks/useCombinedRefs.tsx
new file mode 100644
index 0000000000..d1ea07de2e
--- /dev/null
+++ b/components/_util/hooks/useCombinedRefs.tsx
@@ -0,0 +1,19 @@
+import * as React from 'react';
+import { fillRef } from '../ref';
+
+function useCombinedRefs(
+ ...refs: Array | ((instance: T) => void) | null>
+) {
+ const targetRef = React.useRef();
+
+ React.useEffect(() => {
+ refs.forEach(ref => {
+ if (!ref) return;
+ fillRef(ref, targetRef.current);
+ });
+ }, [refs]);
+
+ return targetRef;
+}
+
+export default useCombinedRefs;
diff --git a/components/affix/index.en-US.md b/components/affix/index.en-US.md
index 0d308594cb..9d903b4753 100644
--- a/components/affix/index.en-US.md
+++ b/components/affix/index.en-US.md
@@ -19,8 +19,8 @@ Please note that Affix should not cover other content on the page, especially wh
| --- | --- | --- | --- |
| offsetBottom | Offset from the bottom of the viewport (in pixels) | number | - |
| offsetTop | Offset from the top of the viewport (in pixels) | number | 0 |
-| onChange | Callback for when Affix state is changed | function(affixed) | - |
| target | Specifies the scrollable area DOM node | () => HTMLElement | () => window |
+| onChange | Callback for when Affix state is changed | function(affixed) | - |
**Note:** Children of `Affix` must not have the property `position: absolute`, but you can set `position: absolute` on `Affix` itself:
diff --git a/components/affix/index.zh-CN.md b/components/affix/index.zh-CN.md
index e053e73c27..22bdacd8bb 100644
--- a/components/affix/index.zh-CN.md
+++ b/components/affix/index.zh-CN.md
@@ -20,8 +20,8 @@ cover: https://gw.alipayobjects.com/zos/alicdn/tX6-md4H6/Affix.svg
| --- | --- | --- | --- |
| offsetBottom | 距离窗口底部达到指定偏移量后触发 | number | - |
| offsetTop | 距离窗口顶部达到指定偏移量后触发 | number | - |
-| onChange | 固定状态改变时触发的回调函数 | function(affixed) | - |
| target | 设置 `Affix` 需要监听其滚动事件的元素,值为一个返回对应 DOM 元素的函数 | () => HTMLElement | () => window |
+| onChange | 固定状态改变时触发的回调函数 | function(affixed) | - |
**注意:**`Affix` 内的元素不要使用绝对定位,如需要绝对定位的效果,可以直接设置 `Affix` 为绝对定位:
diff --git a/components/alert/index.en-US.md b/components/alert/index.en-US.md
index 9ebb00e6c1..52383692b9 100644
--- a/components/alert/index.en-US.md
+++ b/components/alert/index.en-US.md
@@ -29,7 +29,7 @@ Alert component for feedback.
### Alert.ErrorBoundary
-| Property | Description | Type | Default | Version |
-| ----------- | -------------------------------- | --------- | ----------------- | ------- |
-| message | Custom error message to show | ReactNode | {{ error }} | |
-| description | Custom error description to show | ReactNode | {{ error stack }} | |
+| Property | Description | Type | Default | Version |
+| --- | --- | --- | --- | --- |
+| description | Custom error description to show | ReactNode | {{ error stack }} | |
+| message | Custom error message to show | ReactNode | {{ error }} | |
diff --git a/components/alert/index.zh-CN.md b/components/alert/index.zh-CN.md
index c5fb7294cb..cbbd7288fd 100644
--- a/components/alert/index.zh-CN.md
+++ b/components/alert/index.zh-CN.md
@@ -32,5 +32,5 @@ cover: https://gw.alipayobjects.com/zos/alicdn/8emPa3fjl/Alert.svg
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| message | 自定义错误标题,如果未指定会展示原生报错信息 | ReactNode | {{ error }} | |
| description | 自定义错误内容,如果未指定会展示报错堆栈 | ReactNode | {{ error stack }} | |
+| message | 自定义错误标题,如果未指定会展示原生报错信息 | ReactNode | {{ error }} | |
diff --git a/components/anchor/index.en-US.md b/components/anchor/index.en-US.md
index ce30064c3c..88cd56c209 100644
--- a/components/anchor/index.en-US.md
+++ b/components/anchor/index.en-US.md
@@ -21,17 +21,17 @@ For displaying anchor hyperlinks on page and jumping between them.
| affix | Fixed mode of Anchor | boolean | true | |
| bounds | Bounding distance of anchor area | number | 5 | |
| getContainer | Scrolling container | () => HTMLElement | () => window | |
+| getCurrentAnchor | Customize the anchor highlight | () => string | - | |
| offsetTop | Pixels to offset from top when calculating position of scroll | number | 0 | |
| showInkInFixed | Whether show ink-balls when `affix={false}` | boolean | false | |
-| onClick | Set the handler to handle `click` event | function(e: Event, link: Object) | - | |
-| getCurrentAnchor | Customize the anchor highlight | () => string | - | |
| targetOffset | Anchor scroll offset, default as `offsetTop`, [example](#components-anchor-demo-targetOffset) | number | - | |
| onChange | Listening for anchor link change | (currentActiveLink: string) => void | | |
+| onClick | Set the handler to handle `click` event | function(e: Event, link: Object) | - | |
### Link Props
-| Property | Description | Type | Default | Version |
-| -------- | ----------------------------------------- | --------- | ------- | ------- |
-| href | The target of hyperlink | string | | |
-| title | The content of hyperlink | ReactNode | | |
-| target | Specifies where to display the linked URL | string | | |
+| Property | Description | Type | Default | Version |
+| --- | --- | --- | --- | --- |
+| href | The target of hyperlink | string | | |
+| target | Specifies where to display the linked URL | string | | |
+| title | The content of hyperlink | ReactNode | | |
diff --git a/components/anchor/index.zh-CN.md b/components/anchor/index.zh-CN.md
index fdd0b2bfc7..e23d113489 100644
--- a/components/anchor/index.zh-CN.md
+++ b/components/anchor/index.zh-CN.md
@@ -22,17 +22,17 @@ cover: https://gw.alipayobjects.com/zos/alicdn/_1-C1JwsC/Anchor.svg
| affix | 固定模式 | boolean | true | |
| bounds | 锚点区域边界 | number | 5 | |
| getContainer | 指定滚动的容器 | () => HTMLElement | () => window | |
+| getCurrentAnchor | 自定义高亮的锚点 | () => string | - | |
| offsetTop | 距离窗口顶部达到指定偏移量后触发 | number | | |
| showInkInFixed | `affix={false}` 时是否显示小圆点 | boolean | false | |
-| onClick | `click` 事件的 handler | function(e: Event, link: Object) | - | |
-| getCurrentAnchor | 自定义高亮的锚点 | () => string | - | |
| targetOffset | 锚点滚动偏移量,默认与 offsetTop 相同,[例子](#components-anchor-demo-targetOffset) | number | - | |
| onChange | 监听锚点链接改变 | (currentActiveLink: string) => void | - | |
+| onClick | `click` 事件的 handler | function(e: Event, link: Object) | - | |
### Link Props
-| 成员 | 说明 | 类型 | 默认值 | 版本 |
-| ------ | -------------------------------- | --------- | ------ | ---- |
-| href | 锚点链接 | string | - | |
-| title | 文字内容 | ReactNode | - | |
-| target | 该属性指定在何处显示链接的资源。 | string | - | |
+| 成员 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| href | 锚点链接 | string | - | |
+| target | 该属性指定在何处显示链接的资源。 | string | - | |
+| title | 文字内容 | ReactNode | - | |
diff --git a/components/auto-complete/__tests__/__snapshots__/demo.test.js.snap b/components/auto-complete/__tests__/__snapshots__/demo.test.js.snap
index 13886be425..da9038498e 100644
--- a/components/auto-complete/__tests__/__snapshots__/demo.test.js.snap
+++ b/components/auto-complete/__tests__/__snapshots__/demo.test.js.snap
@@ -147,23 +147,19 @@ exports[`renders ./components/auto-complete/demo/custom.md correctly 1`] = `
-
-
-
+
{
it('focus() and onFocus', () => {
const handleFocus = jest.fn();
const wrapper = mount( , { attachTo: container });
- wrapper
- .find('input')
- .instance()
- .focus();
+ wrapper.find('input').instance().focus();
jest.runAllTimers();
expect(handleFocus).toHaveBeenCalled();
});
@@ -35,15 +32,9 @@ describe('AutoComplete children could be focus', () => {
it('blur() and onBlur', () => {
const handleBlur = jest.fn();
const wrapper = mount( , { attachTo: container });
- wrapper
- .find('input')
- .instance()
- .focus();
+ wrapper.find('input').instance().focus();
jest.runAllTimers();
- wrapper
- .find('input')
- .instance()
- .blur();
+ wrapper.find('input').instance().blur();
jest.runAllTimers();
expect(handleBlur).toHaveBeenCalled();
});
diff --git a/components/auto-complete/index.en-US.md b/components/auto-complete/index.en-US.md
index 8c99200bae..8e447c8185 100644
--- a/components/auto-complete/index.en-US.md
+++ b/components/auto-complete/index.en-US.md
@@ -22,30 +22,30 @@ When there is a need for autocomplete functionality.
| children (for customize input element) | Customize input element | HTMLInputElement \| HTMLTextAreaElement \| React.ReactElement<InputProps> | <Input /> | |
| children (for dataSource) | Data source to auto complete | React.ReactElement<OptionProps> \| Array<React.ReactElement<OptionProps>> | - | |
| defaultActiveFirstOption | Whether active first option by default | boolean | true | |
+| defaultOpen | Initial open state of dropdown | boolean | - | |
| defaultValue | Initial selected option | string | - | |
| disabled | Whether disabled select | boolean | false | |
| dropdownClassName | The className of dropdown menu | string | - | |
| dropdownMatchSelectWidth | Determine whether the dropdown menu and the select input are the same width. Default set `min-width` same as input. Will ignore when value less than select width. `false` will disable virtual scroll | boolean \| number | true | |
| filterOption | If true, filter options by input, if function, filter options against it. The function will receive two arguments, `inputValue` and `option`, if the function returns true, the option will be included in the filtered set; Otherwise, it will be excluded | boolean \| function(inputValue, option) | true | |
+| notFoundContent | Specify content to show when no result matches | string | `Not Found` | |
+| open | Controlled open state of dropdown | boolean | - | |
+| options | Select options. Will get better perf than jsx definition | { label, value }\[] | - | |
| placeholder | The placeholder of input | string | - | |
| value | Selected option | string | - | |
| onBlur | Called when leaving the component | function() | - | |
| onChange | Called when select an option or input value change, or value of input is changed | function(value) | - | |
+| onDropdownVisibleChange | Call when dropdown open | function(open) | - | |
| onFocus | Called when entering the component | function() | - | |
| onSearch | Called when searching items | function(value) | - | |
| onSelect | Called when a option is selected. param is option's value and option instance | function(value, option) | - | |
-| defaultOpen | Initial open state of dropdown | boolean | - | |
-| open | Controlled open state of dropdown | boolean | - | |
-| options | Select options. Will get better perf than jsx definition | { label, value }[] | - | |
-| onDropdownVisibleChange | Call when dropdown open | function(open) | - | |
-| notFoundContent | Specify content to show when no result matches | string | `Not Found` | |
## Methods
-| Name | Description | Version |
-| ------- | ------------ | ------- |
-| blur() | Remove focus | |
-| focus() | Get focus | |
+| Name | Description | Version |
+| --- | --- | --- |
+| blur() | Remove focus | |
+| focus() | Get focus | |
## FAQ
diff --git a/components/auto-complete/index.zh-CN.md b/components/auto-complete/index.zh-CN.md
index c7e7a78a21..7e9098d70c 100644
--- a/components/auto-complete/index.zh-CN.md
+++ b/components/auto-complete/index.zh-CN.md
@@ -20,34 +20,34 @@ cover: https://gw.alipayobjects.com/zos/alicdn/qtJm4yt45/AutoComplete.svg
| allowClear | 支持清除, 单选模式有效 | boolean | false | |
| autoFocus | 自动获取焦点 | boolean | false | |
| backfill | 使用键盘选择选项的时候把选中项回填到输入框中 | boolean | false | |
-| children (自定义输入框) | 自定义输入框 | HTMLInputElement \| HTMLTextAreaElement \| React.ReactElement<InputProps> | <Input /> | |
| children (自动完成的数据源) | 自动完成的数据源 | React.ReactElement<OptionProps> \| Array<React.ReactElement<OptionProps>> | - | |
+| children (自定义输入框) | 自定义输入框 | HTMLInputElement \| HTMLTextAreaElement \| React.ReactElement<InputProps> | <Input /> | |
| defaultActiveFirstOption | 是否默认高亮第一个选项 | boolean | true | |
+| defaultOpen | 是否默认展开下拉菜单 | boolean | - | |
| defaultValue | 指定默认选中的条目 | string | - | |
| disabled | 是否禁用 | boolean | false | |
| dropdownClassName | 下拉菜单的 className 属性 | string | - | |
| dropdownMatchSelectWidth | 下拉菜单和选择器同宽。默认将设置 `min-width`,当值小于选择框宽度时会被忽略。false 时会关闭虚拟滚动 | boolean \| number | true | |
| filterOption | 是否根据输入项进行筛选。当其为一个函数时,会接收 `inputValue` `option` 两个参数,当 `option` 符合筛选条件时,应返回 true,反之则返回 false | boolean \| function(inputValue, option) | true | |
| getPopupContainer | 菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位。[示例](https://codesandbox.io/s/4j168r7jw0) | function(triggerNode) | () => document.body | |
+| notFoundContent | 当下拉列表为空时显示的内容 | ReactNode | - | |
+| open | 是否展开下拉菜单 | boolean | - | |
+| options | 数据化配置选项内容,相比 jsx 定义会获得更好的渲染性能 | { label, value }\[] | - | |
| placeholder | 输入框提示 | string | - | |
| value | 指定当前选中的条目 | string | - | |
| onBlur | 失去焦点时的回调 | function() | - | |
| onChange | 选中 option,或 input 的 value 变化时,调用此函数 | function(value) | - | |
+| onDropdownVisibleChange | 展开下拉菜单的回调 | function(open) | - | |
| onFocus | 获得焦点时的回调 | function() | - | |
| onSearch | 搜索补全项的时候调用 | function(value) | - | |
| onSelect | 被选中时调用,参数为选中项的 value 值 | function(value, option) | - | |
-| defaultOpen | 是否默认展开下拉菜单 | boolean | - | |
-| open | 是否展开下拉菜单 | boolean | - | |
-| options | 数据化配置选项内容,相比 jsx 定义会获得更好的渲染性能 | { label, value }[] | - | |
-| onDropdownVisibleChange | 展开下拉菜单的回调 | function(open) | - | |
-| notFoundContent | 当下拉列表为空时显示的内容 | ReactNode | - | |
## 方法
-| 名称 | 描述 | 版本 |
-| ------- | -------- | ---- |
-| blur() | 移除焦点 | |
-| focus() | 获取焦点 | |
+| 名称 | 描述 | 版本 |
+| --- | --- | --- |
+| blur() | 移除焦点 | |
+| focus() | 获取焦点 | |
## FAQ
diff --git a/components/avatar/index.en-US.md b/components/avatar/index.en-US.md
index 31db6d84a8..c6e46f451a 100644
--- a/components/avatar/index.en-US.md
+++ b/components/avatar/index.en-US.md
@@ -13,21 +13,21 @@ Avatars can be used to represent people or objects. It supports images, `Icon`s,
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
+| alt | This attribute defines the alternative text describing the image | string | - | |
+| gap | Letter type unit distance between left and right sides | number | 4 | 4.3.0 |
| icon | Custom icon type for an icon avatar | ReactNode | - | |
| shape | The shape of avatar | `circle` \| `square` | `circle` | |
| size | The size of the avatar | number \| `large` \| `small` \| `default` \| `{ xs: number, sm: number, ...}` | `default` | 4.7.0 |
| src | The address of the image for an image avatar | string | - | |
| srcSet | A list of sources to use for different screen resolutions | string | - | |
-| alt | This attribute defines the alternative text describing the image | string | - | |
| onError | Handler when img load error, return false to prevent default fallback behavior | () => boolean | - | |
-| gap | Letter type unit distance between left and right sides | number | 4 | 4.3.0 |
> Tip: You can set `icon` or `children` as the fallback for image load error, with the priority of `icon` > `children`
### Avatar.Group (4.5.0+)
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| ------------------- | -------------------------------------- | ----------------- | ------ | ---- |
-| maxCount | Max avatars to show | number | - | |
-| maxStyle | The style of excess avatar style | CSSProperties | - | |
-| maxPopoverPlacement | The placement of excess avatar Popover | `top` \| `bottom` | `top` | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| maxCount | Max avatars to show | number | - | |
+| maxPopoverPlacement | The placement of excess avatar Popover | `top` \| `bottom` | `top` | |
+| maxStyle | The style of excess avatar style | CSSProperties | - | |
diff --git a/components/avatar/index.zh-CN.md b/components/avatar/index.zh-CN.md
index 5841856892..0d4f3587f7 100644
--- a/components/avatar/index.zh-CN.md
+++ b/components/avatar/index.zh-CN.md
@@ -10,7 +10,7 @@ cover: https://gw.alipayobjects.com/zos/antfincdn/aBcnbw68hP/Avatar.svg
## 设计师专属
-安装 [Kitchen Sketch 插件 💎](https://kitchen.alipay.com),一键填充高逼格头像和文本.
+安装 [Kitchen Sketch 插件 💎](https://kitchen.alipay.com),一键填充高逼格头像和文本。
## API
@@ -18,21 +18,21 @@ cover: https://gw.alipayobjects.com/zos/antfincdn/aBcnbw68hP/Avatar.svg
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
+| alt | 图像无法显示时的替代文本 | string | - | |
+| gap | 字符类型距离左右两侧边界单位像素 | number | 4 | 4.3.0 |
| icon | 设置头像的自定义图标 | ReactNode | - | |
| shape | 指定头像的形状 | `circle` \| `square` | `circle` | |
| size | 设置头像的大小 | number \| `large` \| `small` \| `default` \| `{ xs: number, sm: number, ...}` | `default` | 4.7.0 |
| src | 图片类头像的资源地址 | string | - | |
| srcSet | 设置图片类头像响应式资源地址 | string | - | |
-| alt | 图像无法显示时的替代文本 | string | - | |
| onError | 图片加载失败的事件,返回 false 会关闭组件默认的 fallback 行为 | () => boolean | - | |
-| gap | 字符类型距离左右两侧边界单位像素 | number | 4 | 4.3.0 |
> Tip:你可以设置 `icon` 或 `children` 作为图片加载失败的默认 fallback 行为,优先级为 `icon` > `children`
### Avatar.Group (4.5.0+)
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| ------------------- | -------------------- | ----------------- | ------ | ---- |
-| maxCount | 显示的最大头像个数 | number | - | |
-| maxStyle | 多余头像样式 | CSSProperties | - | |
-| maxPopoverPlacement | 多余头像气泡弹出位置 | `top` \| `bottom` | `top` | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| maxCount | 显示的最大头像个数 | number | - | |
+| maxPopoverPlacement | 多余头像气泡弹出位置 | `top` \| `bottom` | `top` | |
+| maxStyle | 多余头像样式 | CSSProperties | - | |
diff --git a/components/back-top/index.en-US.md b/components/back-top/index.en-US.md
index e62514c9b7..6a87a4184e 100644
--- a/components/back-top/index.en-US.md
+++ b/components/back-top/index.en-US.md
@@ -20,7 +20,7 @@ cover: https://gw.alipayobjects.com/zos/alicdn/tJZ5jbTwX/BackTop.svg
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
+| duration | Time to return to top(ms) | number | 450 | 4.4.0 |
| target | Specifies the scrollable area dom node | () => HTMLElement | () => window | |
| visibilityHeight | The BackTop button will not show until the scroll height reaches this value | number | 400 | |
| onClick | A callback function, which can be executed when you click the button | function | - | |
-| duration | Time to return to top(ms) | number | 450 | 4.4.0 |
diff --git a/components/back-top/index.zh-CN.md b/components/back-top/index.zh-CN.md
index fa08ded7ba..7b112dbecc 100644
--- a/components/back-top/index.zh-CN.md
+++ b/components/back-top/index.zh-CN.md
@@ -21,7 +21,7 @@ cover: https://gw.alipayobjects.com/zos/alicdn/tJZ5jbTwX/BackTop.svg
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
+| duration | 回到顶部所需时间(ms) | number | 450 | 4.4.0 |
| target | 设置需要监听其滚动事件的元素,值为一个返回对应 DOM 元素的函数 | () => HTMLElement | () => window | |
| visibilityHeight | 滚动高度达到此参数值才出现 BackTop | number | 400 | |
| onClick | 点击按钮的回调函数 | function | - | |
-| duration | 回到顶部所需时间(ms) | number | 450 | 4.4.0 |
diff --git a/components/badge/index.en-US.md b/components/badge/index.en-US.md
index 8035dcaa15..0e86abcfbb 100644
--- a/components/badge/index.en-US.md
+++ b/components/badge/index.en-US.md
@@ -23,8 +23,8 @@ Badge normally appears in proximity to notifications or user avatars with eye-ca
| offset | Set offset of the badge dot | \[number, number] | - | |
| overflowCount | Max count to show | number | 99 | |
| showZero | Whether to show badge when `count` is zero | boolean | false | |
-| status | Set Badge as a status dot | `success` \| `processing` \| `default` \| `error` \| `warning` | - | |
| size | If `count` is set, `size` sets the size of badge | `default` \| `small` | - | 4.6.0 |
+| status | Set Badge as a status dot | `success` \| `processing` \| `default` \| `error` \| `warning` | - | |
| text | If `status` is set, `text` sets the display text of the status `dot` | ReactNode | - | |
| title | Text to show when hovering over the badge | string | - | |
diff --git a/components/badge/index.zh-CN.md b/components/badge/index.zh-CN.md
index 3aa267c533..00dd75ba1d 100644
--- a/components/badge/index.zh-CN.md
+++ b/components/badge/index.zh-CN.md
@@ -24,8 +24,8 @@ cover: https://gw.alipayobjects.com/zos/antfincdn/6%26GF9WHwvY/Badge.svg
| offset | 设置状态点的位置偏移 | \[number, number] | - | |
| overflowCount | 展示封顶的数字值 | number | 99 | |
| showZero | 当数值为 0 时,是否展示 Badge | boolean | false | |
-| status | 设置 Badge 为状态点 | `success` \| `processing` \| `default` \| `error` \| `warning` | - | |
| size | 在设置了 `count` 的前提下有效,设置小圆点的大小 | `default` \| `small` | - | 4.6.0 |
+| status | 设置 Badge 为状态点 | `success` \| `processing` \| `default` \| `error` \| `warning` | - | |
| text | 在设置了 `status` 的前提下有效,设置状态点的文本 | ReactNode | - | |
| title | 设置鼠标放在状态点上时显示的文字 | string | - | |
diff --git a/components/breadcrumb/__tests__/router.test.js b/components/breadcrumb/__tests__/router.test.js
index 86b8643b69..d06c7d5596 100644
--- a/components/breadcrumb/__tests__/router.test.js
+++ b/components/breadcrumb/__tests__/router.test.js
@@ -72,23 +72,12 @@ describe('react router', () => {
,
);
expect(wrapper.find('BreadcrumbItem').length).toBe(1);
- expect(
- wrapper
- .find('BreadcrumbItem .ant-breadcrumb-link')
- .at(0)
- .text(),
- ).toBe('Home');
- wrapper
- .find('.demo-nav a')
- .at(1)
- .simulate('click');
+ expect(wrapper.find('BreadcrumbItem .ant-breadcrumb-link').at(0).text()).toBe('Home');
+ wrapper.find('.demo-nav a').at(1).simulate('click');
expect(wrapper.find('BreadcrumbItem').length).toBe(2);
- expect(
- wrapper
- .find('BreadcrumbItem .ant-breadcrumb-link')
- .at(1)
- .text(),
- ).toBe('Application List');
+ expect(wrapper.find('BreadcrumbItem .ant-breadcrumb-link').at(1).text()).toBe(
+ 'Application List',
+ );
});
it('react router 3', () => {
diff --git a/components/breadcrumb/index.en-US.md b/components/breadcrumb/index.en-US.md
index 96b2be6417..b0f85401b8 100644
--- a/components/breadcrumb/index.en-US.md
+++ b/components/breadcrumb/index.en-US.md
@@ -30,14 +30,14 @@ A breadcrumb displays the current location within a hierarchy. It allows going b
| --- | --- | --- | --- | --- |
| dropdownProps | The dropdown props | [Dropdown](/components/dropdown) | - | |
| href | Target of hyperlink | string | - | |
-| onClick | Set the handler to handle click event | (e:MouseEvent) => void | - | |
| overlay | The dropdown menu | [Menu](/components/menu) \| () => Menu | - | |
+| onClick | Set the handler to handle click event | (e:MouseEvent) => void | - | |
### Breadcrumb.Separator
-| Property | Description | Type | Default | Version |
-| -------- | ---------------- | --------- | ------- | ------- |
-| children | Custom separator | ReactNode | `/` | |
+| Property | Description | Type | Default | Version |
+| --- | --- | --- | --- | --- |
+| children | Custom separator | ReactNode | `/` | |
> When using `Breadcrumb.Separator`,its parent component must be set to `separator=""`, otherwise the default separator of the parent component will appear.
diff --git a/components/breadcrumb/index.zh-CN.md b/components/breadcrumb/index.zh-CN.md
index f26357d6c0..1188328a84 100644
--- a/components/breadcrumb/index.zh-CN.md
+++ b/components/breadcrumb/index.zh-CN.md
@@ -31,14 +31,14 @@ cover: https://gw.alipayobjects.com/zos/alicdn/9Ltop8JwH/Breadcrumb.svg
| --- | --- | --- | --- | --- |
| dropdownProps | 弹出下拉菜单的自定义配置 | [Dropdown](/components/dropdown) | - | |
| href | 链接的目的地 | string | - | |
-| onClick | 单击事件 | (e:MouseEvent) => void | - | |
| overlay | 下拉菜单的内容 | [Menu](/components/menu) \| () => Menu | - | |
+| onClick | 单击事件 | (e:MouseEvent) => void | - | |
### Breadcrumb.Separator
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| -------- | -------------- | --------- | ------ | ---- |
-| children | 要显示的分隔符 | ReactNode | `/` | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| children | 要显示的分隔符 | ReactNode | `/` | |
> 注意:在使用 `Breadcrumb.Separator` 时,其父组件的分隔符必须设置为 `separator=""`,否则会出现父组件默认的分隔符。
diff --git a/components/button/__tests__/__snapshots__/demo.test.ts.snap b/components/button/__tests__/__snapshots__/demo.test.ts.snap
index 13ef0e9e33..488c8e01a1 100644
--- a/components/button/__tests__/__snapshots__/demo.test.ts.snap
+++ b/components/button/__tests__/__snapshots__/demo.test.ts.snap
@@ -976,34 +976,43 @@ Array [
secondary
,
-
-
- Actions
-
-
-
+ Actions
+
+
+
+
-
-
-
- ,
+
+
+
+
+
+ ,
]
`;
diff --git a/components/button/button.tsx b/components/button/button.tsx
index be92508966..9288fb4f42 100644
--- a/components/button/button.tsx
+++ b/components/button/button.tsx
@@ -74,7 +74,7 @@ function spaceChildren(children: React.ReactNode, needInserted: boolean) {
const ButtonTypes = tuple('default', 'primary', 'ghost', 'dashed', 'link', 'text');
export type ButtonType = typeof ButtonTypes[number];
-const ButtonShapes = tuple('circle', 'circle-outline', 'round');
+const ButtonShapes = tuple('circle', 'round');
export type ButtonShape = typeof ButtonShapes[number];
const ButtonHTMLTypes = tuple('submit', 'button', 'reset');
export type ButtonHTMLType = typeof ButtonHTMLTypes[number];
diff --git a/components/button/demo/multiple.md b/components/button/demo/multiple.md
index a23c846b1a..0c5c8c21cd 100644
--- a/components/button/demo/multiple.md
+++ b/components/button/demo/multiple.md
@@ -7,15 +7,14 @@ title:
## zh-CN
-按钮组合使用时,推荐使用 1 个主操作 + n 个次操作,3 个以上操作时把更多操作放到 `Dropdown.Button` 中组合使用。
+按钮组合使用时,推荐使用 1 个主操作 + n 个次操作,3 个以上操作时把更多操作放到 [Dropdown.Button](/components/dropdown/#components-dropdown-demo-dropdown-button) 中组合使用。
## en-US
-If you need several buttons, we recommend that you use 1 primary button + n secondary buttons, and if there are more than three operations, you can group some of them into `Dropdown.Button`.
+If you need several buttons, we recommend that you use 1 primary button + n secondary buttons, and if there are more than three operations, you can group some of them into [Dropdown.Button](/components/dropdown/#components-dropdown-demo-dropdown-button).
```jsx
import { Button, Menu, Dropdown } from 'antd';
-import { DownOutlined } from '@ant-design/icons';
function handleMenuClick(e) {
console.log('click', e);
@@ -33,11 +32,7 @@ ReactDOM.render(
<>
primary
secondary
-
-
- Actions
-
-
+ Actions
>,
mountNode,
);
diff --git a/components/button/index.en-US.md b/components/button/index.en-US.md
index e1479359e8..af9ddc68fa 100644
--- a/components/button/index.en-US.md
+++ b/components/button/index.en-US.md
@@ -40,11 +40,11 @@ Different button styles can be generated by setting Button properties. The recom
| htmlType | Set the original html `type` of `button`, see: [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-type) | string | `button` | |
| icon | Set the icon component of button | ReactNode | - | |
| loading | Set the loading status of button | boolean \| { delay: number } | false | |
-| onClick | Set the handler to handle `click` event | (event) => void | - | |
-| shape | Can be set to `circle`, `round` or omitted | string | - | |
+| shape | Can be set button shape | `circle` \| `round` | - | |
| size | Set the size of button | `large` \| `middle` \| `small` | - | |
| target | Same as target attribute of a, works when href is specified | string | - | |
| type | Can be set to `primary` `ghost` `dashed` `link` `text` `default` | string | `default` | |
+| onClick | Set the handler to handle `click` event | (event) => void | - | |
It accepts all props which native buttons support.
diff --git a/components/button/index.zh-CN.md b/components/button/index.zh-CN.md
index dd4fca382e..2ef9d4d61d 100644
--- a/components/button/index.zh-CN.md
+++ b/components/button/index.zh-CN.md
@@ -43,11 +43,11 @@ cover: https://gw.alipayobjects.com/zos/alicdn/fNUKzY1sk/Button.svg
| htmlType | 设置 `button` 原生的 `type` 值,可选值请参考 [HTML 标准](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-type) | string | `button` | |
| icon | 设置按钮的图标组件 | ReactNode | - | |
| loading | 设置按钮载入状态 | boolean \| { delay: number } | false | |
-| onClick | 点击按钮时的回调 | (event) => void | - | |
-| shape | 设置按钮形状,可选值为 `circle`、 `round` 或者不设 | string | - | |
+| shape | 设置按钮形状 | `circle` \| `round` | - | |
| size | 设置按钮大小 | `large` \| `middle` \| `small` | - | |
| target | 相当于 a 链接的 target 属性,href 存在时生效 | string | - | |
| type | 设置按钮类型 | `primary` \| `ghost` \| `dashed` \| `link` \| `text` \| `default` | `default` | |
+| onClick | 点击按钮时的回调 | (event) => void | - | |
支持原生 button 的其他所有属性。
diff --git a/components/button/style/index.less b/components/button/style/index.less
index cb419ff828..fada1a67cc 100644
--- a/components/button/style/index.less
+++ b/components/button/style/index.less
@@ -111,8 +111,7 @@
}
}
- &-circle,
- &-circle-outline {
+ &-circle {
.btn-circle(@btn-prefix-cls);
}
diff --git a/components/calendar/demo/customize-header.md b/components/calendar/demo/customize-header.md
index b3e9abdc21..01e103a33c 100644
--- a/components/calendar/demo/customize-header.md
+++ b/components/calendar/demo/customize-header.md
@@ -57,9 +57,7 @@ ReactDOM.render(
}
return (
-
- Custom header
-
+
Custom header
onTypeChange(e.target.value)} value={type}>
diff --git a/components/calendar/index.en-US.md b/components/calendar/index.en-US.md
index 7397403c61..0f68b576f7 100644
--- a/components/calendar/index.en-US.md
+++ b/components/calendar/index.en-US.md
@@ -37,16 +37,16 @@ When data is in the form of dates, such as schedules, timetables, prices calenda
| defaultValue | The date selected by default | [moment](http://momentjs.com/) | - | |
| disabledDate | Function that specifies the dates that cannot be selected | (currentDate: moment) => boolean | - | |
| fullscreen | Whether to display in full-screen | boolean | true | |
+| headerRender | Render custom header in panel | function(object:{value: moment, type: string, onChange: f(), onTypeChange: f()}) | - | |
| locale | The calendar's locale | object | [(default)](https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json) | |
| mode | The display mode of the calendar | `month` \| `year` | `month` | |
| monthCellRender | Customize the display of the month cell, the returned content will be appended to the cell | function(date: moment): ReactNode | - | |
| monthFullCellRender | Customize the display of the month cell, the returned content will override the cell | function(date: moment): ReactNode | - | |
| validRange | To set valid range | \[[moment](http://momentjs.com/), [moment](http://momentjs.com/)] | - | |
| value | The current selected date | [moment](http://momentjs.com/) | - | |
+| onChange | Callback for when date changes | function(date: moment) | - | |
| onPanelChange | Callback for when panel changes | function(date: moment, mode: string) | - | |
| onSelect | Callback for when a date is selected | function(date: moment) | - | |
-| onChange | Callback for when date changes | function(date: moment) | - | |
-| headerRender | Render custom header in panel | function(object:{value: moment, type: string, onChange: f(), onTypeChange: f()}) | - | |
## FAQ
diff --git a/components/calendar/index.zh-CN.md b/components/calendar/index.zh-CN.md
index 37a4edcf94..69abee334f 100644
--- a/components/calendar/index.zh-CN.md
+++ b/components/calendar/index.zh-CN.md
@@ -38,16 +38,16 @@ cover: https://gw.alipayobjects.com/zos/antfincdn/dPQmLq08DI/Calendar.svg
| defaultValue | 默认展示的日期 | [moment](http://momentjs.com/) | - | |
| disabledDate | 不可选择的日期 | (currentDate: moment) => boolean | - | |
| fullscreen | 是否全屏显示 | boolean | true | |
+| headerRender | 自定义头部内容 | function(object:{value: moment, type: string, onChange: f(), onTypeChange: f()}) | - | |
| locale | 国际化配置 | object | [(默认配置)](https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json) | |
| mode | 初始模式 | `month` \| `year` | `month` | |
| monthCellRender | 自定义渲染月单元格,返回内容会被追加到单元格 | function(date: moment): ReactNode | - | |
| monthFullCellRender | 自定义渲染月单元格,返回内容覆盖单元格 | function(date: moment): ReactNode | - | |
| validRange | 设置可以显示的日期 | \[[moment](http://momentjs.com/), [moment](http://momentjs.com/)] | - | |
| value | 展示日期 | [moment](http://momentjs.com/) | - | |
+| onChange | 日期变化回调 | function(date: moment) | - | |
| onPanelChange | 日期面板变化回调 | function(date: moment, mode: string) | - | |
| onSelect | 点击选择日期回调 | function(date: moment) | - | |
-| onChange | 日期变化回调 | function(date: moment) | - | |
-| headerRender | 自定义头部内容 | function(object:{value: moment, type: string, onChange: f(), onTypeChange: f()}) | - | |
## FAQ
diff --git a/components/card/__tests__/index.test.js b/components/card/__tests__/index.test.js
index f179f14006..8e1cade399 100644
--- a/components/card/__tests__/index.test.js
+++ b/components/card/__tests__/index.test.js
@@ -52,10 +52,7 @@ describe('Card', () => {
xxx
,
);
- wrapper
- .find('.ant-tabs-tab')
- .at(1)
- .simulate('click');
+ wrapper.find('.ant-tabs-tab').at(1).simulate('click');
expect(onTabChange).toHaveBeenCalledWith('tab2');
});
diff --git a/components/card/index.en-US.md b/components/card/index.en-US.md
index 1632a66493..c5821dd796 100644
--- a/components/card/index.en-US.md
+++ b/components/card/index.en-US.md
@@ -24,36 +24,36 @@ A card can be used to display content related to a single subject. The content c
| --- | --- | --- | --- | --- |
| actions | The action list, shows at the bottom of the Card | Array<ReactNode> | - | |
| activeTabKey | Current TabPane's key | string | - | |
-| headStyle | Inline style to apply to the card head | CSSProperties | - | |
| bodyStyle | Inline style to apply to the card content | CSSProperties | - | |
| bordered | Toggles rendering of the border around the card | boolean | true | |
| cover | Card cover | ReactNode | - | |
| defaultActiveTabKey | Initial active TabPane's key, if `activeTabKey` is not set | string | - | |
| extra | Content to render in the top-right corner of the card | ReactNode | - | |
+| headStyle | Inline style to apply to the card head | CSSProperties | - | |
| hoverable | Lift up when hovering card | boolean | false | |
| loading | Shows a loading indicator while the contents of the card are being fetched | boolean | false | |
-| tabList | List of TabPane's head | Array<{key: string, tab: ReactNode}> | - | |
-| tabBarExtraContent | Extra content in tab bar | ReactNode | - | |
| size | Size of card | `default` \| `small` | `default` | |
+| tabBarExtraContent | Extra content in tab bar | ReactNode | - | |
+| tabList | List of TabPane's head | Array<{key: string, tab: ReactNode}> | - | |
+| tabProps | [Tabs](/components/tabs/#Tabs) | - | - | |
| title | Card title | ReactNode | - | |
| type | Card style type, can be set to `inner` or not set | string | - | |
| onTabChange | Callback when tab is switched | (key) => void | - | |
-| tabProps | [Tabs](/components/tabs/#Tabs) | - | - | |
### Card.Grid
-| Property | Description | Type | Default | Version |
-| --------- | ------------------------------- | ------------- | ------- | ------- |
-| className | The className of container | string | - | |
-| hoverable | Lift up when hovering card grid | boolean | true | |
-| style | The style object of container | CSSProperties | - | |
+| Property | Description | Type | Default | Version |
+| --- | --- | --- | --- | --- |
+| className | The className of container | string | - | |
+| hoverable | Lift up when hovering card grid | boolean | true | |
+| style | The style object of container | CSSProperties | - | |
### Card.Meta
-| Property | Description | Type | Default | Version |
-| ----------- | ----------------------------- | ------------- | ------- | ------- |
-| avatar | Avatar or icon | ReactNode | - | |
-| className | The className of container | string | - | |
-| description | Description content | ReactNode | - | |
-| style | The style object of container | CSSProperties | - | |
-| title | Title content | ReactNode | - | |
+| Property | Description | Type | Default | Version |
+| --- | --- | --- | --- | --- |
+| avatar | Avatar or icon | ReactNode | - | |
+| className | The className of container | string | - | |
+| description | Description content | ReactNode | - | |
+| style | The style object of container | CSSProperties | - | |
+| title | Title content | ReactNode | - | |
diff --git a/components/card/index.zh-CN.md b/components/card/index.zh-CN.md
index 36719a6537..029e88a8ab 100644
--- a/components/card/index.zh-CN.md
+++ b/components/card/index.zh-CN.md
@@ -25,36 +25,36 @@ cover: https://gw.alipayobjects.com/zos/antfincdn/NqXt8DJhky/Card.svg
| --- | --- | --- | --- | --- |
| actions | 卡片操作组,位置在卡片底部 | Array<ReactNode> | - | |
| activeTabKey | 当前激活页签的 key | string | - | |
-| headStyle | 自定义标题区域样式 | CSSProperties | - | |
| bodyStyle | 内容区域自定义样式 | CSSProperties | - | |
| bordered | 是否有边框 | boolean | true | |
| cover | 卡片封面 | ReactNode | - | |
| defaultActiveTabKey | 初始化选中页签的 key,如果没有设置 activeTabKey | string | `第一个页签` | |
| extra | 卡片右上角的操作区域 | ReactNode | - | |
+| headStyle | 自定义标题区域样式 | CSSProperties | - | |
| hoverable | 鼠标移过时可浮起 | boolean | false | |
| loading | 当卡片内容还在加载中时,可以用 loading 展示一个占位 | boolean | false | |
-| tabList | 页签标题列表 | Array<{key: string, tab: ReactNode}> | - | |
-| tabBarExtraContent | tab bar 上额外的元素 | ReactNode | - | |
| size | card 的尺寸 | `default` \| `small` | `default` | |
+| tabBarExtraContent | tab bar 上额外的元素 | ReactNode | - | |
+| tabList | 页签标题列表 | Array<{key: string, tab: ReactNode}> | - | |
+| tabProps | [Tabs](/components/tabs/#Tabs) | - | - | |
| title | 卡片标题 | ReactNode | - | |
| type | 卡片类型,可设置为 `inner` 或 不设置 | string | - | |
| onTabChange | 页签切换的回调 | (key) => void | - | |
-| tabProps | [Tabs](/components/tabs/#Tabs) | - | - | |
### Card.Grid
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| --------- | ---------------------- | ------------- | ------ | ---- |
-| className | 网格容器类名 | string | - | |
-| hoverable | 鼠标移过时可浮起 | boolean | true | |
-| style | 定义网格容器类名的样式 | CSSProperties | - | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| className | 网格容器类名 | string | - | |
+| hoverable | 鼠标移过时可浮起 | boolean | true | |
+| style | 定义网格容器类名的样式 | CSSProperties | - | |
### Card.Meta
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| ----------- | ------------------ | ------------- | ------ | ---- |
-| avatar | 头像/图标 | ReactNode | - | |
-| className | 容器类名 | string | - | |
-| description | 描述内容 | ReactNode | - | |
-| style | 定义容器类名的样式 | CSSProperties | - | |
-| title | 标题内容 | ReactNode | - | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| avatar | 头像/图标 | ReactNode | - | |
+| className | 容器类名 | string | - | |
+| description | 描述内容 | ReactNode | - | |
+| style | 定义容器类名的样式 | CSSProperties | - | |
+| title | 标题内容 | ReactNode | - | |
diff --git a/components/card/style/index.less b/components/card/style/index.less
index 100c51adf9..6c750672b5 100644
--- a/components/card/style/index.less
+++ b/components/card/style/index.less
@@ -57,6 +57,13 @@
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
+
+ > .@{ant-prefix}-typography,
+ > .@{ant-prefix}-typography-edit-content {
+ left: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ }
}
.@{ant-prefix}-tabs {
diff --git a/components/carousel/index.en-US.md b/components/carousel/index.en-US.md
index 876a803b65..4bb51fb063 100644
--- a/components/carousel/index.en-US.md
+++ b/components/carousel/index.en-US.md
@@ -17,13 +17,13 @@ A carousel component. Scales with its container.
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| afterChange | Callback function called after the current index changes | function(current) | - | |
| autoplay | Whether to scroll automatically | boolean | false | |
-| beforeChange | Callback function called before the current index changes | function(from, to) | - | |
| dotPosition | The position of the dots, which can be one of `top` `bottom` `left` `right` | string | `bottom` | |
| dots | Whether to show the dots at the bottom of the gallery, `object` for `dotsClass` and any others | boolean \| { className?: string } | true | |
| easing | Transition interpolation function name | string | `linear` | |
| effect | Transition effect | `scrollx` \| `fade` | `scrollx` | |
+| afterChange | Callback function called after the current index changes | function(current) | - | |
+| beforeChange | Callback function called before the current index changes | function(from, to) | - | |
## Methods
diff --git a/components/carousel/index.zh-CN.md b/components/carousel/index.zh-CN.md
index f30bd7db2c..c4aee00d10 100644
--- a/components/carousel/index.zh-CN.md
+++ b/components/carousel/index.zh-CN.md
@@ -18,20 +18,20 @@ cover: https://gw.alipayobjects.com/zos/antfincdn/%24C9tmj978R/Carousel.svg
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| afterChange | 切换面板的回调 | function(current) | - | | |
-| autoplay | 是否自动切换 | boolean | false | | |
-| beforeChange | 切换面板的回调 | function(from, to) | - | | |
+| autoplay | 是否自动切换 | boolean | false | |
| dotPosition | 面板指示点位置,可选 `top` `bottom` `left` `right` | string | `bottom` | |
-| dots | 是否显示面板指示点,如果为 `object` 则同时可以指定 `dotsClass` 或者 | boolean \| { className?: string } | true | | |
-| easing | 动画效果 | string | `linear` | | |
-| effect | 动画效果函数 | `scrollx` \| `fade` | `scrollx` | | |
+| dots | 是否显示面板指示点,如果为 `object` 则同时可以指定 `dotsClass` 或者 | boolean \| { className?: string } | true | |
+| easing | 动画效果 | string | `linear` | |
+| effect | 动画效果函数 | `scrollx` \| `fade` | `scrollx` | |
+| afterChange | 切换面板的回调 | function(current) | - | |
+| beforeChange | 切换面板的回调 | function(from, to) | - | |
## 方法
-| 名称 | 描述 |
-| ------------------------------ | ------------------------------------------------- |
+| 名称 | 描述 |
+| --- | --- |
| goTo(slideNumber, dontAnimate) | 切换到指定面板, dontAnimate = true 时,不使用动画 |
-| next() | 切换到下一面板 |
-| prev() | 切换到上一面板 |
+| next() | 切换到下一面板 |
+| prev() | 切换到上一面板 |
更多 API 可参考:
diff --git a/components/cascader/__tests__/type.test.tsx b/components/cascader/__tests__/type.test.tsx
index d401efeae5..b3330ffdd8 100644
--- a/components/cascader/__tests__/type.test.tsx
+++ b/components/cascader/__tests__/type.test.tsx
@@ -38,7 +38,6 @@ describe('Cascader.typescript', () => {
},
];
-
const result = ;
expect(result).toBeTruthy();
diff --git a/components/cascader/demo/custom-dropdown.md b/components/cascader/demo/custom-dropdown.md
index 70c9e6b0aa..33f366ff90 100644
--- a/components/cascader/demo/custom-dropdown.md
+++ b/components/cascader/demo/custom-dropdown.md
@@ -62,11 +62,7 @@ function dropdownRender(menus) {
}
ReactDOM.render(
- ,
+ ,
mountNode,
);
```
diff --git a/components/cascader/index.en-US.md b/components/cascader/index.en-US.md
index b5567be997..0f9e2979a0 100644
--- a/components/cascader/index.en-US.md
+++ b/components/cascader/index.en-US.md
@@ -29,13 +29,14 @@ Cascade selection box.
| defaultValue | Initial selected value | string\[] \| number\[] | \[] | |
| disabled | Whether disabled select | boolean | false | |
| displayRender | The render function of displaying selected options | (label, selectedOptions) => ReactNode | label => label.join(`/`) | |
-| expandTrigger | expand current item when click or hover, one of `click` `hover` | string | `click` | |
+| dropdownRender | Customize dropdown content | (menus: ReactNode) => ReactNode | - | 4.4.0 |
| expandIcon | Customize the current item expand icon | ReactNode | - | 4.4.0 |
+| expandTrigger | expand current item when click or hover, one of `click` `hover` | string | `click` | |
| fieldNames | Custom field name for label and value and children | object | { label: `label`, value: `value`, children: `children` } | |
| getPopupContainer | Parent Node which the selector should be rendered to. Default to `body`. When position issues happen, try to modify it into scrollable content and position it relative. [example](https://codepen.io/afc163/pen/zEjNOy?editors=0010) | function(triggerNode) | () => document.body | |
| loadData | To load option lazily, and it cannot work with `showSearch` | (selectedOptions) => void | - | |
| notFoundContent | Specify content to show when no result matches | string | `Not Found` | |
-| options | The data options of cascade | [Option](#Option)[] | - | |
+| options | The data options of cascade | [Option](#Option)\[] | - | |
| placeholder | The input placeholder | string | `Please select` | |
| popupClassName | The additional className of popup overlay | string | - | |
| popupPlacement | Use preset popup align config from builtinPlacements:`bottomLeft` `bottomRight` `topLeft` `topRight` | string | `bottomLeft` | |
@@ -45,7 +46,6 @@ Cascade selection box.
| style | The additional style | CSSProperties | - | |
| suffixIcon | The custom suffix icon | ReactNode | - | |
| value | The selected value | string\[] \| number\[] | - | |
-| dropdownRender | Customize dropdown content | (menus: ReactNode) => ReactNode | - | 4.4.0 |
| onChange | Callback when finishing cascader select | (value, selectedOptions) => void | - | |
| onPopupVisibleChange | Callback when popup shown or hidden | (value) => void | - | |
@@ -72,7 +72,7 @@ interface Option {
## Methods
-| Name | Description | Version |
-| ------- | ------------ | ------- |
-| blur() | Remove focus | |
-| focus() | Get focus | |
+| Name | Description | Version |
+| --- | --- | --- |
+| blur() | Remove focus | |
+| focus() | Get focus | |
diff --git a/components/cascader/index.tsx b/components/cascader/index.tsx
index 7e54bba0e4..79c27a49fe 100644
--- a/components/cascader/index.tsx
+++ b/components/cascader/index.tsx
@@ -642,12 +642,19 @@ class Cascader extends React.Component {
);
const getPopupContainer = props.getPopupContainer || getContextPopupContainer;
- const rest = omit(props, ['inputIcon', 'expandIcon', 'loadingIcon', 'bordered']);
+ const rest = omit(props, [
+ 'inputIcon',
+ 'expandIcon',
+ 'loadingIcon',
+ 'bordered',
+ 'className',
+ ]);
const rcCascaderPopupClassName = classNames(popupClassName, {
[`${prefixCls}-menu-${direction}`]: direction === 'rtl',
[`${prefixCls}-menu-empty`]:
options.length === 1 && options[0].value === 'ANT_CASCADER_NOT_FOUND',
});
+
return (
ReactNode | label => label.join(`/`) | |
-| expandTrigger | 次级菜单的展开方式,可选 'click' 和 'hover' | string | `click` | |
+| dropdownRender | 自定义下拉框内容 | (menus: ReactNode) => ReactNode | - | 4.4.0 |
| expandIcon | 自定义次级菜单展开图标 | ReactNode | - | 4.4.0 |
+| expandTrigger | 次级菜单的展开方式,可选 'click' 和 'hover' | string | `click` | |
| fieldNames | 自定义 options 中 label name children 的字段 | object | { label: `label`, value: `value`, children: `children` } | |
| getPopupContainer | 菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位。[示例](https://codepen.io/afc163/pen/zEjNOy?editors=0010) | function(triggerNode) | () => document.body | |
| loadData | 用于动态加载选项,无法与 `showSearch` 一起使用 | (selectedOptions) => void | - | |
| notFoundContent | 当下拉列表为空时显示的内容 | string | `Not Found` | |
-| options | 可选项数据源 | [Option](#Option)[] | - | |
+| options | 可选项数据源 | [Option](#Option)\[] | - | |
| placeholder | 输入框占位文本 | string | `请选择` | |
| popupClassName | 自定义浮层类名 | string | - | |
| popupPlacement | 浮层预设位置:`bottomLeft` `bottomRight` `topLeft` `topRight` | string | `bottomLeft` | |
@@ -46,7 +47,6 @@ cover: https://gw.alipayobjects.com/zos/alicdn/UdS8y8xyZ/Cascader.svg
| style | 自定义样式 | CSSProperties | - | |
| suffixIcon | 自定义的选择框后缀图标 | ReactNode | - | |
| value | 指定选中项 | string\[] \| number\[] | - | |
-| dropdownRender | 自定义下拉框内容 | (menus: ReactNode) => ReactNode | - | 4.4.0 |
| onChange | 选择完成后的回调 | (value, selectedOptions) => void | - | |
| onPopupVisibleChange | 显示/隐藏浮层的回调 | (value) => void | - | |
@@ -73,9 +73,9 @@ interface Option {
## 方法
-| 名称 | 描述 | 版本 |
-| ------- | -------- | ---- |
-| blur() | 移除焦点 | |
-| focus() | 获取焦点 | |
+| 名称 | 描述 | 版本 |
+| --- | --- | --- |
+| blur() | 移除焦点 | |
+| focus() | 获取焦点 | |
> 注意,如果需要获得中国省市区数据,可以参考 [china-division](https://gist.github.com/afc163/7582f35654fd03d5be7009444345ea17)。
diff --git a/components/checkbox/Group.tsx b/components/checkbox/Group.tsx
index 1ad47239f5..86e992ba09 100644
--- a/components/checkbox/Group.tsx
+++ b/components/checkbox/Group.tsx
@@ -2,7 +2,7 @@ import * as React from 'react';
import classNames from 'classnames';
import omit from 'omit.js';
import Checkbox, { CheckboxChangeEvent } from './Checkbox';
-import { ConfigConsumer, ConfigConsumerProps } from '../config-provider';
+import { ConfigContext } from '../config-provider';
export type CheckboxValueType = string | number | boolean;
@@ -27,11 +27,7 @@ export interface CheckboxGroupProps extends AbstractCheckboxGroupProps {
defaultValue?: Array;
value?: Array;
onChange?: (checkedValue: Array) => void;
-}
-
-export interface CheckboxGroupState {
- value: CheckboxValueType[];
- registeredValues: CheckboxValueType[];
+ children?: React.ReactNode;
}
export interface CheckboxGroupContext {
@@ -42,135 +38,119 @@ export interface CheckboxGroupContext {
export const GroupContext = React.createContext(null);
-class CheckboxGroup extends React.PureComponent {
- static defaultProps = {
- options: [],
- };
+const CheckboxGroup: React.FC = ({
+ defaultValue,
+ children,
+ options = [],
+ prefixCls: customizePrefixCls,
+ className,
+ style,
+ onChange,
+ ...restProps
+}) => {
+ const { getPrefixCls, direction } = React.useContext(ConfigContext);
- static getDerivedStateFromProps(nextProps: CheckboxGroupProps) {
- if ('value' in nextProps) {
- return {
- value: nextProps.value || [],
- };
+ const [value, setValue] = React.useState(
+ restProps.value || defaultValue || [],
+ );
+ const [registeredValues, setRegisteredValues] = React.useState([]);
+
+ React.useEffect(() => {
+ if ('value' in restProps) {
+ setValue(restProps.value || []);
}
- return null;
- }
+ }, [restProps.value]);
- constructor(props: CheckboxGroupProps) {
- super(props);
- this.state = {
- value: props.value || props.defaultValue || [],
- registeredValues: [],
- };
- }
-
- getOptions() {
- const { options } = this.props;
- // https://github.com/Microsoft/TypeScript/issues/7960
- return (options as Array).map(option => {
+ const getOptions = () => {
+ return options.map(option => {
if (typeof option === 'string') {
return {
label: option,
value: option,
- } as CheckboxOptionType;
+ };
}
return option;
});
- }
-
- cancelValue = (value: string) => {
- this.setState(({ registeredValues }) => ({
- registeredValues: registeredValues.filter(val => val !== value),
- }));
};
- registerValue = (value: string) => {
- this.setState(({ registeredValues }) => ({
- registeredValues: [...registeredValues, value],
- }));
+ const cancelValue = (val: string) => {
+ setRegisteredValues(prevValues => prevValues.filter(v => v !== val));
};
- toggleOption = (option: CheckboxOptionType) => {
- const { registeredValues } = this.state;
- const optionIndex = this.state.value.indexOf(option.value);
- const value = [...this.state.value];
+ const registerValue = (val: string) => {
+ setRegisteredValues(prevValues => [...prevValues, val]);
+ };
+
+ const toggleOption = (option: CheckboxOptionType) => {
+ const optionIndex = value.indexOf(option.value);
+ const newValue = [...value];
if (optionIndex === -1) {
- value.push(option.value);
+ newValue.push(option.value);
} else {
- value.splice(optionIndex, 1);
+ newValue.splice(optionIndex, 1);
}
- if (!('value' in this.props)) {
- this.setState({ value });
+ if (!('value' in restProps)) {
+ setValue(newValue);
}
- const { onChange } = this.props;
if (onChange) {
- const options = this.getOptions();
+ const opts = getOptions();
onChange(
- value
+ newValue
.filter(val => registeredValues.indexOf(val) !== -1)
.sort((a, b) => {
- const indexA = options.findIndex(opt => opt.value === a);
- const indexB = options.findIndex(opt => opt.value === b);
+ const indexA = opts.findIndex(opt => opt.value === a);
+ const indexB = opts.findIndex(opt => opt.value === b);
return indexA - indexB;
}),
);
}
};
- renderGroup = ({ getPrefixCls, direction }: ConfigConsumerProps) => {
- const { props, state } = this;
- const { prefixCls: customizePrefixCls, className, style, options, ...restProps } = props;
- const prefixCls = getPrefixCls('checkbox', customizePrefixCls);
- const groupPrefixCls = `${prefixCls}-group`;
+ const prefixCls = getPrefixCls('checkbox', customizePrefixCls);
+ const groupPrefixCls = `${prefixCls}-group`;
- const domProps = omit(restProps, ['children', 'defaultValue', 'value', 'onChange', 'disabled']);
+ const domProps = omit(restProps, ['value', 'disabled']);
- let { children } = props;
- if (options && options.length > 0) {
- children = this.getOptions().map(option => (
-
- {option.label}
-
- ));
- }
+ if (options && options.length > 0) {
+ children = getOptions().map(option => (
+
+ {option.label}
+
+ ));
+ }
- const context = {
- toggleOption: this.toggleOption,
- value: this.state.value,
- disabled: this.props.disabled,
- name: this.props.name,
+ const context = {
+ toggleOption,
+ value,
+ disabled: restProps.disabled,
+ name: restProps.name,
- // https://github.com/ant-design/ant-design/issues/16376
- registerValue: this.registerValue,
- cancelValue: this.cancelValue,
- };
-
- const classString = classNames(
- groupPrefixCls,
- {
- [`${groupPrefixCls}-rtl`]: direction === 'rtl',
- },
- className,
- );
- return (
-
- {children}
-
- );
+ // https://github.com/ant-design/ant-design/issues/16376
+ registerValue,
+ cancelValue,
};
- render() {
- return {this.renderGroup} ;
- }
-}
+ const classString = classNames(
+ groupPrefixCls,
+ {
+ [`${groupPrefixCls}-rtl`]: direction === 'rtl',
+ },
+ className,
+ );
+ return (
+
+ {children}
+
+ );
+};
-export default CheckboxGroup;
+export default React.memo(CheckboxGroup);
diff --git a/components/checkbox/__tests__/group.test.js b/components/checkbox/__tests__/group.test.js
index 5b45991e57..076930095d 100644
--- a/components/checkbox/__tests__/group.test.js
+++ b/components/checkbox/__tests__/group.test.js
@@ -14,25 +14,13 @@ describe('CheckboxGroup', () => {
const wrapper = mount(
,
);
- wrapper
- .find('.ant-checkbox-input')
- .at(0)
- .simulate('change');
+ wrapper.find('.ant-checkbox-input').at(0).simulate('change');
expect(onChange).toHaveBeenCalledWith(['Apple']);
- wrapper
- .find('.ant-checkbox-input')
- .at(1)
- .simulate('change');
+ wrapper.find('.ant-checkbox-input').at(1).simulate('change');
expect(onChange).toHaveBeenCalledWith(['Apple', 'Pear']);
- wrapper
- .find('.ant-checkbox-input')
- .at(2)
- .simulate('change');
+ wrapper.find('.ant-checkbox-input').at(2).simulate('change');
expect(onChange).toHaveBeenCalledWith(['Apple', 'Pear', 'Orange']);
- wrapper
- .find('.ant-checkbox-input')
- .at(1)
- .simulate('change');
+ wrapper.find('.ant-checkbox-input').at(1).simulate('change');
expect(onChange).toHaveBeenCalledWith(['Apple', 'Orange']);
});
@@ -47,15 +35,9 @@ describe('CheckboxGroup', () => {
const groupWrapper = mount(
,
);
- groupWrapper
- .find('.ant-checkbox-input')
- .at(0)
- .simulate('change');
+ groupWrapper.find('.ant-checkbox-input').at(0).simulate('change');
expect(onChangeGroup).not.toHaveBeenCalled();
- groupWrapper
- .find('.ant-checkbox-input')
- .at(1)
- .simulate('change');
+ groupWrapper.find('.ant-checkbox-input').at(1).simulate('change');
expect(onChangeGroup).not.toHaveBeenCalled();
});
@@ -68,15 +50,9 @@ describe('CheckboxGroup', () => {
];
const groupWrapper = mount( );
- groupWrapper
- .find('.ant-checkbox-input')
- .at(0)
- .simulate('change');
+ groupWrapper.find('.ant-checkbox-input').at(0).simulate('change');
expect(onChangeGroup).toHaveBeenCalledWith(['Apple']);
- groupWrapper
- .find('.ant-checkbox-input')
- .at(1)
- .simulate('change');
+ groupWrapper.find('.ant-checkbox-input').at(1).simulate('change');
expect(onChangeGroup).toHaveBeenCalledWith(['Apple']);
});
@@ -105,10 +81,10 @@ describe('CheckboxGroup', () => {
];
const wrapper = mount( );
-
- expect(wrapper.instance().state.value).toEqual([]);
+ expect(wrapper.find('.ant-checkbox-checked').length).toBe(0);
wrapper.setProps({ value: ['Apple'] });
- expect(wrapper.instance().state.value).toEqual(['Apple']);
+ wrapper.update();
+ expect(wrapper.find('.ant-checkbox-checked').length).toBe(1);
});
// https://github.com/ant-design/ant-design/issues/12642
@@ -119,10 +95,7 @@ describe('CheckboxGroup', () => {
,
);
- wrapper
- .find('.ant-checkbox-input')
- .at(0)
- .simulate('change');
+ wrapper.find('.ant-checkbox-input').at(0).simulate('change');
expect(onChange).toHaveBeenCalled();
expect(onChange.mock.calls[0][0].target.value).toEqual('my');
});
@@ -141,10 +114,7 @@ describe('CheckboxGroup', () => {
children: [ ],
});
- wrapper
- .find('.ant-checkbox-input')
- .at(0)
- .simulate('change');
+ wrapper.find('.ant-checkbox-input').at(0).simulate('change');
expect(onChange).toHaveBeenCalledWith([2]);
});
@@ -160,12 +130,7 @@ describe('CheckboxGroup', () => {
wrapper.setProps({
children: [ ],
});
- expect(
- wrapper
- .find('.ant-checkbox-input')
- .at(0)
- .prop('checked'),
- ).toBe(false);
+ expect(wrapper.find('.ant-checkbox-input').at(0).prop('checked')).toBe(false);
});
// https://github.com/ant-design/ant-design/issues/17297
@@ -180,25 +145,13 @@ describe('CheckboxGroup', () => {
,
);
- wrapper
- .find('.ant-checkbox-input')
- .at(0)
- .simulate('change');
+ wrapper.find('.ant-checkbox-input').at(0).simulate('change');
expect(onChange).toHaveBeenCalledWith([1]);
- wrapper
- .find('.ant-checkbox-input')
- .at(1)
- .simulate('change');
+ wrapper.find('.ant-checkbox-input').at(1).simulate('change');
expect(onChange).toHaveBeenCalledWith([1, 2]);
- wrapper
- .find('.ant-checkbox-input')
- .at(0)
- .simulate('change');
+ wrapper.find('.ant-checkbox-input').at(0).simulate('change');
expect(onChange).toHaveBeenCalledWith([2]);
- wrapper
- .find('.ant-checkbox-input')
- .at(0)
- .simulate('change');
+ wrapper.find('.ant-checkbox-input').at(0).simulate('change');
expect(onChange).toHaveBeenCalledWith([1, 2]);
});
@@ -215,30 +168,10 @@ describe('CheckboxGroup', () => {
,
);
- wrapper
- .find('.ant-collapse-item')
- .at(0)
- .find('.ant-collapse-header')
- .simulate('click');
- wrapper
- .find('.ant-checkbox-input')
- .at(0)
- .simulate('change');
- expect(
- wrapper
- .find(Checkbox.Group)
- .at(0)
- .state('value'),
- ).toEqual(['1']);
- wrapper
- .find('.ant-checkbox-input')
- .at(0)
- .simulate('change');
- expect(
- wrapper
- .find(Checkbox.Group)
- .at(0)
- .state('value'),
- ).toEqual([]);
+ wrapper.find('.ant-collapse-item').at(0).find('.ant-collapse-header').simulate('click');
+ wrapper.find('.ant-checkbox-input').at(0).simulate('change');
+ expect(wrapper.find('.ant-checkbox-checked').length).toBe(1);
+ wrapper.find('.ant-checkbox-input').at(0).simulate('change');
+ expect(wrapper.find('.ant-checkbox-checked').length).toBe(0);
});
});
diff --git a/components/checkbox/__tests__/type.test.tsx b/components/checkbox/__tests__/type.test.tsx
new file mode 100644
index 0000000000..74bfcced0a
--- /dev/null
+++ b/components/checkbox/__tests__/type.test.tsx
@@ -0,0 +1,15 @@
+import * as React from 'react';
+import Checkbox from '..';
+import Input from '../../input';
+
+describe('Checkbox.typescript', () => {
+ it('Checkbox.Group', () => {
+ const group = (
+
+
+
+ );
+
+ expect(group).toBeTruthy();
+ });
+});
diff --git a/components/checkbox/index.en-US.md b/components/checkbox/index.en-US.md
index e5f1c8dc42..230d188c5e 100644
--- a/components/checkbox/index.en-US.md
+++ b/components/checkbox/index.en-US.md
@@ -42,7 +42,7 @@ Checkbox component.
#### Checkbox
-| Name | Description | Version |
-| ------- | ------------ | ------- |
-| blur() | Remove focus | |
-| focus() | Get focus | |
+| Name | Description | Version |
+| --- | --- | --- |
+| blur() | Remove focus | |
+| focus() | Get focus | |
diff --git a/components/checkbox/index.zh-CN.md b/components/checkbox/index.zh-CN.md
index a8c621354d..3bb66a7af8 100644
--- a/components/checkbox/index.zh-CN.md
+++ b/components/checkbox/index.zh-CN.md
@@ -19,14 +19,14 @@ cover: https://gw.alipayobjects.com/zos/alicdn/8nbVbHEm_/CheckBox.svg
#### Checkbox
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| -------------- | --------------------------------------- | ----------------- | ------ | ---- |
-| autoFocus | 自动获取焦点 | boolean | false | |
-| checked | 指定当前是否选中 | boolean | false | |
-| defaultChecked | 初始是否选中 | boolean | false | |
-| disabled | 失效状态 | boolean | false | |
-| indeterminate | 设置 indeterminate 状态,只负责样式控制 | boolean | false | |
-| onChange | 变化时回调函数 | function(e:Event) | - | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| autoFocus | 自动获取焦点 | boolean | false | |
+| checked | 指定当前是否选中 | boolean | false | |
+| defaultChecked | 初始是否选中 | boolean | false | |
+| disabled | 失效状态 | boolean | false | |
+| indeterminate | 设置 indeterminate 状态,只负责样式控制 | boolean | false | |
+| onChange | 变化时回调函数 | function(e:Event) | - | |
#### Checkbox Group
@@ -53,7 +53,7 @@ interface Option {
#### Checkbox
-| 名称 | 描述 | 版本 |
-| ------- | -------- | ---- |
-| blur() | 移除焦点 | |
-| focus() | 获取焦点 | |
+| 名称 | 描述 | 版本 |
+| --- | --- | --- |
+| blur() | 移除焦点 | |
+| focus() | 获取焦点 | |
diff --git a/components/collapse/index.en-US.md b/components/collapse/index.en-US.md
index 7dd42378ce..517b2c29b4 100644
--- a/components/collapse/index.en-US.md
+++ b/components/collapse/index.en-US.md
@@ -19,23 +19,23 @@ A content area which can be collapsed and expanded.
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| activeKey | Key of the active panel | string\[] \| string number\[] \| number | No default value. In `accordion` mode, it's the key of the first panel | |
-| defaultActiveKey | Key of the initial active panel | string\[] \| string number\[] \| number | - | |
-| bordered | Toggles rendering of the border around the collapse block | boolean | true | |
| accordion | If true, Collapse renders as Accordion | boolean | false | |
-| onChange | Callback function executed when active panel is changed | function | - | |
+| activeKey | Key of the active panel | string\[] \| string number\[] \| number | No default value. In `accordion` mode, it's the key of the first panel | |
+| bordered | Toggles rendering of the border around the collapse block | boolean | true | |
+| defaultActiveKey | Key of the initial active panel | string\[] \| string number\[] \| number | - | |
+| destroyInactivePanel | Destroy Inactive Panel | boolean | false | |
| expandIcon | Allow to customize collapse icon | (panelProps) => ReactNode | - | |
| expandIconPosition | Set expand icon position | `left` \| `right` | - | |
-| destroyInactivePanel | Destroy Inactive Panel | boolean | false | |
| ghost | Make the collapse borderless and its background transparent | boolean | false | 4.4.0 |
+| onChange | Callback function executed when active panel is changed | function | - | |
### Collapse.Panel
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
| disabled | If true, panel cannot be opened or closed | boolean | false | |
+| extra | The extra element in the corner | ReactNode | - | |
| forceRender | Forced render of content on panel, instead of lazy rending after clicking on header | boolean | false | |
| header | Title of the panel | ReactNode | - | |
| key | Unique key identifying the panel from among its siblings | string \| number | - | |
| showArrow | If false, panel will not show arrow icon | boolean | true | |
-| extra | The extra element in the corner | ReactNode | - | |
diff --git a/components/collapse/index.zh-CN.md b/components/collapse/index.zh-CN.md
index e128311b3f..0b144647b3 100644
--- a/components/collapse/index.zh-CN.md
+++ b/components/collapse/index.zh-CN.md
@@ -20,23 +20,23 @@ cover: https://gw.alipayobjects.com/zos/alicdn/IxH16B9RD/Collapse.svg
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| activeKey | 当前激活 tab 面板的 key | string\[] \| string number\[] \| number | 默认无,accordion 模式下默认第一个元素 | |
-| defaultActiveKey | 初始化选中面板的 key | string\[] \| string number\[] \| number | - | |
-| bordered | 带边框风格的折叠面板 | boolean | true | |
| accordion | 手风琴模式 | boolean | false | |
-| onChange | 切换面板的回调 | function | - | |
+| activeKey | 当前激活 tab 面板的 key | string\[] \| string number\[] \| number | 默认无,accordion 模式下默认第一个元素 | |
+| bordered | 带边框风格的折叠面板 | boolean | true | |
+| defaultActiveKey | 初始化选中面板的 key | string\[] \| string number\[] \| number | - | |
+| destroyInactivePanel | 销毁折叠隐藏的面板 | boolean | false | |
| expandIcon | 自定义切换图标 | (panelProps) => ReactNode | - | |
| expandIconPosition | 设置图标位置 | `left` \| `right` | - | |
-| destroyInactivePanel | 销毁折叠隐藏的面板 | boolean | false | |
| ghost | 使折叠面板透明且无边框 | boolean | false | 4.4.0 |
+| onChange | 切换面板的回调 | function | - | |
### Collapse.Panel
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| ----------- | ------------------------------------------ | ---------------- | ------ | ---- |
-| disabled | 禁用后的面板展开与否将无法通过用户交互改变 | boolean | false | |
-| forceRender | 被隐藏时是否渲染 DOM 结构 | boolean | false | |
-| header | 面板头内容 | ReactNode | - | |
-| key | 对应 activeKey | string \| number | - | |
-| showArrow | 是否展示当前面板上的箭头 | boolean | true | |
-| extra | 自定义渲染每个面板右上角的内容 | ReactNode | - | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| disabled | 禁用后的面板展开与否将无法通过用户交互改变 | boolean | false | |
+| extra | 自定义渲染每个面板右上角的内容 | ReactNode | - | |
+| forceRender | 被隐藏时是否渲染 DOM 结构 | boolean | false | |
+| header | 面板头内容 | ReactNode | - | |
+| key | 对应 activeKey | string \| number | - | |
+| showArrow | 是否展示当前面板上的箭头 | boolean | true | |
diff --git a/components/comment/__tests__/__snapshots__/demo.test.js.snap b/components/comment/__tests__/__snapshots__/demo.test.js.snap
index 58d321283e..3728720ab2 100644
--- a/components/comment/__tests__/__snapshots__/demo.test.js.snap
+++ b/components/comment/__tests__/__snapshots__/demo.test.js.snap
@@ -156,14 +156,10 @@ exports[`renders ./components/comment/demo/editor.md correctly 1`] = `
diff --git a/components/comment/demo/list.md b/components/comment/demo/list.md
index 805bdc03e3..11c33daa36 100644
--- a/components/comment/demo/list.md
+++ b/components/comment/demo/list.md
@@ -30,16 +30,8 @@ const data = [
),
datetime: (
-
-
- {moment()
- .subtract(1, 'days')
- .fromNow()}
-
+
+ {moment().subtract(1, 'days').fromNow()}
),
},
@@ -55,16 +47,8 @@ const data = [
),
datetime: (
-
-
- {moment()
- .subtract(2, 'days')
- .fromNow()}
-
+
+ {moment().subtract(2, 'days').fromNow()}
),
},
diff --git a/components/config-provider/__tests__/__snapshots__/components.test.js.snap b/components/config-provider/__tests__/__snapshots__/components.test.js.snap
index e3a7bc843b..be2ce6df44 100644
--- a/components/config-provider/__tests__/__snapshots__/components.test.js.snap
+++ b/components/config-provider/__tests__/__snapshots__/components.test.js.snap
@@ -13138,6 +13138,7 @@ exports[`ConfigProvider components Drawer configProvider 1`] = `
aria-label="Close"
class="config-drawer-close"
style="--scroll-bar:0px"
+ type="button"
>
-
-
-
+
`;
@@ -14640,13 +14642,9 @@ exports[`ConfigProvider components Input configProvider componentSize large 1`]
-
-
-
+
`;
@@ -14741,13 +14739,9 @@ exports[`ConfigProvider components Input configProvider componentSize middle 1`]
-
-
-
+
`;
@@ -14842,13 +14836,9 @@ exports[`ConfigProvider components Input configProvider virtual and dropdownMatc
-
-
-
+
`;
@@ -14943,13 +14933,9 @@ exports[`ConfigProvider components Input normal 1`] = `
-
-
-
+
`;
@@ -15044,13 +15030,9 @@ exports[`ConfigProvider components Input prefixCls 1`] = `
-
-
-
+
`;
diff --git a/components/config-provider/index.en-US.md b/components/config-provider/index.en-US.md
index 4adc52e58f..2b9e150a32 100644
--- a/components/config-provider/index.en-US.md
+++ b/components/config-provider/index.en-US.md
@@ -41,18 +41,18 @@ Some components use dynamic style to support wave effect. You can config `csp` p
| autoInsertSpaceInButton | Set false to remove space between 2 chinese characters on Button | boolean | true | |
| componentSize | Config antd component size | `small` \| `middle` \| `large` | - | |
| csp | Set [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) config | { nonce: string } | - | |
+| direction | Set direction of layout. See [demo](#components-config-provider-demo-direction) | `ltr` \| `rtl` | `ltr` | |
+| dropdownMatchSelectWidth | Determine whether the dropdown menu and the select input are the same width. Default set `min-width` same as input. Will ignore when value less than select width. `false` will disable virtual scroll | boolean \| number | - | 4.3.0 |
| form | Set Form common props | { validateMessages?: [ValidateMessages](/components/form/#validateMessages) } | - | |
-| input | Set Input common props | { autoComplete?: string } | - | 4.2.0 |
-| renderEmpty | Set empty content of components. Ref [Empty](/components/empty/) | function(componentName: string): ReactNode | - | |
| getPopupContainer | To set the container of the popup element. The default is to create a `div` element in `body` | function(triggerNode) | () => document.body | |
| getTargetContainer | Config Affix, Anchor scroll target container | () => HTMLElement | () => window | 4.2.0 |
-| locale | Language package setting, you can find the packages in [antd/es/locale](http://unpkg.com/antd/es/locale/) | object | - |
-| prefixCls | Set prefix className (cooperated with [@ant-prefix](https://github.com/ant-design/ant-design/blob/2c6c789e3a9356f96c47aea0083f5a15538315cf/components/style/themes/default.less#L7)) | string | `ant` | |
+| input | Set Input common props | { autoComplete?: string } | - | 4.2.0 |
+| locale | Language package setting, you can find the packages in [antd/es/locale](http://unpkg.com/antd/es/locale/) | object | - | |
| pageHeader | Unify the ghost of PageHeader, ref [PageHeader](/components/page-header) | { ghost: boolean } | true | |
-| direction | Set direction of layout. See [demo](#components-config-provider-demo-direction) | `ltr` \| `rtl` | `ltr` | |
+| prefixCls | Set prefix className (cooperated with [@ant-prefix](https://github.com/ant-design/ant-design/blob/2c6c789e3a9356f96c47aea0083f5a15538315cf/components/style/themes/default.less#L7)) | string | `ant` | |
+| renderEmpty | Set empty content of components. Ref [Empty](/components/empty/) | function(componentName: string): ReactNode | - | |
| space | Set Space `size`, ref [Space](/components/space) | { size: `small` \| `middle` \| `large` \| `number` } | - | 4.1.0 |
| virtual | Disable virtual scroll when set to `false` | boolean | - | 4.3.0 |
-| dropdownMatchSelectWidth | Determine whether the dropdown menu and the select input are the same width. Default set `min-width` same as input. Will ignore when value less than select width. `false` will disable virtual scroll | boolean \| number | - | 4.3.0 |
## FAQ
@@ -71,7 +71,7 @@ moment.locale('zh-cn');
#### Modal throw error when setting `getPopupContainer`?
-Related issue: https://github.com/ant-design/ant-design/issues/19974
+Related issue:
When you config `getPopupContainer` to parentNode globally, Modal will throw error of `triggerNode is undefined` because it did not have a triggerNode. You can try the [fix](https://github.com/afc163/feedback-antd/commit/3e4d1ad1bc1a38460dc3bf3c56517f737fe7d44a) below.
diff --git a/components/config-provider/index.zh-CN.md b/components/config-provider/index.zh-CN.md
index 560245c74a..107acdafef 100644
--- a/components/config-provider/index.zh-CN.md
+++ b/components/config-provider/index.zh-CN.md
@@ -42,18 +42,18 @@ export default () => (
| autoInsertSpaceInButton | 设置为 `false` 时,移除按钮中 2 个汉字之间的空格 | boolean | true | |
| componentSize | 设置 antd 组件大小 | `small` \| `middle` \| `large` | - | |
| csp | 设置 [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) 配置 | { nonce: string } | - | |
+| direction | 设置文本展示方向。 [示例](#components-config-provider-demo-direction) | `ltr` \| `rtl` | `ltr` | |
+| dropdownMatchSelectWidth | 下拉菜单和选择器同宽。默认将设置 `min-width`,当值小于选择框宽度时会被忽略。`false` 时会关闭虚拟滚动 | boolean \| number | - | 4.3.0 |
| form | 设置 Form 组件的通用属性 | { validateMessages?: [ValidateMessages](/components/form/#validateMessages) } | - | |
-| input | 设置 Input 组件的通用属性 | { autoComplete?: string } | - | 4.2.0 |
-| renderEmpty | 自定义组件空状态。参考 [空状态](/components/empty/) | function(componentName: string): ReactNode | - | |
| getPopupContainer | 弹出框(Select, Tooltip, Menu 等等)渲染父节点,默认渲染到 body 上。 | function(triggerNode) | () => document.body | |
| getTargetContainer | 配置 Affix、Anchor 滚动监听容器。 | () => HTMLElement | () => window | 4.2.0 |
+| input | 设置 Input 组件的通用属性 | { autoComplete?: string } | - | 4.2.0 |
| locale | 语言包配置,语言包可到 [antd/es/locale](http://unpkg.com/antd/es/locale/) 目录下寻找 | object | - | |
-| prefixCls | 设置统一样式前缀。注意:需要配合 `less` 变量 [@ant-prefix](https://github.com/ant-design/ant-design/blob/2c6c789e3a9356f96c47aea0083f5a15538315cf/components/style/themes/default.less#L7) 使用 | string | `ant` | |
| pageHeader | 统一设置 PageHeader 的 ghost,参考 [PageHeader](/components/page-header) | { ghost: boolean } | true | |
-| direction | 设置文本展示方向。 [示例](#components-config-provider-demo-direction) | `ltr` \| `rtl` | `ltr` | |
+| prefixCls | 设置统一样式前缀。注意:需要配合 `less` 变量 [@ant-prefix](https://github.com/ant-design/ant-design/blob/2c6c789e3a9356f96c47aea0083f5a15538315cf/components/style/themes/default.less#L7) 使用 | string | `ant` | |
+| renderEmpty | 自定义组件空状态。参考 [空状态](/components/empty/) | function(componentName: string): ReactNode | - | |
| space | 设置 Space 的 `size`,参考 [Space](/components/space) | { size: `small` \| `middle` \| `large` \| `number` } | - | 4.1.0 |
| virtual | 设置 `false` 时关闭虚拟滚动 | boolean | - | 4.3.0 |
-| dropdownMatchSelectWidth | 下拉菜单和选择器同宽。默认将设置 `min-width`,当值小于选择框宽度时会被忽略。`false` 时会关闭虚拟滚动 | boolean \| number | - | 4.3.0 |
## FAQ
@@ -72,7 +72,7 @@ moment.locale('zh-cn');
#### 配置 `getPopupContainer` 导致 Modal 报错?
-相关 issue:https://github.com/ant-design/ant-design/issues/19974
+相关 issue:
当如下全局设置 `getPopupContainer` 为触发节点的 parentNode 时,由于 Modal 的用法不存在 `triggerNode`,这样会导致 `triggerNode is undefined` 的报错,需要增加一个[判断条件](https://github.com/afc163/feedback-antd/commit/3e4d1ad1bc1a38460dc3bf3c56517f737fe7d44a)。
diff --git a/components/date-picker/__tests__/DatePicker.test.js b/components/date-picker/__tests__/DatePicker.test.js
index b1aa0d0e67..6d958e4ee5 100644
--- a/components/date-picker/__tests__/DatePicker.test.js
+++ b/components/date-picker/__tests__/DatePicker.test.js
@@ -138,6 +138,13 @@ describe('DatePicker', () => {
.length,
).toBe(60);
});
+ it('showTime should work correctly when format is custom function', () => {
+ const wrapper = mount(
+ val.format('YYYY-MM-DD')} open />,
+ );
+ const input = wrapper.find('input').simulate('mousedown');
+ expect(input.simulate.bind(input, 'focus')).not.toThrowError();
+ });
it('12 hours', () => {
const wrapper = mount(
diff --git a/components/date-picker/__tests__/other.test.js b/components/date-picker/__tests__/other.test.js
index 9ce8d91eab..c7bde7f6eb 100644
--- a/components/date-picker/__tests__/other.test.js
+++ b/components/date-picker/__tests__/other.test.js
@@ -43,27 +43,13 @@ describe('MonthPicker and WeekPicker', () => {
const birthday = moment('2000-01-01', 'YYYY-MM-DD').locale('zh-cn');
const wrapper = mount( );
wrapper.setProps({ value: birthday });
- expect(
- render(
- wrapper
- .find('Trigger')
- .instance()
- .getComponent(),
- ),
- ).toMatchSnapshot();
+ expect(render(wrapper.find('Trigger').instance().getComponent())).toMatchSnapshot();
});
it('render WeekPicker', () => {
const birthday = moment('2000-01-01', 'YYYY-MM-DD').locale('zh-cn');
const wrapper = mount( );
wrapper.setProps({ value: birthday });
- expect(
- render(
- wrapper
- .find('Trigger')
- .instance()
- .getComponent(),
- ),
- ).toMatchSnapshot();
+ expect(render(wrapper.find('Trigger').instance().getComponent())).toMatchSnapshot();
});
});
diff --git a/components/date-picker/__tests__/utils.js b/components/date-picker/__tests__/utils.js
index 51a4288601..a8062e5aff 100644
--- a/components/date-picker/__tests__/utils.js
+++ b/components/date-picker/__tests__/utils.js
@@ -18,10 +18,7 @@ export function openPanel(wrapper) {
}
export function clearInput(wrapper) {
- wrapper
- .find('.ant-calendar-picker-clear')
- .hostNodes()
- .simulate('click');
+ wrapper.find('.ant-calendar-picker-clear').hostNodes().simulate('click');
}
export function nextYear(wrapper) {
@@ -33,17 +30,10 @@ export function nextMonth(wrapper) {
}
export function openPicker(wrapper, index = 0) {
- wrapper
- .find('input')
- .at(index)
- .simulate('mousedown')
- .simulate('focus');
+ wrapper.find('input').at(index).simulate('mousedown').simulate('focus');
}
export function closePicker(wrapper, index = 0) {
- wrapper
- .find('input')
- .at(index)
- .simulate('blur');
+ wrapper.find('input').at(index).simulate('blur');
}
export function selectCell(wrapper, text, index = 0) {
diff --git a/components/date-picker/demo/select-in-range.md b/components/date-picker/demo/select-in-range.md
index 1295f62c54..c37cdeba7c 100644
--- a/components/date-picker/demo/select-in-range.md
+++ b/components/date-picker/demo/select-in-range.md
@@ -34,7 +34,9 @@ const App = () => {
{
- setDates(value);
+ const [start, end] = value;
+ const [oldStart, oldEnd] = dates;
+ setDates([start || oldStart, end || oldEnd]);
}}
/>
);
diff --git a/components/date-picker/generatePicker/index.tsx b/components/date-picker/generatePicker/index.tsx
index c0768780c4..9cef19dbbf 100644
--- a/components/date-picker/generatePicker/index.tsx
+++ b/components/date-picker/generatePicker/index.tsx
@@ -56,6 +56,11 @@ export function getTimeProps(
return showTimeObj;
}
+ if (typeof firstFormat === 'function') {
+ // format of showTime should use default when format is custom format function
+ delete showTimeObj.format;
+ }
+
return {
showTime: showTimeObj,
};
diff --git a/components/date-picker/index.en-US.md b/components/date-picker/index.en-US.md
index bc5f6b0493..8055495435 100644
--- a/components/date-picker/index.en-US.md
+++ b/components/date-picker/index.en-US.md
@@ -54,12 +54,14 @@ The following APIs are shared by DatePicker, RangePicker.
| --- | --- | --- | --- | --- |
| allowClear | Whether to show clear button | boolean | true | |
| autoFocus | If get focus when component mounted | boolean | false | |
+| bordered | Whether has border style | boolean | true | |
| className | The picker className | string | - | |
| dateRender | Custom rendering function for date cells | function(currentDate: moment, today: moment) => React.ReactNode | - | |
| disabled | Determine whether the DatePicker is disabled | boolean | false | |
| disabledDate | Specify the date that cannot be selected | (currentDate: moment) => boolean | - | |
| dropdownClassName | To customize the className of the popup calendar | string | - | |
| getPopupContainer | To set the container of the floating layer, while the default is to create a `div` element in `body` | function(trigger) | - | |
+| inputReadOnly | Set the `readonly` attribute of the input tag (avoids virtual keyboard on touch devices) | boolean | false | |
| locale | Localization configuration | object | [default](https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json) | |
| mode | The picker panel mode( [Cannot select year or month anymore?](/docs/react/faq#When-set-mode-to-DatePicker/RangePicker,-cannot-select-year-or-month-anymore?) ) | `time` \| `date` \| `month` \| `year` \| `decade` | - | |
| open | The open state of picker | boolean | - | |
@@ -68,29 +70,28 @@ The following APIs are shared by DatePicker, RangePicker.
| placeholder | The placeholder of date input | string \| \[string,string] | - | |
| popupStyle | To customize the style of the popup calendar | CSSProperties | {} | |
| size | The determine the size of the input box, the height of `large` and `small`, are 40px and 24px respectively, while default size is 32px | `large` \| `middle` \| `small` | - | |
-| bordered | Whether has border style | boolean | true | |
-| suffixIcon | The custom suffix icon | ReactNode | - | |
| style | To customize the style of the input box | CSSProperties | {} | |
+| suffixIcon | The custom suffix icon | ReactNode | - | |
| onOpenChange | Callback function, can be executed whether the popup calendar is popped up or closed | function(open) | - | |
| onPanelChange | Callback when picker panel mode is changed | function(value, mode) | - | |
-| inputReadOnly | Set the `readonly` attribute of the input tag (avoids virtual keyboard on touch devices) | boolean | false | |
### Common Methods
-| Name | Description | Version |
-| ------- | ------------ | ------- |
-| blur() | Remove focus | |
-| focus() | Get focus | |
+| Name | Description | Version |
+| --- | --- | --- |
+| blur() | Remove focus | |
+| focus() | Get focus | |
### DatePicker
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| defaultValue | To set default date, if start time or end time is null or undefined, the date range will be an open interval | [moment](http://momentjs.com/) | - | |
| defaultPickerValue | To set default picker date | [moment](http://momentjs.com/) | - | |
+| defaultValue | To set default date, if start time or end time is null or undefined, the date range will be an open interval | [moment](http://momentjs.com/) | - | |
| disabledTime | To specify the time that cannot be selected | function(date) | - | |
-| format | To set the date format, refer to [moment.js](http://momentjs.com/). When an array is provided, all values are used for parsing and first value is used for formatting, support [Custom Format](#components-date-picker-demo-format) | string \| (value: moment) => string \| (string \| (value: moment) => string)[] | `YYYY-MM-DD` | |
+| format | To set the date format, refer to [moment.js](http://momentjs.com/). When an array is provided, all values are used for parsing and first value is used for formatting, support [Custom Format](#components-date-picker-demo-format) | string \| (value: moment) => string \| (string \| (value: moment) => string)\[] | `YYYY-MM-DD` | |
| renderExtraFooter | Render extra footer in panel | (mode) => React.ReactNode | - | |
+| showNow | Whether to show 'Now' button on panel when `showTime` is set | boolean | - | 4.4.0 |
| showTime | To provide an additional time selection | object \| boolean | [TimePicker Options](/components/time-picker/#API) | |
| showTime.defaultValue | To set default time of selected date, [demo](#components-date-picker-demo-disabled-date) | [moment](http://momentjs.com/) | moment() | |
| showToday | Whether to show `Today` button | boolean | true | |
@@ -98,14 +99,13 @@ The following APIs are shared by DatePicker, RangePicker.
| onChange | Callback function, can be executed when the selected time is changing | function(date: moment, dateString: string) | - | |
| onOk | Callback when click ok button | function() | - | |
| onPanelChange | Callback function for panel changing | function(value, mode) | - | |
-| showNow | Whether to show 'Now' button on panel when `showTime` is set | boolean | - | 4.4.0 |
### DatePicker\[picker=year]
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| defaultValue | To set default date | [moment](http://momentjs.com/) | - | |
| defaultPickerValue | To set default picker date | [moment](http://momentjs.com/) | - | |
+| defaultValue | To set default date | [moment](http://momentjs.com/) | - | |
| format | To set the date format, refer to [moment.js](http://momentjs.com/) | string | `YYYY` | |
| renderExtraFooter | Render extra footer in panel | () => React.ReactNode | - | |
| value | To set date | [moment](http://momentjs.com/) | - | |
@@ -117,8 +117,8 @@ Added in `4.1.0`.
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| defaultValue | To set default date | [moment](http://momentjs.com/) | - | |
| defaultPickerValue | To set default picker date | [moment](http://momentjs.com/) | - | |
+| defaultValue | To set default date | [moment](http://momentjs.com/) | - | |
| format | To set the date format, refer to [moment.js](http://momentjs.com/) | string | `YYYY-\QQ` | |
| renderExtraFooter | Render extra footer in panel | () => React.ReactNode | - | |
| value | To set date | [moment](http://momentjs.com/) | - | |
@@ -128,8 +128,8 @@ Added in `4.1.0`.
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| defaultValue | To set default date | [moment](http://momentjs.com/) | - | |
| defaultPickerValue | To set default picker date | [moment](http://momentjs.com/) | - | |
+| defaultValue | To set default date | [moment](http://momentjs.com/) | - | |
| format | To set the date format, refer to [moment.js](http://momentjs.com/) | string | `YYYY-MM` | |
| monthCellRender | Custom month cell content render method | function(date, locale): ReactNode | - | |
| renderExtraFooter | Render extra footer in panel | () => React.ReactNode | - | |
@@ -140,12 +140,12 @@ Added in `4.1.0`.
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| defaultValue | To set default date | [moment](http://momentjs.com/) | - | |
| defaultPickerValue | To set default picker date | [moment](http://momentjs.com/) | - | |
+| defaultValue | To set default date | [moment](http://momentjs.com/) | - | |
| format | To set the date format, refer to [moment.js](http://momentjs.com/) | string | `YYYY-wo` | |
+| renderExtraFooter | Render extra footer in panel | (mode) => React.ReactNode | - | |
| value | To set date | [moment](http://momentjs.com/) | - | |
| onChange | Callback function, can be executed when the selected time is changing | function(date: moment, dateString: string) | - | |
-| renderExtraFooter | Render extra footer in panel | (mode) => React.ReactNode | - | |
### RangePicker
@@ -153,11 +153,11 @@ Added in `4.1.0`.
| --- | --- | --- | --- | --- |
| allowEmpty | Allow start or end input leave empty | \[boolean, boolean] | \[false, false] | |
| dateRender | Customize date cell. `info` argument is added in 4.3.0 | function(currentDate: moment, today: moment, info: { range: `start` \| `end` }) => React.ReactNode | - | |
+| defaultPickerValue | To set default picker date | \[[moment](http://momentjs.com/), [moment](http://momentjs.com/)] | - | |
| defaultValue | To set default date | \[[moment](http://momentjs.com/), [moment](http://momentjs.com/)] | - | |
-| defaultPickerValue | To set default picker date | \[[moment](http://momentjs.com/), [moment](http://momentjs.com/)\] | - | |
| disabled | If disable start or end | \[boolean, boolean] | - | |
| disabledTime | To specify the time that cannot be selected | function(date: moment, partial: `start` \| `end`) | - | |
-| format | To set the date format, refer to [moment.js](http://momentjs.com/). When an array is provided, all values are used for parsing and first value is used for formatting | string \| string[] | `YYYY-MM-DD HH:mm:ss` | |
+| format | To set the date format, refer to [moment.js](http://momentjs.com/). When an array is provided, all values are used for parsing and first value is used for formatting | string \| string\[] | `YYYY-MM-DD HH:mm:ss` | |
| ranges | The preseted ranges for quick selection | { \[range: string]: [moment](http://momentjs.com/)\[] } \| { \[range: string]: () => [moment](http://momentjs.com/)\[] } | - | |
| renderExtraFooter | Render extra footer in panel | () => React.ReactNode | - | |
| separator | Set separator between inputs | string | `~` | |
@@ -183,7 +183,11 @@ DatePicker default set `locale` as `en` in v4. You can config DatePicker `locale
### How to modify start day of week?
-Please use correct [language](/docs/react/i18n) ([#5605](https://github.com/ant-design/ant-design/issues/5605)), or update moment `locale` config: https://codesandbox.io/s/moment-day-of-week-6dby5
+Please use correct [language](/docs/react/i18n) ([#5605](https://github.com/ant-design/ant-design/issues/5605)), or update moment `locale` config:
+
+### Why origin panel don't switch when using `panelRender`?
+
+When you change the layout of nodes by `panelRender`, React will unmount and re-mount it which reset the component state. You should keep the layout stable. Please ref [#27263](https://github.com/ant-design/ant-design/issues/27263) for more info.
```js
moment.locale('en', {
diff --git a/components/date-picker/index.zh-CN.md b/components/date-picker/index.zh-CN.md
index 8f6a50dfa4..93b8686b9f 100644
--- a/components/date-picker/index.zh-CN.md
+++ b/components/date-picker/index.zh-CN.md
@@ -55,12 +55,14 @@ import locale from 'antd/es/locale/zh_CN';
| --- | --- | --- | --- | --- |
| allowClear | 是否显示清除按钮 | boolean | true | |
| autoFocus | 自动获取焦点 | boolean | false | |
+| bordered | 是否有边框 | boolean | true | |
| className | 选择器 className | string | - | |
| dateRender | 自定义日期单元格的内容 | function(currentDate: moment, today: moment) => React.ReactNode | - | |
| disabled | 禁用 | boolean | false | |
| disabledDate | 不可选择的日期 | (currentDate: moment) => boolean | - | |
| dropdownClassName | 额外的弹出日历 className | string | - | |
| getPopupContainer | 定义浮层的容器,默认为 body 上新建 div | function(trigger) | - | |
+| inputReadOnly | 设置输入框为只读(避免在移动设备上打开虚拟键盘) | boolean | false | |
| locale | 国际化配置 | object | [默认配置](https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json) | |
| mode | 日期面板的状态([设置后无法选择年份/月份?](/docs/react/faq#当我指定了-DatePicker/RangePicker-的-mode-属性后,点击后无法选择年份/月份?)) | `time` \| `date` \| `month` \| `year` \| `decade` | - | |
| open | 控制弹层是否展开 | boolean | - | |
@@ -69,29 +71,28 @@ import locale from 'antd/es/locale/zh_CN';
| placeholder | 输入框提示文字 | string \| \[string, string] | - | |
| popupStyle | 额外的弹出日历样式 | CSSProperties | {} | |
| size | 输入框大小,`large` 高度为 40px,`small` 为 24px,默认是 32px | `large` \| `middle` \| `small` | - | |
-| bordered | 是否有边框 | boolean | true | |
-| suffixIcon | 自定义的选择框后缀图标 | ReactNode | - | |
| style | 自定义输入框样式 | CSSProperties | {} | |
+| suffixIcon | 自定义的选择框后缀图标 | ReactNode | - | |
| onOpenChange | 弹出日历和关闭日历的回调 | function(open) | - | |
| onPanelChange | 日历面板切换的回调 | function(value, mode) | - | |
-| inputReadOnly | 设置输入框为只读(避免在移动设备上打开虚拟键盘) | boolean | false | |
### 共同的方法
-| 名称 | 描述 | 版本 |
-| ------- | -------- | ---- |
-| blur() | 移除焦点 | |
-| focus() | 获取焦点 | |
+| 名称 | 描述 | 版本 |
+| --- | --- | --- |
+| blur() | 移除焦点 | |
+| focus() | 获取焦点 | |
### DatePicker
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| defaultValue | 默认日期,如果开始时间或结束时间为 `null` 或者 `undefined`,日期范围将是一个开区间 | [moment](http://momentjs.com/) | - | |
| defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | - | |
+| defaultValue | 默认日期,如果开始时间或结束时间为 `null` 或者 `undefined`,日期范围将是一个开区间 | [moment](http://momentjs.com/) | - | |
| disabledTime | 不可选择的时间 | function(date) | - | |
-| format | 设置日期格式,为数组时支持多格式匹配,展示以第一个为准。配置参考 [moment.js](http://momentjs.com/),支持[自定义格式](#components-date-picker-demo-format) | string \| (value: moment) => string \| (string \| (value: moment) => string)[] | `YYYY-MM-DD` | |
+| format | 设置日期格式,为数组时支持多格式匹配,展示以第一个为准。配置参考 [moment.js](http://momentjs.com/),支持[自定义格式](#components-date-picker-demo-format) | string \| (value: moment) => string \| (string \| (value: moment) => string)\[] | `YYYY-MM-DD` | |
| renderExtraFooter | 在面板中添加额外的页脚 | (mode) => React.ReactNode | - | |
+| showNow | 当设定了 `showTime` 的时候,面板是否显示“此刻”按钮 | boolean | - | 4.4.0 |
| showTime | 增加时间选择功能 | Object \| boolean | [TimePicker Options](/components/time-picker/#API) | |
| showTime.defaultValue | 设置用户选择日期时默认的时分秒,[例子](#components-date-picker-demo-disabled-date) | [moment](http://momentjs.com/) | moment() | |
| showToday | 是否展示“今天”按钮 | boolean | true | |
@@ -99,14 +100,13 @@ import locale from 'antd/es/locale/zh_CN';
| onChange | 时间发生变化的回调 | function(date: moment, dateString: string) | - | |
| onOk | 点击确定按钮的回调 | function() | - | |
| onPanelChange | 日期面板变化时的回调 | function(value, mode) | - | |
-| showNow | 当设定了 `showTime` 的时候,面板是否显示“此刻”按钮 | boolean | - | 4.4.0 |
### DatePicker\[picker=year]
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| defaultValue | 默认日期 | [moment](http://momentjs.com/) | - | |
| defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | - | |
+| defaultValue | 默认日期 | [moment](http://momentjs.com/) | - | |
| format | 展示的日期格式,配置参考 [moment.js](http://momentjs.com/) | string | `YYYY` | |
| renderExtraFooter | 在面板中添加额外的页脚 | () => React.ReactNode | - | |
| value | 日期 | [moment](http://momentjs.com/) | - | |
@@ -118,8 +118,8 @@ import locale from 'antd/es/locale/zh_CN';
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| defaultValue | 默认日期 | [moment](http://momentjs.com/) | - | |
| defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | - | |
+| defaultValue | 默认日期 | [moment](http://momentjs.com/) | - | |
| format | 展示的日期格式,配置参考 [moment.js](http://momentjs.com/) | string | `YYYY-\QQ` | |
| renderExtraFooter | 在面板中添加额外的页脚 | () => React.ReactNode | - | |
| value | 日期 | [moment](http://momentjs.com/) | - | |
@@ -129,8 +129,8 @@ import locale from 'antd/es/locale/zh_CN';
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| defaultValue | 默认日期 | [moment](http://momentjs.com/) | - | |
| defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | - | |
+| defaultValue | 默认日期 | [moment](http://momentjs.com/) | - | |
| format | 展示的日期格式,配置参考 [moment.js](http://momentjs.com/) | string | `YYYY-MM` | |
| monthCellRender | 自定义的月份内容渲染方法 | function(date, locale): ReactNode | - | |
| renderExtraFooter | 在面板中添加额外的页脚 | () => React.ReactNode | - | |
@@ -141,12 +141,12 @@ import locale from 'antd/es/locale/zh_CN';
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| defaultValue | 默认日期 | [moment](http://momentjs.com/) | - | |
| defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | - | |
+| defaultValue | 默认日期 | [moment](http://momentjs.com/) | - | |
| format | 展示的日期格式,配置参考 [moment.js](http://momentjs.com/) | string | `YYYY-wo` | |
+| renderExtraFooter | 在面板中添加额外的页脚 | (mode) => React.ReactNode | - | |
| value | 日期 | [moment](http://momentjs.com/) | - | |
| onChange | 时间发生变化的回调,发生在用户选择时间时 | function(date: moment, dateString: string) | - | |
-| renderExtraFooter | 在面板中添加额外的页脚 | (mode) => React.ReactNode | - | |
### RangePicker
@@ -154,8 +154,8 @@ import locale from 'antd/es/locale/zh_CN';
| --- | --- | --- | --- | --- |
| allowEmpty | 允许起始项部分为空 | \[boolean, boolean] | \[false, false] | |
| dateRender | 自定义日期单元格的内容。`info` 参数自 4.3.0 添加 | function(currentDate: moment, today: moment, info: { range: `start` \| `end` }) => React.ReactNode | - | |
-| defaultValue | 默认日期 | [moment](http://momentjs.com/)\[] | - | |
| defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/)\[] | - | |
+| defaultValue | 默认日期 | [moment](http://momentjs.com/)\[] | - | |
| disabled | 禁用起始项 | \[boolean, boolean] | - | |
| disabledTime | 不可选择的时间 | function(date: moment, partial: `start` \| `end`) | - | |
| format | 展示的日期格式 | string | `YYYY-MM-DD HH:mm:ss` | |
@@ -165,8 +165,8 @@ import locale from 'antd/es/locale/zh_CN';
| showTime | 增加时间选择功能 | Object\|boolean | [TimePicker Options](/components/time-picker/#API) | |
| showTime.defaultValue | 设置用户选择日期时默认的时分秒,[例子](#components-date-picker-demo-disabled-date) | [moment](http://momentjs.com/)\[] | \[moment(), moment()] | |
| value | 日期 | [moment](http://momentjs.com/)\[] | - | |
-| onCalendarChange | 待选日期发生变化的回调。`info` 参数自 4.4.0 添加 | function(dates: \[moment, moment\], dateStrings: \[string, string\], info: { range:`start`\|`end` }) | - | |
-| onChange | 日期范围发生变化的回调 | function(dates: \[moment, moment\], dateStrings: \[string, string\]) | - | |
+| onCalendarChange | 待选日期发生变化的回调。`info` 参数自 4.4.0 添加 | function(dates: \[moment, moment], dateStrings: \[string, string], info: { range:`start`\|`end` }) | - | |
+| onChange | 日期范围发生变化的回调 | function(dates: \[moment, moment], dateStrings: \[string, string]) | - | |
## FAQ
@@ -184,7 +184,11 @@ v4 中,DatePicker 默认 `locale` 为 `en`。你可以通过 DatePicker 的 `l
### 如何修改周的起始日?
-请使用正确的[语言包](/docs/react/i18n)([#5605](https://github.com/ant-design/ant-design/issues/5605)),或者修改 moment 的 `locale` 配置:https://codesandbox.io/s/moment-day-of-week-6dby5
+请使用正确的[语言包](/docs/react/i18n)([#5605](https://github.com/ant-design/ant-design/issues/5605)),或者修改 moment 的 `locale` 配置:
+
+### 为何使用 `panelRender` 时,原来面板无法切换?
+
+当你通过 `panelRender` 动态改变层级结构时,会使得原本的 Panel 被当做新的节点删除并创建。这使得其原本的状态会被重置,保持结构稳定即可。详情请参考 [#27263](https://github.com/ant-design/ant-design/issues/27263)。
```js
moment.locale('en', {
diff --git a/components/descriptions/index.en-US.md b/components/descriptions/index.en-US.md
index 32bd3ad5d7..11a48edd1c 100644
--- a/components/descriptions/index.en-US.md
+++ b/components/descriptions/index.en-US.md
@@ -18,19 +18,19 @@ Commonly displayed on the details page.
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| title | The title of the description list, placed at the top | ReactNode | - | |
-| extra | The action area of the description list, placed at the top-right | ReactNode | - | 4.5.0 |
| bordered | Whether to display the border | boolean | false | |
-| column | The number of `DescriptionItems` in a row,could be a number or a object like `{ xs: 8, sm: 16, md: 24}`,(Only set `bordered={true}` to take effect) | number | 3 | |
-| size | Set the size of the list. Can be set to `middle`,`small`, or not filled | `default` \| `middle` \| `small` | - | |
-| layout | Define description layout | `horizontal` \| `vertical` | `horizontal` | |
| colon | Change default props `colon` value of Descriptions.Item | boolean | true | |
+| column | The number of `DescriptionItems` in a row,could be a number or a object like `{ xs: 8, sm: 16, md: 24}`,(Only set `bordered={true}` to take effect) | number | 3 | |
+| extra | The action area of the description list, placed at the top-right | ReactNode | - | 4.5.0 |
+| layout | Define description layout | `horizontal` \| `vertical` | `horizontal` | |
+| size | Set the size of the list. Can be set to `middle`,`small`, or not filled | `default` \| `middle` \| `small` | - | |
+| title | The title of the description list, placed at the top | ReactNode | - | |
### DescriptionItem
-| Property | Description | Type | Default | Version |
-| -------- | ------------------------------ | --------- | ------- | ------- |
-| label | The description of the content | ReactNode | - | |
-| span | The number of columns included | number | 1 | |
+| Property | Description | Type | Default | Version |
+| --- | --- | --- | --- | --- |
+| label | The description of the content | ReactNode | - | |
+| span | The number of columns included | number | 1 | |
> The number of span Description.Item. Span={2} takes up the width of two DescriptionItems.
diff --git a/components/descriptions/index.zh-CN.md b/components/descriptions/index.zh-CN.md
index c2b9da0d4c..bb2d6c0bbb 100644
--- a/components/descriptions/index.zh-CN.md
+++ b/components/descriptions/index.zh-CN.md
@@ -19,19 +19,19 @@ cover: https://gw.alipayobjects.com/zos/alicdn/MjtG9_FOI/Descriptions.svg
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| title | 描述列表的标题,显示在最顶部 | ReactNode | - | |
-| extra | 描述列表的操作区域,显示在右上方 | ReactNode | - | 4.5.0 |
| bordered | 是否展示边框 | boolean | false | |
-| column | 一行的 `DescriptionItems` 数量,可以写成像素值或支持响应式的对象写法 `{ xs: 8, sm: 16, md: 24}` | number | 3 | |
-| size | 设置列表的大小。可以设置为 `middle` 、`small`, 或不填(只有设置 `bordered={true}` 生效) | `default` \| `middle` \| `small` | - | |
-| layout | 描述布局 | `horizontal` \| `vertical` | `horizontal` | |
| colon | 配置 `Descriptions.Item` 的 `colon` 的默认值 | boolean | true | |
+| column | 一行的 `DescriptionItems` 数量,可以写成像素值或支持响应式的对象写法 `{ xs: 8, sm: 16, md: 24}` | number | 3 | |
+| extra | 描述列表的操作区域,显示在右上方 | ReactNode | - | 4.5.0 |
+| layout | 描述布局 | `horizontal` \| `vertical` | `horizontal` | |
+| size | 设置列表的大小。可以设置为 `middle` 、`small`, 或不填(只有设置 `bordered={true}` 生效) | `default` \| `middle` \| `small` | - | |
+| title | 描述列表的标题,显示在最顶部 | ReactNode | - | |
### DescriptionItem
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| ----- | ------------ | --------- | ------ | ---- |
-| label | 内容的描述 | ReactNode | - | |
-| span | 包含列的数量 | number | 1 | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| label | 内容的描述 | ReactNode | - | |
+| span | 包含列的数量 | number | 1 | |
> span 是 Description.Item 的数量。 span={2} 会占用两个 DescriptionItem 的宽度。
diff --git a/components/descriptions/style/index.less b/components/descriptions/style/index.less
index e2f26f670c..a945a58172 100644
--- a/components/descriptions/style/index.less
+++ b/components/descriptions/style/index.less
@@ -86,6 +86,7 @@
color: @text-color;
font-size: @font-size-base;
line-height: @line-height-base;
+ word-break: break-word;
overflow-wrap: break-word;
}
diff --git a/components/divider/index.zh-CN.md b/components/divider/index.zh-CN.md
index 19d81b8830..8d9e4811c2 100644
--- a/components/divider/index.zh-CN.md
+++ b/components/divider/index.zh-CN.md
@@ -15,11 +15,11 @@ cover: https://gw.alipayobjects.com/zos/alicdn/5swjECahe/Divider.svg
## API
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| ----------- | -------------------------- | ----------------------------- | ------------ | ----- |
-| className | 分割线样式类 | string | - | |
-| dashed | 是否虚线 | boolean | false | |
-| orientation | 分割线标题的位置 | `left` \| `right` \| `center` | `center` | |
-| plain | 文字是否显示为普通正文样式 | boolean | false | 4.2.0 |
-| style | 分割线样式对象 | CSSProperties | - | |
-| type | 水平还是垂直类型 | `horizontal` \| `vertical` | `horizontal` | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| className | 分割线样式类 | string | - | |
+| dashed | 是否虚线 | boolean | false | |
+| orientation | 分割线标题的位置 | `left` \| `right` \| `center` | `center` | |
+| plain | 文字是否显示为普通正文样式 | boolean | false | 4.2.0 |
+| style | 分割线样式对象 | CSSProperties | - | |
+| type | 水平还是垂直类型 | `horizontal` \| `vertical` | `horizontal` | |
diff --git a/components/drawer/__tests__/__snapshots__/Drawer.test.js.snap b/components/drawer/__tests__/__snapshots__/Drawer.test.js.snap
index 5501c64ae1..12943d828a 100644
--- a/components/drawer/__tests__/__snapshots__/Drawer.test.js.snap
+++ b/components/drawer/__tests__/__snapshots__/Drawer.test.js.snap
@@ -29,6 +29,7 @@ exports[`Drawer className is test_drawer 1`] = `
aria-label="Close"
class="ant-drawer-close"
style="--scroll-bar:0px"
+ type="button"
>
close
diff --git a/components/drawer/__tests__/__snapshots__/DrawerEvent.test.js.snap b/components/drawer/__tests__/__snapshots__/DrawerEvent.test.js.snap
index 1f1f021968..1cdb5e7f3d 100644
--- a/components/drawer/__tests__/__snapshots__/DrawerEvent.test.js.snap
+++ b/components/drawer/__tests__/__snapshots__/DrawerEvent.test.js.snap
@@ -37,6 +37,7 @@ exports[`Drawer render correctly 1`] = `
aria-label="Close"
class="ant-drawer-close"
style="--scroll-bar: 0px;"
+ type="button"
>
|
-| destroyOnClose | Whether to unmount child components on closing drawer or not | boolean | false |
-| forceRender | Prerender Drawer component forcely | boolean | false |
-| getContainer | Return the mounted node for Drawer | HTMLElement \| () => HTMLElement \| Selectors \| false | body |
-| mask | Whether to show mask or not | boolean | true |
-| maskClosable | Clicking on the mask (area outside the Drawer) to close the Drawer or not | boolean | true |
-| maskStyle | Style for Drawer's mask element | CSSProperties | {} |
-| style | Style of wrapper element which **contains mask** compare to `drawerStyle` | CSSProperties | - |
-| drawerStyle | Style of the popup layer element | object | - |
-| headerStyle | Style of the drawer header part | object | - |
-| bodyStyle | Style of the drawer content part | object | - |
-| title | The title for Drawer | ReactNode | - |
-| visible | Whether the Drawer dialog is visible or not | boolean | false |
-| width | Width of the Drawer dialog | string \| number | 256 |
-| height | Placement is `top` or `bottom`, height of the Drawer dialog | string \| number | 256 |
-| className | The class name of the container of the Drawer dialog | string | - |
-| zIndex | The `z-index` of the Drawer | number | 1000 |
-| placement | The placement of the Drawer | `top` \| `right` \| `bottom` \| `left` | `right` |
-| onClose | Specify a callback that will be called when a user clicks mask, close button or Cancel button | function(e) | - |
-| afterVisibleChange | Callback after the animation ends when switching drawers | function(visible) | - |
-| keyboard | Whether support press esc to close | boolean | true |
-| footer | The footer for Drawer | ReactNode | - |
-| footerStyle | Style of the drawer footer part | CSSProperties | - |
+| afterVisibleChange | Callback after the animation ends when switching drawers | function(visible) | - | |
+| bodyStyle | Style of the drawer content part | object | - | |
+| className | The class name of the container of the Drawer dialog | string | - | |
+| closable | Whether a close (x) button is visible on top right of the Drawer dialog or not | boolean | true | |
+| closeIcon | Custom close icon | ReactNode | <CloseOutlined /> | |
+| destroyOnClose | Whether to unmount child components on closing drawer or not | boolean | false | |
+| drawerStyle | Style of the popup layer element | object | - | |
+| footer | The footer for Drawer | ReactNode | - | |
+| footerStyle | Style of the drawer footer part | CSSProperties | - | |
+| forceRender | Prerender Drawer component forcely | boolean | false | |
+| getContainer | Return the mounted node for Drawer | HTMLElement \| () => HTMLElement \| Selectors \| false | body | |
+| headerStyle | Style of the drawer header part | object | - | |
+| height | Placement is `top` or `bottom`, height of the Drawer dialog | string \| number | 256 | |
+| keyboard | Whether support press esc to close | boolean | true | |
+| mask | Whether to show mask or not | boolean | true | |
+| maskClosable | Clicking on the mask (area outside the Drawer) to close the Drawer or not | boolean | true | |
+| maskStyle | Style for Drawer's mask element | CSSProperties | {} | |
+| placement | The placement of the Drawer | `top` \| `right` \| `bottom` \| `left` | `right` | |
| push | Nested drawers push behavior | boolean \| { distance: string \| number } | { distance: 180 } | 4.5.0+ |
+| style | Style of wrapper element which **contains mask** compare to `drawerStyle` | CSSProperties | - | |
+| title | The title for Drawer | ReactNode | - | |
+| visible | Whether the Drawer dialog is visible or not | boolean | false | |
+| width | Width of the Drawer dialog | string \| number | 256 | |
+| zIndex | The `z-index` of the Drawer | number | 1000 | |
+| onClose | Specify a callback that will be called when a user clicks mask, close button or Cancel button | function(e) | - | |
diff --git a/components/drawer/index.tsx b/components/drawer/index.tsx
index c6b41d4fc1..659a2e13ac 100644
--- a/components/drawer/index.tsx
+++ b/components/drawer/index.tsx
@@ -218,8 +218,8 @@ class Drawer extends React.Component , prefixCls, onClose } = this.props;
return (
closable && (
- // eslint-disable-next-line react/button-has-type
|
-| destroyOnClose | 关闭时销毁 Drawer 里的子元素 | boolean | false |
-| forceRender | 预渲染 Drawer 内元素 | boolean | false |
-| getContainer | 指定 Drawer 挂载的 HTML 节点, false 为挂载在当前 dom | HTMLElement \| () => HTMLElement \| Selectors \| false | body |
-| maskClosable | 点击蒙层是否允许关闭 | boolean | true |
-| mask | 是否展示遮罩 | boolean | true |
-| maskStyle | 遮罩样式 | CSSProperties | {} |
-| style | 可用于设置 Drawer 最外层容器的样式,和 `drawerStyle` 的区别是作用节点包括 `mask` | CSSProperties | - |
-| drawerStyle | 用于设置 Drawer 弹出层的样式 | CSSProperties | - |
-| headerStyle | 用于设置 Drawer 头部的样式 | CSSProperties | - |
-| bodyStyle | 可用于设置 Drawer 内容部分的样式 | CSSProperties | - |
-| title | 标题 | ReactNode | - |
-| visible | Drawer 是否可见 | boolean | - |
-| width | 宽度 | string \| number | 256 |
-| height | 高度, 在 `placement` 为 `top` 或 `bottom` 时使用 | string \| number | 256 |
-| className | 对话框外层容器的类名 | string | - |
-| zIndex | 设置 Drawer 的 `z-index` | number | 1000 |
-| placement | 抽屉的方向 | `top` \| `right` \| `bottom` \| `left` | `right` |
-| onClose | 点击遮罩层或右上角叉或取消按钮的回调 | function(e) | - |
-| afterVisibleChange | 切换抽屉时动画结束后的回调 | function(visible) | - |
-| keyboard | 是否支持键盘 esc 关闭 | boolean | true |
-| footer | 抽屉的页脚 | ReactNode | - |
-| footerStyle | 抽屉页脚部件的样式 | CSSProperties | - |
+| afterVisibleChange | 切换抽屉时动画结束后的回调 | function(visible) | - | |
+| bodyStyle | 可用于设置 Drawer 内容部分的样式 | CSSProperties | - | |
+| className | 对话框外层容器的类名 | string | - | |
+| closable | 是否显示右上角的关闭按钮 | boolean | true | |
+| closeIcon | 自定义关闭图标 | ReactNode | <CloseOutlined /> | |
+| destroyOnClose | 关闭时销毁 Drawer 里的子元素 | boolean | false | |
+| drawerStyle | 用于设置 Drawer 弹出层的样式 | CSSProperties | - | |
+| footer | 抽屉的页脚 | ReactNode | - | |
+| footerStyle | 抽屉页脚部件的样式 | CSSProperties | - | |
+| forceRender | 预渲染 Drawer 内元素 | boolean | false | |
+| getContainer | 指定 Drawer 挂载的 HTML 节点, false 为挂载在当前 dom | HTMLElement \| () => HTMLElement \| Selectors \| false | body | |
+| headerStyle | 用于设置 Drawer 头部的样式 | CSSProperties | - | |
+| height | 高度, 在 `placement` 为 `top` 或 `bottom` 时使用 | string \| number | 256 | |
+| keyboard | 是否支持键盘 esc 关闭 | boolean | true | |
+| mask | 是否展示遮罩 | boolean | true | |
+| maskClosable | 点击蒙层是否允许关闭 | boolean | true | |
+| maskStyle | 遮罩样式 | CSSProperties | {} | |
+| placement | 抽屉的方向 | `top` \| `right` \| `bottom` \| `left` | `right` | |
| push | 用于设置多层 Drawer 的推动行为 | boolean \| { distance: string \| number } | { distance: 180 } | 4.5.0+ |
+| style | 可用于设置 Drawer 最外层容器的样式,和 `drawerStyle` 的区别是作用节点包括 `mask` | CSSProperties | - | |
+| title | 标题 | ReactNode | - | |
+| visible | Drawer 是否可见 | boolean | - | |
+| width | 宽度 | string \| number | 256 | |
+| zIndex | 设置 Drawer 的 `z-index` | number | 1000 | |
+| onClose | 点击遮罩层或右上角叉或取消按钮的回调 | function(e) | - | |
diff --git a/components/dropdown/index.en-US.md b/components/dropdown/index.en-US.md
index 49e9d6f3c7..e8a54c5269 100644
--- a/components/dropdown/index.en-US.md
+++ b/components/dropdown/index.en-US.md
@@ -19,14 +19,14 @@ When there are more than a few options to choose from, you can wrap them in a `D
| --- | --- | --- | --- | --- |
| arrow | Whether the dropdown arrow should be visible | boolean | false | |
| disabled | Whether the dropdown menu is disabled | boolean | - | |
-| getPopupContainer | To set the container of the dropdown menu. The default is to create a div element in body, but you can reset it to the scrolling area and make a relative reposition. [Example on CodePen](https://codepen.io/afc163/pen/zEjNOy?editors=0010) | function(triggerNode) | () => document.body | |
+| getPopupContainer | To set the container of the dropdown menu. The default is to create a div element in body, but you can reset it to the scrolling area and make a relative reposition. [Example on CodePen](https://codepen.io/afc163/pen/zEjNOy?editors=0010) | (triggerNode: HTMLElement) => HTMLElement | () => document.body | |
| overlay | The dropdown menu | [Menu](/components/menu) \| () => Menu | - | |
| overlayClassName | The class name of the dropdown root element | string | - | |
-| overlayStyle | The style of the dropdown root element | object | - | |
-| onVisibleChange | Called when the visible state is changed | function(visible) | - | |
+| overlayStyle | The style of the dropdown root element | CSSProperties | - | |
| placement | Placement of popup menu: `bottomLeft`, `bottomCenter`, `bottomRight`, `topLeft`, `topCenter` or `topRight` | string | `bottomLeft` | |
| trigger | The trigger mode which executes the dropdown action. Note that hover can't be used on touchscreens | Array<`click`\|`hover`\|`contextMenu`> | \[`hover`] | |
| visible | Whether the dropdown menu is currently visible | boolean | - | |
+| onVisibleChange | Called when the visible state is changed | (visible: boolean) => void | - | |
You should use [Menu](/components/menu/) as `overlay`. The menu items and dividers are also available by using `Menu.Item` and `Menu.Divider`.
@@ -38,14 +38,14 @@ You should use [Menu](/components/menu/) as `overlay`. The menu items and divide
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| buttonsRender | Custom buttons inside Dropdown.Button | ([buttons: ReactNode[]]) => ReactNode | - | |
+| buttonsRender | Custom buttons inside Dropdown.Button | (buttons: ReactNode\[]) => ReactNode\[] | - | |
| disabled | Whether the dropdown menu is disabled | boolean | - | |
| icon | Icon (appears on the right) | ReactNode | - | |
-| onClick | The same as [Button](/components/button): called when you click the button on the left | function | - | |
-| onVisibleChange | Called when the visible state is changed | function | - | |
| overlay | The dropdown menu | [Menu](/components/menu) | - | |
| placement | Placement of popup menu: `bottomLeft` `bottomCenter` `bottomRight` `topLeft` `topCenter` `topRight` | string | `bottomLeft` | |
-| size | Size of the button, the same as [Button](/components/button) | string | `default` | |
+| size | Size of the button, the same as [Button](/components/button/#API) | string | `default` | |
| trigger | The trigger mode which executes the dropdown action | Array<`click`\|`hover`\|`contextMenu`> | \[`hover`] | |
-| type | Type of the button, the same as [Button](/components/button) | string | `default` | |
+| type | Type of the button, the same as [Button](/components/button/#API) | string | `default` | |
| visible | Whether the dropdown menu is currently visible | boolean | - | |
+| onClick | The same as [Button](/components/button/#API): called when you click the button on the left | (event) => void | - | |
+| onVisibleChange | Called when the visible state is changed | (visible: boolean) => void | - | |
diff --git a/components/dropdown/index.zh-CN.md b/components/dropdown/index.zh-CN.md
index 53210e9f4f..239f01cc04 100644
--- a/components/dropdown/index.zh-CN.md
+++ b/components/dropdown/index.zh-CN.md
@@ -23,14 +23,14 @@ cover: https://gw.alipayobjects.com/zos/alicdn/eedWN59yJ/Dropdown.svg
| --- | --- | --- | --- | --- |
| arrow | 下拉框箭头是否显示 | boolean | false | |
| disabled | 菜单是否禁用 | boolean | - | |
-| getPopupContainer | 菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位。[示例](https://codepen.io/afc163/pen/zEjNOy?editors=0010) | function(triggerNode) | () => document.body | |
+| getPopupContainer | 菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位。[示例](https://codepen.io/afc163/pen/zEjNOy?editors=0010) | (triggerNode: HTMLElement) => HTMLElement | () => document.body | |
| overlay | 菜单 | [Menu](/components/menu) \| () => Menu | - | |
| overlayClassName | 下拉根元素的类名称 | string | - | |
-| overlayStyle | 下拉根元素的样式 | object | - | |
-| onVisibleChange | 菜单显示状态改变时调用,参数为 `visible` | function(visible) | - | |
+| overlayStyle | 下拉根元素的样式 | CSSProperties | - | |
| placement | 菜单弹出位置:`bottomLeft` `bottomCenter` `bottomRight` `topLeft` `topCenter` `topRight` | string | `bottomLeft` | |
| trigger | 触发下拉的行为, 移动端不支持 hover | Array<`click`\|`hover`\|`contextMenu`> | \[`hover`] | |
| visible | 菜单是否显示 | boolean | - | |
+| onVisibleChange | 菜单显示状态改变时调用,参数为 `visible` | (visible: boolean) => void | - | |
`overlay` 菜单使用 [Menu](/components/menu/),还包括菜单项 `Menu.Item`,分割线 `Menu.Divider`。
@@ -42,14 +42,14 @@ cover: https://gw.alipayobjects.com/zos/alicdn/eedWN59yJ/Dropdown.svg
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| buttonsRender | 自定义左右两个按钮 | ([buttons: ReactNode[]]) => ReactNode | - | |
+| buttonsRender | 自定义左右两个按钮 | (buttons: ReactNode\[]) => ReactNode\[] | - | |
| disabled | 菜单是否禁用 | boolean | - | |
| icon | 右侧的 icon | ReactNode | - | |
-| onClick | 点击左侧按钮的回调,和 [Button](/components/button/) 一致 | function | - | |
-| onVisibleChange | 菜单显示状态改变时调用,参数为 `visible` | function | - | |
| overlay | 菜单 | [Menu](/components/menu/) | - | |
| placement | 菜单弹出位置:`bottomLeft` `bottomCenter` `bottomRight` `topLeft` `topCenter` `topRight` | string | `bottomLeft` | |
-| size | 按钮大小,和 [Button](/components/button/) 一致 | string | `default` | |
+| size | 按钮大小,和 [Button](/components/button/#API) 一致 | string | `default` | |
| trigger | 触发下拉的行为 | Array<`click`\|`hover`\|`contextMenu`> | \[`hover`] | |
-| type | 按钮类型,和 [Button](/components/button/) 一致 | string | `default` | |
+| type | 按钮类型,和 [Button](/components/button/#API) 一致 | string | `default` | |
| visible | 菜单是否显示 | boolean | - | |
+| onClick | 点击左侧按钮的回调,和 [Button](/components/button/#API) 一致 | (event) => void | - | |
+| onVisibleChange | 菜单显示状态改变时调用,参数为 `visible` | (visible: boolean) => void | - | |
diff --git a/components/dropdown/style/index.less b/components/dropdown/style/index.less
index df590b76ac..4240037c88 100644
--- a/components/dropdown/style/index.less
+++ b/components/dropdown/style/index.less
@@ -170,10 +170,12 @@
transition: all 0.3s;
> .@{iconfont-css-prefix}:first-child,
+ > a > .@{iconfont-css-prefix}:first-child,
> span > .@{iconfont-css-prefix}:first-child {
min-width: 12px;
margin-right: 8px;
font-size: @font-size-sm;
+ vertical-align: -0.1em;
}
> a {
diff --git a/components/empty/index.en-US.md b/components/empty/index.en-US.md
index c9a187eb3b..9c7cd06530 100644
--- a/components/empty/index.en-US.md
+++ b/components/empty/index.en-US.md
@@ -24,8 +24,8 @@ Empty state placeholder.
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
| description | Customize description | ReactNode | - | |
-| imageStyle | The style of image | CSSProperties | - | |
| image | Customize image. Will treat as image url when string provided | ReactNode | `Empty.PRESENTED_IMAGE_DEFAULT` | |
+| imageStyle | The style of image | CSSProperties | - | |
## Built-in images
diff --git a/components/empty/index.zh-CN.md b/components/empty/index.zh-CN.md
index 013468debe..ef887fb9a1 100644
--- a/components/empty/index.zh-CN.md
+++ b/components/empty/index.zh-CN.md
@@ -25,8 +25,8 @@ cover: https://gw.alipayobjects.com/zos/alicdn/MNbKfLBVb/Empty.svg
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| description | 自定义描述内容 | ReactNode | - | |
-| imageStyle | 图片样式 | CSSProperties | - | |
| image | 设置显示图片,为 string 时表示自定义图片地址。 | ReactNode | `Empty.PRESENTED_IMAGE_DEFAULT` | |
+| imageStyle | 图片样式 | CSSProperties | - | |
## 内置图片
diff --git a/components/form/FormList.tsx b/components/form/FormList.tsx
index 140242edca..e1b7b379db 100644
--- a/components/form/FormList.tsx
+++ b/components/form/FormList.tsx
@@ -1,6 +1,6 @@
import * as React from 'react';
import { List } from 'rc-field-form';
-import { StoreValue } from 'rc-field-form/lib/interface';
+import { ValidatorRule, StoreValue } from 'rc-field-form/lib/interface';
import devWarning from '../_util/devWarning';
import { ConfigContext } from '../config-provider';
import { FormItemPrefixContext } from './context';
@@ -20,6 +20,7 @@ export interface FormListOperation {
export interface FormListProps {
prefixCls?: string;
name: string | number | (string | number)[];
+ rules?: ValidatorRule[];
children: (
fields: FormListFieldData[],
operation: FormListOperation,
diff --git a/components/form/__tests__/__snapshots__/demo.test.js.snap b/components/form/__tests__/__snapshots__/demo.test.js.snap
index a154e00ed4..0965a8fd05 100644
--- a/components/form/__tests__/__snapshots__/demo.test.js.snap
+++ b/components/form/__tests__/__snapshots__/demo.test.js.snap
@@ -1549,86 +1549,84 @@ exports[`renders ./components/form/demo/dynamic-form-item.md correctly 1`] = `
class="ant-form ant-form-horizontal"
id="dynamic_form_item"
>
-
+
@@ -7630,7 +7622,7 @@ exports[`renders ./components/form/demo/validate-static.md correctly 1`] = `
class="ant-form-item-control-input-content"
>
{
const onGenderChange = value => {
switch (value) {
- case "male":
- form.setFieldsValue({ note: "Hi, man!" });
+ case 'male':
+ form.setFieldsValue({ note: 'Hi, man!' });
return;
- case "female":
- form.setFieldsValue({ note: "Hi, lady!" });
+ case 'female':
+ form.setFieldsValue({ note: 'Hi, lady!' });
return;
- case "other":
- form.setFieldsValue({ note: "Hi there!" });
+ case 'other':
+ form.setFieldsValue({ note: 'Hi there!' });
return;
}
};
diff --git a/components/form/demo/dynamic-form-item.md b/components/form/demo/dynamic-form-item.md
index df4500aa60..f670b18231 100644
--- a/components/form/demo/dynamic-form-item.md
+++ b/components/form/demo/dynamic-form-item.md
@@ -53,68 +53,61 @@ const DynamicFieldSet = () => {
},
]}
>
- {(fields, { add, remove }, { errors }) => {
- return (
-
- );
- }}
+ ))}
+
+ add()}
+ style={{ width: '60%' }}
+ icon={ }
+ >
+ Add field
+
+ {
+ add('The head item', 0);
+ }}
+ style={{ width: '60%', marginTop: '20px' }}
+ icon={ }
+ >
+ Add field at head
+
+
+
+ >
+ )}
-
Submit
@@ -129,6 +122,7 @@ ReactDOM.render( , mountNode);
```css
.dynamic-delete-button {
+ margin: 0 8px;
cursor: pointer;
position: relative;
top: 4px;
diff --git a/components/form/demo/dynamic-form-items-complex.md b/components/form/demo/dynamic-form-items-complex.md
index c0d5ccfd6a..08bdeecd5a 100644
--- a/components/form/demo/dynamic-form-items-complex.md
+++ b/components/form/demo/dynamic-form-items-complex.md
@@ -17,6 +17,8 @@ This example demonstrates the case that a form contains multiple form controls.
import { Form, Input, Button, Space, Select } from 'antd';
import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons';
+const { Option } = Select;
+
const areas = [
{ label: 'Beijing', value: 'Beijing' },
{ label: 'Shanghai', value: 'Shanghai' },
@@ -44,65 +46,56 @@ const Demo = () => {
- {(fields, { add, remove }) => {
- return (
- <>
- {fields.map(field => (
-
-
- prevValues.area !== curValues.area || prevValues.sights !== curValues.sights
- }
- >
- {() => (
-
-
- {(sights[form.getFieldValue('area')] || []).map(item => (
-
- {item}
-
- ))}
-
-
- )}
-
-
-
-
-
- remove(field.name)} />
-
- ))}
-
-
- {
- add();
- }}
- block
+ {(fields, { add, remove }) => (
+ <>
+ {fields.map(field => (
+
+
+ prevValues.area !== curValues.area || prevValues.sights !== curValues.sights
+ }
>
- Add sights
-
-
- >
- );
- }}
-
+ {() => (
+
+
+ {(sights[form.getFieldValue('area')] || []).map(item => (
+
+ {item}
+
+ ))}
+
+
+ )}
+
+
+
+
+ remove(field.name)} />
+
+ ))}
+
+
+ add()} block icon={ }>
+ Add sights
+
+
+ >
+ )}
+
Submit
diff --git a/components/form/demo/dynamic-form-items.md b/components/form/demo/dynamic-form-items.md
index f0d4e3313f..2b500401c3 100644
--- a/components/form/demo/dynamic-form-items.md
+++ b/components/form/demo/dynamic-form-items.md
@@ -25,52 +25,37 @@ const Demo = () => {
return (
- {(fields, { add, remove }) => {
- return (
-
- );
- }}
+
+
+
+
+
+ remove(field.name)} />
+
+ ))}
+
+ add()} block icon={ }>
+ Add field
+
+
+ >
+ )}
-
Submit
diff --git a/components/form/demo/register.md b/components/form/demo/register.md
index 8cb1acb589..4d0b9aa334 100644
--- a/components/form/demo/register.md
+++ b/components/form/demo/register.md
@@ -251,7 +251,10 @@ const RegistrationForm = () => {
name="agreement"
valuePropName="checked"
rules={[
- { validator:(_, value) => value ? Promise.resolve() : Promise.reject('Should accept agreement') },
+ {
+ validator: (_, value) =>
+ value ? Promise.resolve() : Promise.reject('Should accept agreement'),
+ },
]}
{...tailFormItemLayout}
>
diff --git a/components/form/index.en-US.md b/components/form/index.en-US.md
index 578f035199..373412ce08 100644
--- a/components/form/index.en-US.md
+++ b/components/form/index.en-US.md
@@ -19,8 +19,8 @@ High performance Form component with data scope management. Including data colle
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| component | Set the Form rendering element. Do not create a DOM node for `false` | ComponentType \| false | form | |
| colon | Configure the default value of `colon` for Form.Item. Indicates whether the colon after the label is displayed (only effective when prop layout is horizontal) | boolean | true | |
+| component | Set the Form rendering element. Do not create a DOM node for `false` | ComponentType \| false | form | |
| fields | Control of form fields through state management (such as redux). Not recommended for non-strong demand. View [example](#components-form-demo-global-state) | [FieldData](#FieldData)\[] | - | |
| form | Form control instance created by `Form.useForm()`. Automatically created when not provided | [FormInstance](#FormInstance) | - | |
| initialValues | Set value by Form initialization or reset | object | - | |
@@ -33,11 +33,11 @@ High performance Form component with data scope management. Including data colle
| scrollToFirstError | Auto scroll to first failed field when submit | boolean | false | |
| size | Set field component size (antd components only) | `small` \| `middle` \| `large` | - | |
| validateMessages | Validation prompt template, description [see below](#validateMessages) | [ValidateMessages](https://github.com/react-component/field-form/blob/master/src/utils/messages.ts) | - | |
-| validateTrigger | Config field validate trigger | string \| string[] | `onChange` | 4.3.0 |
+| validateTrigger | Config field validate trigger | string \| string\[] | `onChange` | 4.3.0 |
| wrapperCol | The layout for input controls, same as `labelCol` | [object](/components/grid/#Col) | - | |
+| onFieldsChange | Trigger when field updated | function(changedFields, allFields) | - | |
| onFinish | Trigger after submitting the form and verifying data successfully | function(values) | - | |
| onFinishFailed | Trigger after submitting the form and verifying data failed | function({ values, errorFields, outOfDate }) | - | |
-| onFieldsChange | Trigger when field updated | function(changedFields, allFields) | - | |
| onValuesChange | Trigger when value updated | function(changedValues, allValues) | - | |
### validateMessages
@@ -73,33 +73,33 @@ Form field component for data bidirectional binding, validation, layout, and so
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
| colon | Used with `label`, whether to display `:` after label text. | boolean | true | |
-| dependencies | Set the dependency field. See [below](#dependencies) | [NamePath](#NamePath)[] | - | |
+| dependencies | Set the dependency field. See [below](#dependencies) | [NamePath](#NamePath)\[] | - | |
| extra | The extra prompt message. It is similar to help. Usage example: to display error message and prompt message at the same time | ReactNode | - | |
-| getValueFromEvent | Specify how to get value from event or other onChange arguments | (..args: any[]) => any | - | |
+| getValueFromEvent | Specify how to get value from event or other onChange arguments | (..args: any\[]) => any | - | |
| getValueProps | Additional props with sub component | (value: any) => any | - | 4.2.0 |
| hasFeedback | Used with `validateStatus`, this option specifies the validation status icon. Recommended to be used only with `Input` | boolean | false | |
| help | The prompt message. If not provided, the prompt message will be generated by the validation rule. | ReactNode | - | |
+| hidden | Whether to hide Form.Item (still collect and validate value) | boolean | false | |
| htmlFor | Set sub label `htmlFor` | string | - | |
| initialValue | Config sub default value. Form `initialValues` get higher priority when conflict | string | - | 4.2.0 |
-| noStyle | No style for `true`, used as a pure field control | boolean | false | |
| label | Label text | ReactNode | - | |
| labelAlign | The text align of label | `left` \| `right` | `right` | |
| labelCol | The layout of label. You can set `span` `offset` to something like `{span: 3, offset: 12}` or `sm: {span: 3, offset: 12}` same as with ` `. You can set `labelCol` on Form which will not affect nest Item. If both exists, use Item first | [object](/components/grid/#Col) | - | |
-| messageVariables | default validate filed info | Record | - | 4.7.0 |
+| messageVariables | default validate filed info | Record<string, string> | - | 4.7.0 |
| name | Field name, support array | [NamePath](#NamePath) | - | |
| normalize | Normalize value from component value before passing to Form instance | (value, prevValue, prevValues) => any | - | |
+| noStyle | No style for `true`, used as a pure field control | boolean | false | |
| preserve | Keep field value even when field removed | boolean | true | 4.4.0 |
| required | Display required style. It will be generated by the validation rule | boolean | false | |
-| rules | Rules for field validation. Click [here](#components-form-demo-basic) to see an example | [Rule](#Rule)[] | - | |
+| rules | Rules for field validation. Click [here](#components-form-demo-basic) to see an example | [Rule](#Rule)\[] | - | |
| shouldUpdate | Custom field update logic. See [below](#shouldUpdate) | boolean \| (prevValue, curValue) => boolean | false | |
| tooltip | Config tooltip info | ReactNode \| [TooltipProps & { icon: ReactNode }](/components/tooltip#API) | - | 4.7.0 |
| trigger | When to collect the value of children node | string | `onChange` | |
| validateFirst | Whether stop validate on first rule of error for this field. Will parallel validate when `parallel` cofigured | boolean \| `parallel` | false | `parallel`: 4.5.0 |
| validateStatus | The validation status. If not provided, it will be generated by validation rule. options: `success` `warning` `error` `validating` | string | - | |
-| validateTrigger | When to validate the value of children node | string \| string[] | `onChange` | |
+| validateTrigger | When to validate the value of children node | string \| string\[] | `onChange` | |
| valuePropName | Props of children node, for example, the prop of Switch is 'checked'. This prop is an encapsulation of `getValueProps`, which will be invalid after customizing `getValueProps` | string | `value` | |
| wrapperCol | The layout for input controls, same as `labelCol`. You can set `wrapperCol` on Form which will not affect nest Item. If both exists, use Item first | [object](/components/grid/#Col) | - | |
-| hidden | Whether to hide Form.Item (still collect and validate value) | boolean | false | |
After wrapped by `Form.Item` with `name` property, `value`(or other property defined by `valuePropName`) `onChange`(or other property defined by `trigger`) props will be added to form controls, the flow of form data will be handled by Form which will cause:
@@ -168,9 +168,9 @@ Provides array management for fields.
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
+| children | Render function | (fields: Field\[], operation: { add, remove, move }) => React.ReactNode | - | |
| name | Field name, support array | [NamePath](#NamePath) | - | |
-| children | Render function | (fields: Field[], operation: { add, remove, move }) => React.ReactNode | - | |
-| rules | Validate rules, only support customize validator. Should work with [ErrorList](#Form.ErrorList) | { validator, message }[] | - | 4.7.0 |
+| rules | Validate rules, only support customize validator. Should work with [ErrorList](#Form.ErrorList) | { validator, message }\[] | - | 4.7.0 |
```tsx
@@ -193,16 +193,16 @@ Some operator functions in render form of Form.List.
| Property | Description | Type | Default |
| --- | --- | --- | --- |
| add | add form item | (defaultValue?: any, insertIndex?: number) => void | insertIndex: 4.6.0 |
-| remove | remove form item | (index: number \| number[]) => void | number[]: 4.5.0 |
| move | move form item | (from: number, to: number) => void | - |
+| remove | remove form item | (index: number \| number\[]) => void | number\[]: 4.5.0 |
## Form.ErrorList
New in 4.7.0. Show error messages, should only work with `rules` of Form.List.
-| Property | Description | Type | Default |
-| -------- | ----------- | ----------- | ------- |
-| errors | Error list | ReactNode[] | - |
+| Property | Description | Type | Default |
+| --- | --- | --- | --- |
+| errors | Error list | ReactNode\[] | - |
## Form.Provider
@@ -230,20 +230,20 @@ Provide linkage between forms. If a sub form with `name` prop update, it will au
| Name | Description | Type | Version |
| --- | --- | --- | --- |
+| getFieldError | Get the error messages by the field name | (name: [NamePath](#NamePath)) => string\[] | |
| getFieldInstance | Get field instance | (name: [NamePath](#NamePath)) => any | 4.4.0 |
+| getFieldsError | Get the error messages by the fields name. Return as an array | (nameList?: [NamePath](#NamePath)\[]) => FieldError\[] | |
+| getFieldsValue | Get values by a set of field names. Return according to the corresponding structure | (nameList?: [NamePath](#NamePath)\[], filterFunc?: (meta: { touched: boolean, validating: boolean }) => boolean) => any | |
| getFieldValue | Get the value by the field name | (name: [NamePath](#NamePath)) => any | |
-| getFieldsValue | Get values by a set of field names. Return according to the corresponding structure | (nameList?: [NamePath](#NamePath)[], filterFunc?: (meta: { touched: boolean, validating: boolean }) => boolean) => any | |
-| getFieldError | Get the error messages by the field name | (name: [NamePath](#NamePath)) => string[] | |
-| getFieldsError | Get the error messages by the fields name. Return as an array | (nameList?: [NamePath](#NamePath)[]) => FieldError[] | |
+| isFieldsTouched | Check if fields have been operated. Check if all fields is touched when `allTouched` is `true` | (nameList?: [NamePath](#NamePath)\[], allTouched?: boolean) => boolean | |
| isFieldTouched | Check if a field has been operated | (name: [NamePath](#NamePath)) => boolean | |
-| isFieldsTouched | Check if fields have been operated. Check if all fields is touched when `allTouched` is `true` | (nameList?: [NamePath](#NamePath)[], allTouched?: boolean) => boolean | |
| isFieldValidating | Check fields if is in validating | (name: [NamePath](#NamePath)) => boolean | |
-| resetFields | Reset fields to `initialValues` | (fields?: [NamePath](#NamePath)[]) => void | |
-| scrollToField | Scroll to field position | (name: [NamePath](#NamePath), options: [[ScrollOptions](https://github.com/stipsan/scroll-into-view-if-needed/tree/ece40bd9143f48caf4b99503425ecb16b0ad8249#options)]) => void | |
-| setFields | Set fields status | (fields: [FieldData](#FieldData)[]) => void | |
+| resetFields | Reset fields to `initialValues` | (fields?: [NamePath](#NamePath)\[]) => void | |
+| scrollToField | Scroll to field position | (name: [NamePath](#NamePath), options: \[[ScrollOptions](https://github.com/stipsan/scroll-into-view-if-needed/tree/ece40bd9143f48caf4b99503425ecb16b0ad8249#options)]) => void | |
+| setFields | Set fields status | (fields: [FieldData](#FieldData)\[]) => void | |
| setFieldsValue | Set fields value | (values) => void | |
| submit | Submit the form. It's same as click `submit` button | () => void | |
-| validateFields | Validate fields | (nameList?: [NamePath](#NamePath)[]) => Promise | |
+| validateFields | Validate fields | (nameList?: [NamePath](#NamePath)\[]) => Promise | |
#### validateFields return sample
@@ -283,13 +283,13 @@ validateFields()
#### FieldData
-| Name | Description | Type |
-| ---------- | ------------------------ | ----------------------- |
-| touched | Whether is operated | boolean |
-| validating | Whether is in validating | boolean |
-| errors | Error messages | string[] |
-| name | Field name path | [NamePath](#NamePath)[] |
-| value | Field value | any |
+| Name | Description | Type |
+| --- | --- | --- |
+| errors | Error messages | string\[] |
+| name | Field name path | [NamePath](#NamePath)\[] |
+| touched | Whether is operated | boolean |
+| validating | Whether is in validating | boolean |
+| value | Field value | any |
#### Rule
@@ -301,7 +301,7 @@ type Rule = RuleConfig | ((form: FormInstance) => RuleConfig);
| Name | Description | Type |
| --- | --- | --- |
-| enum | Match enum value. You need to set `type` to `enum` to enable this | any[] |
+| enum | Match enum value. You need to set `type` to `enum` to enable this | any\[] |
| len | Length of string, number, array | number |
| max | `type` required: max length of `string`, `number`, `array` | number |
| message | Error message. Will auto generate by [template](#validateMessages) if not provided | string |
@@ -310,9 +310,9 @@ type Rule = RuleConfig | ((form: FormInstance) => RuleConfig);
| required | Required field | boolean |
| transform | Transform value to the rule before validation | (value) => any |
| type | Normally `string` \|`number` \|`boolean` \|`url` \| `email`. More type to ref [here](https://github.com/yiminghe/async-validator#type) | string |
+| validateTrigger | Set validate trigger event. Must be the sub set of `validateTrigger` in Form.Item | string \| string\[] |
| validator | Customize validation rule. Accept Promise as return. See [example](#components-form-demo-register) | ([rule](#Rule), value) => Promise |
| whitespace | Failed if only has whitespace | boolean |
-| validateTrigger | Set validate trigger event. Must be the sub set of `validateTrigger` in Form.Item | string \| string[] |
## Migrate to v4
@@ -366,7 +366,7 @@ Components inside Form.Item with name property will turn into controlled mode, w
### Why can not call `ref` of Form at first time?
-`ref` only receives the mounted instance. please ref React official doc: https://reactjs.org/docs/refs-and-the-dom.html#accessing-refs
+`ref` only receives the mounted instance. please ref React official doc:
### Why `resetFields` will re-mount component?
diff --git a/components/form/index.zh-CN.md b/components/form/index.zh-CN.md
index 142c52cdee..fd425364b8 100644
--- a/components/form/index.zh-CN.md
+++ b/components/form/index.zh-CN.md
@@ -20,8 +20,8 @@ cover: https://gw.alipayobjects.com/zos/alicdn/ORmcdeaoO/Form.svg
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| component | 设置 Form 渲染元素,为 `false` 则不创建 DOM 节点 | ComponentType \| false | form | |
| colon | 配置 Form.Item 的 `colon` 的默认值。表示是否显示 label 后面的冒号 (只有在属性 layout 为 horizontal 时有效) | boolean | true | |
+| component | 设置 Form 渲染元素,为 `false` 则不创建 DOM 节点 | ComponentType \| false | form | |
| fields | 通过状态管理(如 redux)控制表单字段,如非强需求不推荐使用。查看[示例](#components-form-demo-global-state) | [FieldData](#FieldData)\[] | - | |
| form | 经 `Form.useForm()` 创建的 form 控制实例,不提供时会自动创建 | [FormInstance](#FormInstance) | - | |
| initialValues | 表单默认值,只有初始化以及重置时生效 | object | - | |
@@ -34,11 +34,11 @@ cover: https://gw.alipayobjects.com/zos/alicdn/ORmcdeaoO/Form.svg
| scrollToFirstError | 提交失败自动滚动到第一个错误字段 | boolean | false | |
| size | 设置字段组件的尺寸(仅限 antd 组件) | `small` \| `middle` \| `large` | - | |
| validateMessages | 验证提示模板,说明[见下](#validateMessages) | [ValidateMessages](https://github.com/react-component/field-form/blob/master/src/utils/messages.ts) | - | |
-| validateTrigger | 统一设置字段校验规则 | string \| string[] | `onChange` | 4.3.0 |
+| validateTrigger | 统一设置字段校验规则 | string \| string\[] | `onChange` | 4.3.0 |
| wrapperCol | 需要为输入控件设置布局样式时,使用该属性,用法同 labelCol | [object](/components/grid/#Col) | - | |
+| onFieldsChange | 字段更新时触发回调事件 | function(changedFields, allFields) | - | |
| onFinish | 提交表单且数据验证成功后回调事件 | function(values) | - | |
| onFinishFailed | 提交表单且数据验证失败后回调事件 | function({ values, errorFields, outOfDate }) | - | |
-| onFieldsChange | 字段更新时触发回调事件 | function(changedFields, allFields) | - | |
| onValuesChange | 字段值更新时触发回调事件 | function(changedValues, allValues) | - | |
### validateMessages
@@ -74,33 +74,33 @@ const validateMessages = {
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| colon | 配合 `label` 属性使用,表示是否显示 `label` 后面的冒号 | boolean | true | |
-| dependencies | 设置依赖字段,说明[见下](#dependencies) | [NamePath](#NamePath)[] | - | |
+| dependencies | 设置依赖字段,说明[见下](#dependencies) | [NamePath](#NamePath)\[] | - | |
| extra | 额外的提示信息,和 `help` 类似,当需要错误信息和提示文案同时出现时,可以使用这个。 | ReactNode | - | |
-| getValueFromEvent | 设置如何将 event 的值转换成字段值 | (..args: any[]) => any | - | |
+| getValueFromEvent | 设置如何将 event 的值转换成字段值 | (..args: any\[]) => any | - | |
| getValueProps | 为子元素添加额外的属性 | (value: any) => any | - | 4.2.0 |
| hasFeedback | 配合 `validateStatus` 属性使用,展示校验状态图标,建议只配合 Input 组件使用 | boolean | false | |
| help | 提示信息,如不设置,则会根据校验规则自动生成 | ReactNode | - | |
+| hidden | 是否隐藏字段(依然会收集和校验字段) | boolean | false | |
| htmlFor | 设置子元素 label `htmlFor` 属性 | string | - | |
| initialValue | 设置子元素默认值,如果与 Form 的 `initialValues` 冲突则以 Form 为准 | string | - | 4.2.0 |
-| noStyle | 为 `true` 时不带样式,作为纯字段控件使用 | boolean | false | |
| label | `label` 标签的文本 | ReactNode | - | |
| labelAlign | 标签文本对齐方式 | `left` \| `right` | `right` | |
| labelCol | `label` 标签布局,同 ` ` 组件,设置 `span` `offset` 值,如 `{span: 3, offset: 12}` 或 `sm: {span: 3, offset: 12}`。你可以通过 Form 的 `labelCol` 进行统一设置,,不会作用于嵌套 Item。当和 Form 同时设置时,以 Item 为准 | [object](/components/grid/#Col) | - | |
-| messageVariables | 默认验证字段的信息 | Record | - | 4.7.0 |
+| messageVariables | 默认验证字段的信息 | Record<string, string> | - | 4.7.0 |
| name | 字段名,支持数组 | [NamePath](#NamePath) | - | |
-| preserve | 当字段被删除时保留字段值 | boolean | true | 4.4.0 |
| normalize | 组件获取值后进行转换,再放入 Form 中 | (value, prevValue, prevValues) => any | - | |
+| noStyle | 为 `true` 时不带样式,作为纯字段控件使用 | boolean | false | |
+| preserve | 当字段被删除时保留字段值 | boolean | true | 4.4.0 |
| required | 必填样式设置。如不设置,则会根据校验规则自动生成 | boolean | false | |
-| rules | 校验规则,设置字段的校验逻辑。点击[此处](#components-form-demo-basic)查看示例 | [Rule](#Rule)[] | - | |
+| rules | 校验规则,设置字段的校验逻辑。点击[此处](#components-form-demo-basic)查看示例 | [Rule](#Rule)\[] | - | |
| shouldUpdate | 自定义字段更新逻辑,说明[见下](#shouldUpdate) | boolean \| (prevValue, curValue) => boolean | false | |
| tooltip | 配置提示信息 | ReactNode \| [TooltipProps & { icon: ReactNode }](/components/tooltip#API) | - | 4.7.0 |
| trigger | 设置收集字段值变更的时机 | string | `onChange` | |
| validateFirst | 当某一规则校验不通过时,是否停止剩下的规则的校验。设置 `parallel` 时会并行校验 | boolean \| `parallel` | false | `parallel`: 4.5.0 |
| validateStatus | 校验状态,如不设置,则会根据校验规则自动生成,可选:'success' 'warning' 'error' 'validating' | string | - | |
-| validateTrigger | 设置字段校验的时机 | string \| string[] | `onChange` | |
+| validateTrigger | 设置字段校验的时机 | string \| string\[] | `onChange` | |
| valuePropName | 子节点的值的属性,如 Switch 的是 'checked'。该属性为 `getValueProps` 的封装,自定义 `getValueProps` 后会失效 | string | `value` | |
| wrapperCol | 需要为输入控件设置布局样式时,使用该属性,用法同 `labelCol`。你可以通过 Form 的 `wrapperCol` 进行统一设置,不会作用于嵌套 Item。当和 Form 同时设置时,以 Item 为准 | [object](/components/grid/#Col) | - | |
-| hidden | 是否隐藏字段(依然会收集和校验字段) | boolean | false | |
被设置了 `name` 属性的 `Form.Item` 包装的控件,表单控件会自动添加 `value`(或 `valuePropName` 指定的其他属性) `onChange`(或 `trigger` 指定的其他属性),数据同步将被 Form 接管,这会导致以下结果:
@@ -169,9 +169,9 @@ Form 通过增量更新方式,只更新被修改的字段相关组件以达到
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
+| children | 渲染函数 | (fields: Field\[], operation: { add, remove, move }) => React.ReactNode | - | |
| name | 字段名,支持数组 | [NamePath](#NamePath) | - | |
-| children | 渲染函数 | (fields: Field[], operation: { add, remove, move }) => React.ReactNode | - | |
-| rules | 校验规则,仅支持自定义规则。需要配合 [ErrorList](#Form.ErrorList) 一同使用。 | { validator, message }[] | - | 4.7.0 |
+| rules | 校验规则,仅支持自定义规则。需要配合 [ErrorList](#Form.ErrorList) 一同使用。 | { validator, message }\[] | - | 4.7.0 |
```tsx
@@ -192,19 +192,19 @@ Form 通过增量更新方式,只更新被修改的字段相关组件以达到
Form.List 渲染表单相关操作函数。
-| 参数 | 说明 | 类型 | 默认值 |
-| ------ | ---------- | -------------------------------------------------- | ------------------ |
-| add | 新增表单项 | (defaultValue?: any, insertIndex?: number) => void | insertIndex: 4.6.0 |
-| remove | 删除表单项 | (index: number \| number[]) => void | number[]: 4.5.0 |
-| move | 移动表单项 | (from: number, to: number) => void | - |
+| 参数 | 说明 | 类型 | 默认值 |
+| --- | --- | --- | --- |
+| add | 新增表单项 | (defaultValue?: any, insertIndex?: number) => void | insertIndex: 4.6.0 |
+| move | 移动表单项 | (from: number, to: number) => void | - |
+| remove | 删除表单项 | (index: number \| number\[]) => void | number\[]: 4.5.0 |
## Form.ErrorList
4.7.0 新增。错误展示组件,仅限配合 Form.List 的 rules 一同使用。
-| 参数 | 说明 | 类型 | 默认值 |
-| ------ | -------- | ----------- | ------ |
-| errors | 错误列表 | ReactNode[] | - |
+| 参数 | 说明 | 类型 | 默认值 |
+| --- | --- | --- | --- |
+| errors | 错误列表 | ReactNode\[] | - |
## Form.Provider
@@ -232,20 +232,20 @@ Form.List 渲染表单相关操作函数。
| 名称 | 说明 | 类型 | 版本 |
| --- | --- | --- | --- |
+| getFieldError | 获取对应字段名的错误信息 | (name: [NamePath](#NamePath)) => string\[] | |
| getFieldInstance | 获取对应字段实例 | (name: [NamePath](#NamePath)) => any | 4.4.0 |
+| getFieldsError | 获取一组字段名对应的错误信息,返回为数组形式 | (nameList?: [NamePath](#NamePath)\[]) => FieldError\[] | |
+| getFieldsValue | 获取一组字段名对应的值,会按照对应结构返回 | (nameList?: [NamePath](#NamePath)\[], filterFunc?: (meta: { touched: boolean, validating: boolean }) => boolean) => any | |
| getFieldValue | 获取对应字段名的值 | (name: [NamePath](#NamePath)) => any | |
-| getFieldsValue | 获取一组字段名对应的值,会按照对应结构返回 | (nameList?: [NamePath](#NamePath)[], filterFunc?: (meta: { touched: boolean, validating: boolean }) => boolean) => any | |
-| getFieldError | 获取对应字段名的错误信息 | (name: [NamePath](#NamePath)) => string[] | |
-| getFieldsError | 获取一组字段名对应的错误信息,返回为数组形式 | (nameList?: [NamePath](#NamePath)[]) => FieldError[] | |
+| isFieldsTouched | 检查一组字段是否被用户操作过,`allTouched` 为 `true` 时检查是否所有字段都被操作过 | (nameList?: [NamePath](#NamePath)\[], allTouched?: boolean) => boolean | |
| isFieldTouched | 检查对应字段是否被用户操作过 | (name: [NamePath](#NamePath)) => boolean | |
-| isFieldsTouched | 检查一组字段是否被用户操作过,`allTouched` 为 `true` 时检查是否所有字段都被操作过 | (nameList?: [NamePath](#NamePath)[], allTouched?: boolean) => boolean | |
| isFieldValidating | 检查一组字段是否正在校验 | (name: [NamePath](#NamePath)) => boolean | |
-| resetFields | 重置一组字段到 `initialValues` | (fields?: [NamePath](#NamePath)[]) => void | |
-| scrollToField | 滚动到对应字段位置 | (name: [NamePath](#NamePath), options: [[ScrollOptions](https://github.com/stipsan/scroll-into-view-if-needed/tree/ece40bd9143f48caf4b99503425ecb16b0ad8249#options)]) => void | |
-| setFields | 设置一组字段状态 | (fields: [FieldData](#FieldData)[]) => void | |
+| resetFields | 重置一组字段到 `initialValues` | (fields?: [NamePath](#NamePath)\[]) => void | |
+| scrollToField | 滚动到对应字段位置 | (name: [NamePath](#NamePath), options: \[[ScrollOptions](https://github.com/stipsan/scroll-into-view-if-needed/tree/ece40bd9143f48caf4b99503425ecb16b0ad8249#options)]) => void | |
+| setFields | 设置一组字段状态 | (fields: [FieldData](#FieldData)\[]) => void | |
| setFieldsValue | 设置表单的值 | (values) => void | |
| submit | 提交表单,与点击 `submit` 按钮效果相同 | () => void | |
-| validateFields | 触发表单验证 | (nameList?: [NamePath](#NamePath)[]) => Promise | |
+| validateFields | 触发表单验证 | (nameList?: [NamePath](#NamePath)\[]) => Promise | |
#### validateFields 返回示例
@@ -285,13 +285,13 @@ validateFields()
#### FieldData
-| 名称 | 说明 | 类型 |
-| ---------- | ---------------- | ----------------------- |
-| touched | 是否被用户操作过 | boolean |
-| validating | 是否正在校验 | boolean |
-| errors | 错误信息 | string[] |
-| name | 字段名称 | [NamePath](#NamePath)[] |
-| value | 字段对应值 | any |
+| 名称 | 说明 | 类型 |
+| --- | --- | --- |
+| errors | 错误信息 | string\[] |
+| name | 字段名称 | [NamePath](#NamePath)\[] |
+| touched | 是否被用户操作过 | boolean |
+| validating | 是否正在校验 | boolean |
+| value | 字段对应值 | any |
#### Rule
@@ -303,7 +303,7 @@ type Rule = RuleConfig | ((form: FormInstance) => RuleConfig);
| 名称 | 说明 | 类型 |
| --- | --- | --- |
-| enum | 是否匹配枚举中的值(需要将 `type` 设置为 `enum`) | any[] |
+| enum | 是否匹配枚举中的值(需要将 `type` 设置为 `enum`) | any\[] |
| len | string 类型时为字符串长度;number 类型时为确定数字; array 类型时为数组长度 | number |
| max | 必须设置 `type`:string 类型为字符串最大长度;number 类型时为最大值;array 类型时为数组最大长度 | number |
| message | 错误信息,不设置时会通过[模板](#validateMessages)自动生成 | string |
@@ -312,9 +312,9 @@ type Rule = RuleConfig | ((form: FormInstance) => RuleConfig);
| required | 是否为必选字段 | boolean |
| transform | 将字段值转换成目标值后进行校验 | (value) => any |
| type | 类型,常见有 `string` \|`number` \|`boolean` \|`url` \| `email`。更多请参考[此处](https://github.com/yiminghe/async-validator#type) | string |
+| validateTrigger | 设置触发验证时机,必须是 Form.Item 的 `validateTrigger` 的子集 | string \| string\[] |
| validator | 自定义校验,接收 Promise 作为返回值。[示例](#components-form-demo-register)参考 | ([rule](#Rule), value) => Promise |
| whitespace | 如果字段仅包含空格则校验不通过 | boolean |
-| validateTrigger | 设置触发验证时机,必须是 Form.Item 的 `validateTrigger` 的子集 | string \| string[] |
## 从 v3 升级到 v4
@@ -368,7 +368,7 @@ validator(rule, value, callback) => {
### 为什么第一次调用 `ref` 的 From 为空?
-`ref` 仅在节点被加载时才会被赋值,请参考 React 官方文档:https://reactjs.org/docs/refs-and-the-dom.html#accessing-refs
+`ref` 仅在节点被加载时才会被赋值,请参考 React 官方文档:
### 为什么 `resetFields` 会重新 mount 组件?
diff --git a/components/form/style/mixin.less b/components/form/style/mixin.less
index 1ae64899f1..5e2d0c2c7f 100644
--- a/components/form/style/mixin.less
+++ b/components/form/style/mixin.less
@@ -9,6 +9,7 @@
.@{ant-prefix}-input-affix-wrapper {
&,
&:hover {
+ background-color: @background-color;
border-color: @border-color;
}
@@ -18,16 +19,15 @@
}
}
- .@{ant-prefix}-input {
- &:not(&-disabled) {
- background-color: @background-color;
- }
+ .@{ant-prefix}-input-disabled {
+ background-color: @input-disabled-bg;
+ border-color: @input-border-color;
}
- .@{ant-prefix}-input-affix-wrapper {
- &:not(&-disabled) {
- background-color: @background-color;
- }
+ .@{ant-prefix}-input-affix-wrapper-disabled {
+ background-color: @input-disabled-bg;
+ border-color: @input-border-color;
+
input:focus {
box-shadow: none !important;
}
diff --git a/components/form/style/status.less b/components/form/style/status.less
index b2fd7da7f1..2887dc6864 100644
--- a/components/form/style/status.less
+++ b/components/form/style/status.less
@@ -137,6 +137,7 @@
//select
.@{ant-prefix}-select:not(.@{ant-prefix}-select-borderless) {
.@{ant-prefix}-select-selector {
+ background-color: @form-warning-input-bg;
border-color: @warning-color !important;
}
&.@{ant-prefix}-select-open .@{ant-prefix}-select-selector,
@@ -148,12 +149,14 @@
//input-number, timepicker
.@{ant-prefix}-input-number,
.@{ant-prefix}-picker {
+ background-color: @form-warning-input-bg;
border-color: @warning-color;
&-focused,
&:focus {
.active(@warning-color);
}
&:not([disabled]):hover {
+ background-color: @form-warning-input-bg;
border-color: @warning-color;
}
}
@@ -175,6 +178,7 @@
//select
.@{ant-prefix}-select:not(.@{ant-prefix}-select-borderless) {
.@{ant-prefix}-select-selector {
+ background-color: @form-error-input-bg;
border-color: @error-color !important;
}
&.@{ant-prefix}-select-open .@{ant-prefix}-select-selector,
@@ -200,17 +204,34 @@
//input-number, timepicker
.@{ant-prefix}-input-number,
.@{ant-prefix}-picker {
+ background-color: @form-error-input-bg;
border-color: @error-color;
&-focused,
&:focus {
.active(@error-color);
}
&:not([disabled]):hover {
+ background-color: @form-error-input-bg;
border-color: @error-color;
}
}
+ .@{ant-prefix}-mention-wrapper {
+ .@{ant-prefix}-mention-editor {
+ &,
+ &:not([disabled]):hover {
+ background-color: @form-error-input-bg;
+ border-color: @error-color;
+ }
+ }
+ &.@{ant-prefix}-mention-active:not([disabled]) .@{ant-prefix}-mention-editor,
+ .@{ant-prefix}-mention-editor:not([disabled]):focus {
+ .active(@error-color);
+ }
+ }
+
.@{ant-prefix}-cascader-picker:focus .@{ant-prefix}-cascader-input {
+ background-color: @form-error-input-bg;
.active(@error-color);
}
diff --git a/components/grid/index.en-US.md b/components/grid/index.en-US.md
index 4a00fec1df..efff5f91a2 100644
--- a/components/grid/index.en-US.md
+++ b/components/grid/index.en-US.md
@@ -87,11 +87,11 @@ If the Ant Design grid layout component does not meet your needs, you can use th
### Row
-| Property | Description | Type | Default | Version |
-| --- | --- | --- | --- | --- |
-| align | Vertical alignment | `top` \| `middle` \| `bottom` | `top` | |
+| Property | Description | Type | Default | Version | |
+| --- | --- | --- | --- | --- | --- |
+| align | Vertical alignment | `top` \| `middle` \| `bottom` | `top` | | |
| gutter | Spacing between grids, could be a number or a object like { xs: 8, sm: 16, md: 24}. Or you can use array to make horizontal and vertical spacing work at the same time `[horizontal, vertical]` | number \| object \| array | 0 | | |
-| justify | Horizontal arrangement | `start` \| `end` \| `center` \| `space-around` \| `space-between` | `start` | |
+| justify | Horizontal arrangement | `start` \| `end` \| `center` \| `space-around` \| `space-between` | `start` | | |
### Col
diff --git a/components/icon/index.en-US.md b/components/icon/index.en-US.md
index e9912aeb8a..2711dae984 100644
--- a/components/icon/index.en-US.md
+++ b/components/icon/index.en-US.md
@@ -14,7 +14,7 @@ npm install --save @ant-design/icons
## List of icons
-```__react
+```_\_react
import IconDisplay from 'site/theme/template/IconDisplay';
ReactDOM.render( , mountNode);
```
@@ -45,7 +45,7 @@ import { StarOutlined, StarFilled, StarTwoTone } from '@ant-design/icons';
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| component | The component used for the root node | ComponentType | - | |
+| component | The component used for the root node | ComponentType<CustomIconComponentProps> | - | |
| rotate | Rotate degrees (not working in IE9) | number | - | |
| spin | Rotate icon with animation | boolean | false | |
| style | The style properties of icon, like `fontSize` and `color` | CSSProperties | - | |
@@ -113,7 +113,7 @@ The following options are available:
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
| extraCommonProps | Define extra properties to the component | { \[key: string]: any } | {} | |
-| scriptUrl | The URL generated by [iconfont.cn](http://iconfont.cn/) project. Support `string[]` after `@ant-design/icons@4.1.0` | string \| string[] | - | |
+| scriptUrl | The URL generated by [iconfont.cn](http://iconfont.cn/) project. Support `string[]` after `@ant-design/icons@4.1.0` | string \| string\[] | - | |
The property `scriptUrl` should be set to import the SVG sprite symbols.
diff --git a/components/icon/index.zh-CN.md b/components/icon/index.zh-CN.md
index b763df94d4..cc85feb603 100644
--- a/components/icon/index.zh-CN.md
+++ b/components/icon/index.zh-CN.md
@@ -19,7 +19,7 @@ npm install --save @ant-design/icons
## 图标列表
-```__react
+```_\_react
import IconDisplay from 'site/theme/template/IconDisplay';
ReactDOM.render( , mountNode);
```
@@ -52,7 +52,7 @@ import { StarOutlined, StarFilled, StarTwoTone } from '@ant-design/icons';
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| component | 控制如何渲染图标,通常是一个渲染根标签为 `` 的 React 组件 | ComponentType | - | |
+| component | 控制如何渲染图标,通常是一个渲染根标签为 `` 的 React 组件 | ComponentType<CustomIconComponentProps> | - | |
| rotate | 图标旋转角度(IE9 无效) | number | - | |
| spin | 是否有旋转动画 | boolean | false | |
| style | 设置图标的样式,例如 `fontSize` 和 `color` | CSSProperties | - | |
@@ -108,7 +108,7 @@ options 的配置项如下:
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| extraCommonProps | 给所有的 `svg` 图标 ` ` 组件设置额外的属性 | { \[key: string]: any } | {} | |
-| scriptUrl | [iconfont.cn](http://iconfont.cn/) 项目在线生成的 js 地址,`@ant-design/icons@4.1.0` 之后支持 `string[]` 类型 | string \| string[] | - | |
+| scriptUrl | [iconfont.cn](http://iconfont.cn/) 项目在线生成的 js 地址,`@ant-design/icons@4.1.0` 之后支持 `string[]` 类型 | string \| string\[] | - | |
在 `scriptUrl` 都设置有效的情况下,组件在渲染前会自动引入 [iconfont.cn](http://iconfont.cn/) 项目中的图标符号集,无需手动引入。
@@ -148,10 +148,10 @@ ReactDOM.render( , mountNode);
`Icon` 中的 `component` 组件的接受的属性如下:
-| 字段 | 说明 | 类型 | 只读值 | 版本 |
-| --------- | ----------------------- | ---------------- | -------------- | ---- |
-| className | 计算后的 `svg` 类名 | string | - | |
-| fill | `svg` 元素填充的颜色 | string | `currentColor` | |
-| height | `svg` 元素高度 | string \| number | `1em` | |
-| style | 计算后的 `svg` 元素样式 | CSSProperties | - | |
-| width | `svg` 元素宽度 | string \| number | `1em` | |
+| 字段 | 说明 | 类型 | 只读值 | 版本 |
+| --- | --- | --- | --- | --- |
+| className | 计算后的 `svg` 类名 | string | - | |
+| fill | `svg` 元素填充的颜色 | string | `currentColor` | |
+| height | `svg` 元素高度 | string \| number | `1em` | |
+| style | 计算后的 `svg` 元素样式 | CSSProperties | - | |
+| width | `svg` 元素宽度 | string \| number | `1em` | |
diff --git a/components/image/index.en-US.md b/components/image/index.en-US.md
index d1827beb9e..5527cfc51e 100644
--- a/components/image/index.en-US.md
+++ b/components/image/index.en-US.md
@@ -35,4 +35,4 @@ Previewable image.
}
```
-Other attributes [ ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#Attributes)
+Other attributes [<img>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#Attributes)
diff --git a/components/image/index.zh-CN.md b/components/image/index.zh-CN.md
index 8c23f9b07e..3fbcefb438 100644
--- a/components/image/index.zh-CN.md
+++ b/components/image/index.zh-CN.md
@@ -36,4 +36,4 @@ cover: https://gw.alipayobjects.com/zos/antfincdn/D1dXz9PZqa/image.svg
}
```
-其他属性见 [ ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#Attributes)
+其他属性见 [<img>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#Attributes)
diff --git a/components/input-number/index.en-US.md b/components/input-number/index.en-US.md
index 870949ef78..63a786b2fe 100644
--- a/components/input-number/index.en-US.md
+++ b/components/input-number/index.en-US.md
@@ -16,28 +16,28 @@ When a numeric value needs to be provided.
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
| autoFocus | If get focus when component mounted | boolean | false | - |
+| decimalSeparator | Decimal separator | string | - | - |
| defaultValue | The initial value | number | - | - |
| disabled | If disable the input | boolean | false | - |
-| readOnly | If readonly the input | boolean | false | - |
| formatter | Specifies the format of the value presented | function(value: number \| string): string | - | - |
| max | The max value | number | [Number.MAX_SAFE_INTEGER](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) | - |
| min | The min value | number | [Number.MIN_SAFE_INTEGER](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER) | - |
| parser | Specifies the value extracted from formatter | function(string): number | - | - |
| precision | The precision of input value | number | - | - |
-| decimalSeparator | Decimal separator | string | - | - |
+| readOnly | If readonly the input | boolean | false | - |
| size | The height of input box | `large` \| `middle` \| `small` | - | - |
| step | The number to which the current value is increased or decreased. It can be an integer or decimal | number \| string | 1 | - |
| value | The current value | number | - | - |
| onChange | The callback triggered when the value is changed | function(value: number \| string) | - | - |
| onPressEnter | The callback function that is triggered when Enter key is pressed | function(e) | - | - |
-| onStep | The callback function that is triggered when click up or down buttons | `(value: number, info: { offset: number, type: 'up' | 'down' }) => void` | - | 4.7.0 |
+| onStep | The callback function that is triggered when click up or down buttons | (value: number, info: { offset: number, type: 'up' \| 'down' }) => void | - | 4.7.0 |
## Methods
-| Name | Description |
-| ------- | ------------ |
-| blur() | Remove focus |
-| focus() | Get focus |
+| Name | Description |
+| --- | --- |
+| blur() | Remove focus |
+| focus() | Get focus |
## Notes
diff --git a/components/input-number/index.zh-CN.md b/components/input-number/index.zh-CN.md
index 5766f32f3f..eb00ec9eb6 100644
--- a/components/input-number/index.zh-CN.md
+++ b/components/input-number/index.zh-CN.md
@@ -19,25 +19,25 @@ cover: https://gw.alipayobjects.com/zos/alicdn/XOS8qZ0kU/InputNumber.svg
| 成员 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| autoFocus | 自动获取焦点 | boolean | false | - |
+| decimalSeparator | 小数点 | string | - | - |
| defaultValue | 初始值 | number | - | - |
| disabled | 禁用 | boolean | false | - |
-| readOnly | 只读 | boolean | false | - |
| formatter | 指定输入框展示值的格式 | function(value: number \| string): string | - | - |
| max | 最大值 | number | [Number.MAX_SAFE_INTEGER](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) | - |
| min | 最小值 | number | [Number.MIN_SAFE_INTEGER](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER) | - |
| parser | 指定从 `formatter` 里转换回数字的方式,和 `formatter` 搭配使用 | function(string): number | - | - |
| precision | 数值精度 | number | - | - |
-| decimalSeparator | 小数点 | string | - | - |
+| readOnly | 只读 | boolean | false | - |
| size | 输入框大小 | `large` \| `middle` \| `small` | - | - |
| step | 每次改变步数,可以为小数 | number \| string | 1 | - |
| value | 当前值 | number | - | - |
| onChange | 变化回调 | function(value: number \| string) | - | - |
| onPressEnter | 按下回车的回调 | function(e) | - | - |
-| onStep | 点击上下箭头的回调 | `(value: number, info: { offset: number, type: 'up' | 'down' }) => void` | - | 4.7.0 |
+| onStep | 点击上下箭头的回调 | (value: number, info: { offset: number, type: 'up' \| 'down' }) => void | - | 4.7.0 |
## 方法
-| 名称 | 描述 |
-| ------- | -------- |
-| blur() | 移除焦点 |
+| 名称 | 描述 |
+| --- | --- |
+| blur() | 移除焦点 |
| focus() | 获取焦点 |
diff --git a/components/input/ClearableLabeledInput.tsx b/components/input/ClearableLabeledInput.tsx
index b15350a7dc..c049a72a63 100644
--- a/components/input/ClearableLabeledInput.tsx
+++ b/components/input/ClearableLabeledInput.tsx
@@ -112,20 +112,18 @@ class ClearableLabeledInput extends React.Component {
const prefixNode = prefix ? {prefix} : null;
- const affixWrapperCls = classNames(
- `${prefixCls}-affix-wrapper`,
- {
- [`${prefixCls}-affix-wrapper-focused`]: focused,
- [`${prefixCls}-affix-wrapper-disabled`]: disabled,
- [`${prefixCls}-affix-wrapper-sm`]: size === 'small',
- [`${prefixCls}-affix-wrapper-lg`]: size === 'large',
- [`${prefixCls}-affix-wrapper-input-with-clear-btn`]: suffix && allowClear && value,
- [`${prefixCls}-affix-wrapper-rtl`]: direction === 'rtl',
- [`${prefixCls}-affix-wrapper-readonly`]: readOnly,
- [`${prefixCls}-affix-wrapper-borderless`]: !bordered,
- },
- className,
- );
+ const affixWrapperCls = classNames(`${prefixCls}-affix-wrapper`, {
+ [`${prefixCls}-affix-wrapper-focused`]: focused,
+ [`${prefixCls}-affix-wrapper-disabled`]: disabled,
+ [`${prefixCls}-affix-wrapper-sm`]: size === 'small',
+ [`${prefixCls}-affix-wrapper-lg`]: size === 'large',
+ [`${prefixCls}-affix-wrapper-input-with-clear-btn`]: suffix && allowClear && value,
+ [`${prefixCls}-affix-wrapper-rtl`]: direction === 'rtl',
+ [`${prefixCls}-affix-wrapper-readonly`]: readOnly,
+ [`${prefixCls}-affix-wrapper-borderless`]: !bordered,
+ // https://github.com/ant-design/ant-design/issues/27258
+ [`${className}`]: !allowClear && className,
+ });
return (
{
setValue(value: string, callback?: () => void) {
if (this.props.value === undefined) {
this.setState({ value }, callback);
+ } else {
+ callback?.();
}
}
diff --git a/components/input/TextArea.tsx b/components/input/TextArea.tsx
index 75772bb98e..f0d037ca77 100644
--- a/components/input/TextArea.tsx
+++ b/components/input/TextArea.tsx
@@ -4,8 +4,8 @@ import omit from 'omit.js';
import classNames from 'classnames';
import ClearableLabeledInput from './ClearableLabeledInput';
import { ConfigConsumer, ConfigConsumerProps } from '../config-provider';
-import SizeContext, { SizeType } from '../config-provider/SizeContext';
import { fixControlledValue, resolveOnChange } from './Input';
+import SizeContext, { SizeType } from '../config-provider/SizeContext';
export interface TextAreaProps extends RcTextAreaProps {
allowClear?: boolean;
@@ -79,18 +79,18 @@ class TextArea extends React.Component {
};
renderTextArea = (prefixCls: string, bordered: boolean, size?: SizeType) => {
- const { size: customizeSize } = this.props;
+ const { showCount, className, style, size: customizeSize } = this.props;
+
return (
{
bordered = true,
showCount = false,
maxLength,
+ className,
+ style,
} = this.props;
+
const prefixCls = getPrefixCls('input', customizePrefixCls);
+
+ // Max length value
const hasMaxLength = Number(maxLength) > 0;
value = hasMaxLength ? value.slice(0, maxLength) : value;
- const valueLength = [...value].length;
- const dataCount = `${valueLength}${hasMaxLength ? ` / ${maxLength}` : ''}`;
- return (
-
- {size => (
-
-
-
- )}
-
+ // TextArea
+ const textareaNode = (size?: SizeType) => (
+
);
+
+ // Only show text area wrapper when needed
+ if (showCount) {
+ const valueLength = [...value].length;
+ const dataCount = `${valueLength}${hasMaxLength ? ` / ${maxLength}` : ''}`;
+
+ return (
+
+ {(size?: SizeType) => (
+
+ {textareaNode(size)}
+
+ )}
+
+ );
+ }
+
+ return {textareaNode} ;
};
render() {
diff --git a/components/input/__tests__/Search.test.js b/components/input/__tests__/Search.test.js
index 4090389081..49f0546be6 100644
--- a/components/input/__tests__/Search.test.js
+++ b/components/input/__tests__/Search.test.js
@@ -209,4 +209,11 @@ describe('Input.Search', () => {
wrapper.find('button').simulate('mousedown');
}).not.toThrow();
});
+
+ // https://github.com/ant-design/ant-design/issues/27258
+ it('Search with allowClear should have one className only', () => {
+ const wrapper = mount( );
+ expect(wrapper.find('.ant-input-group-wrapper').hasClass('className')).toBe(true);
+ expect(wrapper.find('.ant-input-affix-wrapper').hasClass('className')).toBe(false);
+ });
});
diff --git a/components/input/__tests__/__snapshots__/demo.test.js.snap b/components/input/__tests__/__snapshots__/demo.test.js.snap
index 4eb217ad12..29ceacf05a 100644
--- a/components/input/__tests__/__snapshots__/demo.test.js.snap
+++ b/components/input/__tests__/__snapshots__/demo.test.js.snap
@@ -260,15 +260,11 @@ Array [
rows="1"
/>
,
-
-
-
,
+ ,
,
,
,
- ,
+ ,
]
`;
exports[`renders ./components/input/demo/autosize-textarea.md correctly 1`] = `
Array [
-
-
-
,
+ ,
,
-
-
-
,
+ ,
,
-
-
-
,
+ ,
]
`;
@@ -1113,47 +1093,39 @@ exports[`renders ./components/input/demo/borderless-debug.md correctly 1`] = `
type="text"
value=""
/>
-
+
-
-
+
@@ -2764,14 +2736,10 @@ Array [
`;
exports[`renders ./components/input/demo/textarea.md correctly 1`] = `
-
-
-
+
`;
exports[`renders ./components/input/demo/textarea-resize.md correctly 1`] = `
@@ -2785,16 +2753,12 @@ Array [
Auto Resize: false
,
-
-
-
,
+ The autoSize property applies to textarea nodes, and only the height changes automatically. In addition, autoSize can be set to an object, specifying the minimum number of rows and the maximum number of rows. The autoSize property applies to textarea nodes, and only the height changes automatically. In addition, autoSize can be set to an object, specifying the minimum number of rows and the maximum number of rows.
+ ,
]
`;
diff --git a/components/input/__tests__/__snapshots__/textarea.test.js.snap b/components/input/__tests__/__snapshots__/textarea.test.js.snap
index a8c15bcc7c..313529a898 100644
--- a/components/input/__tests__/__snapshots__/textarea.test.js.snap
+++ b/components/input/__tests__/__snapshots__/textarea.test.js.snap
@@ -1,315 +1,271 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`TextArea allowClear should change type when click 1`] = `
-
-`;
-
-exports[`TextArea allowClear should change type when click 2`] = `
-
-`;
-
-exports[`TextArea allowClear should not show icon if defaultValue is undefined, null or empty string 1`] = `
-
-`;
-
-exports[`TextArea allowClear should not show icon if defaultValue is undefined, null or empty string 2`] = `
-
-`;
-
-exports[`TextArea allowClear should not show icon if defaultValue is undefined, null or empty string 3`] = `
-
-`;
-
-exports[`TextArea allowClear should not show icon if value is undefined, null or empty string 1`] = `
-
-`;
-
-exports[`TextArea allowClear should not show icon if value is undefined, null or empty string 2`] = `
-
-`;
-
-exports[`TextArea allowClear should not show icon if value is undefined, null or empty string 3`] = `
-
-`;
-
-exports[`TextArea should support disabled 1`] = `
-
-
-
-`;
-
-exports[`TextArea should support maxLength 1`] = `
-
+
+
+
+
+
+
+
+`;
+
+exports[`TextArea allowClear should change type when click 2`] = `
+
-
+
+
+
+
+
+
+`;
+
+exports[`TextArea allowClear should not show icon if defaultValue is undefined, null or empty string 1`] = `
+
+
+
+
+
+
+
+
+`;
+
+exports[`TextArea allowClear should not show icon if defaultValue is undefined, null or empty string 2`] = `
+
+
+
+
+
+
+
+
+`;
+
+exports[`TextArea allowClear should not show icon if defaultValue is undefined, null or empty string 3`] = `
+
+
+
+
+
+
+
+
+`;
+
+exports[`TextArea allowClear should not show icon if value is undefined, null or empty string 1`] = `
+
+
+
+
+
+
+
+
+`;
+
+exports[`TextArea allowClear should not show icon if value is undefined, null or empty string 2`] = `
+
+
+
+
+
+
+
+
+`;
+
+exports[`TextArea allowClear should not show icon if value is undefined, null or empty string 3`] = `
+
+
+
+
+
+
+
+
+`;
+
+exports[`TextArea should support disabled 1`] = `
+
+`;
+
+exports[`TextArea should support maxLength 1`] = `
+
`;
exports[`TextArea should support size 1`] = `
-
-
-
+
`;
diff --git a/components/input/__tests__/textarea.test.js b/components/input/__tests__/textarea.test.js
index 1492c636f5..ba608bb735 100644
--- a/components/input/__tests__/textarea.test.js
+++ b/components/input/__tests__/textarea.test.js
@@ -133,11 +133,27 @@ describe('TextArea', () => {
expect(textarea.find('textarea').prop('value')).toBe(input.getDOMNode().value);
});
- it('should support showCount', async () => {
- const wrapper = mount();
- const textarea = wrapper.find('.ant-input-textarea');
- expect(wrapper.find('textarea').prop('value')).toBe('12345');
- expect(textarea.prop('data-count')).toBe('5 / 5');
+ describe('should support showCount', () => {
+ it('maxLength', () => {
+ const wrapper = mount();
+ const textarea = wrapper.find('.ant-input-textarea');
+ expect(wrapper.find('textarea').prop('value')).toBe('12345');
+ expect(textarea.prop('data-count')).toBe('5 / 5');
+ });
+
+ it('className & style patch to outer', () => {
+ const wrapper = mount(
+ ,
+ );
+
+ // Outer
+ expect(wrapper.find('div').first().hasClass('bamboo')).toBeTruthy();
+ expect(wrapper.find('div').first().props().style.background).toEqual('red');
+
+ // Inner
+ expect(wrapper.find('.ant-input').hasClass('bamboo')).toBeFalsy();
+ expect(wrapper.find('.ant-input').props().style.background).toBeFalsy();
+ });
});
it('should support size', async () => {
diff --git a/components/input/index.en-US.md b/components/input/index.en-US.md
index 70ae4ea84f..4b8dc257f1 100644
--- a/components/input/index.en-US.md
+++ b/components/input/index.en-US.md
@@ -20,6 +20,8 @@ A basic widget for getting the user input is a text field. Keyboard and mouse ca
| --- | --- | --- | --- | --- |
| addonAfter | The label text displayed after (on the right side of) the input field | ReactNode | - | |
| addonBefore | The label text displayed before (on the left side of) the input field | ReactNode | - | |
+| allowClear | If allow to remove input content with clear icon | boolean | false | |
+| bordered | Whether has border style | boolean | true | 4.5.0 |
| defaultValue | The initial input content | string | - | |
| disabled | Whether the input is disabled | boolean | false | |
| id | The ID for input | string | - | |
@@ -31,8 +33,6 @@ A basic widget for getting the user input is a text field. Keyboard and mouse ca
| value | The input content value | string | - | |
| onChange | Callback when user input | function(e) | - | |
| onPressEnter | The callback function that is triggered when Enter key is pressed | function(e) | - | |
-| allowClear | If allow to remove input content with clear icon | boolean | false | |
-| bordered | Whether has border style | boolean | true | 4.5.0 |
> When `Input` is used in a `Form.Item` context, if the `Form.Item` has the `id` and `options` props defined then `value`, `defaultValue`, and `id` props of `Input` are automatically set.
@@ -42,15 +42,15 @@ The rest of the props of Input are exactly the same as the original [input](http
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
+| allowClear | If allow to remove input content with clear icon | boolean | false | |
| autoSize | Height autosize feature, can be set to true \| false or an object { minRows: 2, maxRows: 6 } | boolean \| object | false | |
+| bordered | Whether has border style | boolean | true | 4.5.0 |
| defaultValue | The initial input content | string | - | |
+| maxLength | The max length | number | - | 4.7.0 |
+| showCount | Whether show text count | boolean | false | 4.7.0 |
| value | The input content value | string | - | |
| onPressEnter | The callback function that is triggered when Enter key is pressed | function(e) | - | |
-| allowClear | If allow to remove input content with clear icon | boolean | false | |
| onResize | The callback function that is triggered when resize | function({ width, height }) | - | |
-| bordered | Whether has border style | boolean | true | 4.5.0 |
-| showCount | Whether show text count | boolean | false | |
-| maxLength | The max length | number | - | |
The rest of the props of `Input.TextArea` are the same as the original [textarea](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea).
@@ -59,8 +59,8 @@ The rest of the props of `Input.TextArea` are the same as the original [textarea
| Property | Description | Type | Default |
| --- | --- | --- | --- |
| enterButton | Whether to show an enter button after input. This property conflicts with the `addonAfter` property | boolean \| ReactNode | false |
-| onSearch | The callback function triggered when you click on the search-icon, the clear-icon or press the Enter key | function(value, event) | - |
| loading | Search box with loading | boolean | false |
+| onSearch | The callback function triggered when you click on the search-icon, the clear-icon or press the Enter key | function(value, event) | - |
Supports all props of `Input`.
@@ -82,8 +82,8 @@ Supports all props of `Input`.
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
-| visibilityToggle | Whether show toggle button | boolean | true | |
| iconRender | Custom toggle button | (visible) => ReactNode | (visible) => (visible ? <EyeOutlined /> : <EyeInvisibleOutlined />) | 4.3.0 |
+| visibilityToggle | Whether show toggle button | boolean | true | |
## FAQ
diff --git a/components/input/index.zh-CN.md b/components/input/index.zh-CN.md
index 56431164e1..9cb0d04465 100644
--- a/components/input/index.zh-CN.md
+++ b/components/input/index.zh-CN.md
@@ -21,6 +21,8 @@ cover: https://gw.alipayobjects.com/zos/alicdn/xS9YEJhfe/Input.svg
| --- | --- | --- | --- | --- |
| addonAfter | 带标签的 input,设置后置标签 | ReactNode | - | |
| addonBefore | 带标签的 input,设置前置标签 | ReactNode | - | |
+| allowClear | 可以点击清除图标删除内容 | boolean | - | |
+| bordered | 是否有边框 | boolean | true | 4.5.0 |
| defaultValue | 输入框默认内容 | string | - | |
| disabled | 是否禁用状态,默认为 false | boolean | false | |
| id | 输入框的 id | string | - | |
@@ -32,8 +34,6 @@ cover: https://gw.alipayobjects.com/zos/alicdn/xS9YEJhfe/Input.svg
| value | 输入框内容 | string | - | |
| onChange | 输入框内容变化时的回调 | function(e) | - | |
| onPressEnter | 按下回车的回调 | function(e) | - | |
-| allowClear | 可以点击清除图标删除内容 | boolean | - | |
-| bordered | 是否有边框 | boolean | true | 4.5.0 |
> 如果 `Input` 在 `Form.Item` 内,并且 `Form.Item` 设置了 `id` 和 `options` 属性,则 `value` `defaultValue` 和 `id` 属性会被自动设置。
@@ -43,15 +43,15 @@ Input 的其他属性和 React 自带的 [input](https://facebook.github.io/reac
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
+| allowClear | 可以点击清除图标删除内容 | boolean | false | |
| autoSize | 自适应内容高度,可设置为 true \| false 或对象:{ minRows: 2, maxRows: 6 } | boolean \| object | false | |
+| bordered | 是否有边框 | boolean | true | 4.5.0 |
| defaultValue | 输入框默认内容 | string | - | |
+| maxLength | 内容最大长度 | number | - | 4.7.0 |
+| showCount | 是否展示字数 | boolean | false | 4.7.0 |
| value | 输入框内容 | string | - | |
| onPressEnter | 按下回车的回调 | function(e) | - | |
-| allowClear | 可以点击清除图标删除内容 | boolean | false | |
| onResize | resize 回调 | function({ width, height }) | - | |
-| bordered | 是否有边框 | boolean | true | 4.5.0 |
-| showCount | 是否展示字数 | boolean | false | |
-| maxLength | 内容最大长度 | number | - | |
`Input.TextArea` 的其他属性和浏览器自带的 [textarea](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea) 一致。
@@ -60,8 +60,8 @@ Input 的其他属性和 React 自带的 [input](https://facebook.github.io/reac
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| enterButton | 是否有确认按钮,可设为按钮文字。该属性会与 `addonAfter` 冲突。 | boolean \| ReactNode | false |
-| onSearch | 点击搜索图标、清除图标,或按下回车键时的回调 | function(value, event) | - |
| loading | 搜索 loading | boolean | false |
+| onSearch | 点击搜索图标、清除图标,或按下回车键时的回调 | function(value, event) | - |
其余属性和 Input 一致。
@@ -83,8 +83,8 @@ Input 的其他属性和 React 自带的 [input](https://facebook.github.io/reac
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
-| visibilityToggle | 是否显示切换按钮 | boolean | true | |
| iconRender | 自定义切换按钮 | (visible) => ReactNode | (visible) => (visible ? <EyeOutlined /> : <EyeInvisibleOutlined />) | 4.3.0 |
+| visibilityToggle | 是否显示切换按钮 | boolean | true | |
## FAQ
diff --git a/components/layout/Sider.tsx b/components/layout/Sider.tsx
index c21a1b478b..bb5e84fe78 100644
--- a/components/layout/Sider.tsx
+++ b/components/layout/Sider.tsx
@@ -20,7 +20,7 @@ const dimensionMaxMap = {
export interface SiderContextProps {
siderCollapsed?: boolean;
- collapsedWidth?: string | number;
+ collapsedWidth?: number | string;
}
export const SiderContext: React.Context = React.createContext({});
diff --git a/components/layout/__tests__/__snapshots__/demo.test.js.snap b/components/layout/__tests__/__snapshots__/demo.test.js.snap
index ea35c40e16..09c3f99c34 100644
--- a/components/layout/__tests__/__snapshots__/demo.test.js.snap
+++ b/components/layout/__tests__/__snapshots__/demo.test.js.snap
@@ -1141,7 +1141,7 @@ exports[`renders ./components/layout/demo/side.md correctly 1`] = `
-
+
+ Files
+
diff --git a/components/layout/demo/side.md b/components/layout/demo/side.md
index af83ba5bda..84b7914a07 100644
--- a/components/layout/demo/side.md
+++ b/components/layout/demo/side.md
@@ -44,9 +44,10 @@ class SiderDemo extends React.Component {
};
render() {
+ const { collapsed } = this.state;
return (
-
+
}>
@@ -64,7 +65,9 @@ class SiderDemo extends React.Component {
Team 1
Team 2
- } />
+ }>
+ Files
+
diff --git a/components/layout/index.en-US.md b/components/layout/index.en-US.md
index 990a2bb788..e372075de5 100644
--- a/components/layout/index.en-US.md
+++ b/components/layout/index.en-US.md
@@ -94,14 +94,14 @@ The sidebar.
| collapsedWidth | Width of the collapsed sidebar, by setting to 0 a special trigger will appear | number | 80 |
| collapsible | Whether can be collapsed | boolean | false |
| defaultCollapsed | To set the initial status | boolean | false |
-| onBreakpoint | The callback function, executed when [breakpoints](/components/grid/#API) changed | (broken) => {} | - |
-| onCollapse | The callback function, executed by clicking the trigger or activating the responsive layout | (collapsed, type) => {} | - |
| reverseArrow | Reverse direction of arrow, for a sider that expands from the right | boolean | false |
| style | To customize the styles | CSSProperties | - |
| theme | Color theme of the sidebar | `light` \| `dark` | `dark` |
| trigger | Specify the customized trigger, set to null to hide the trigger | ReactNode | - |
| width | Width of the sidebar | number \| string | 200 |
| zeroWidthTriggerStyle | To customize the styles of the special trigger that appears when `collapsedWidth` is 0 | object | - |
+| onBreakpoint | The callback function, executed when [breakpoints](/components/grid/#API) changed | (broken) => {} | - |
+| onCollapse | The callback function, executed by clicking the trigger or activating the responsive layout | (collapsed, type) => {} | - |
#### breakpoint width
diff --git a/components/layout/index.zh-CN.md b/components/layout/index.zh-CN.md
index d033099c13..54d10cfcf3 100644
--- a/components/layout/index.zh-CN.md
+++ b/components/layout/index.zh-CN.md
@@ -95,14 +95,14 @@ cover: https://gw.alipayobjects.com/zos/alicdn/hzEndUVEx/Layout.svg
| collapsedWidth | 收缩宽度,设置为 0 会出现特殊 trigger | number | 80 |
| collapsible | 是否可收起 | boolean | false |
| defaultCollapsed | 是否默认收起 | boolean | false |
-| onBreakpoint | 触发响应式布局[断点](/components/grid/#API)时的回调 | (broken) => {} | - |
-| onCollapse | 展开-收起时的回调函数,有点击 trigger 以及响应式反馈两种方式可以触发 | (collapsed, type) => {} | - |
| reverseArrow | 翻转折叠提示箭头的方向,当 Sider 在右边时可以使用 | boolean | false |
| style | 指定样式 | CSSProperties | - |
| theme | 主题颜色 | `light` \| `dark` | `dark` |
| trigger | 自定义 trigger,设置为 null 时隐藏 trigger | ReactNode | - |
| width | 宽度 | number \| string | 200 |
| zeroWidthTriggerStyle | 指定当 `collapsedWidth` 为 0 时出现的特殊 trigger 的样式 | object | - |
+| onBreakpoint | 触发响应式布局[断点](/components/grid/#API)时的回调 | (broken) => {} | - |
+| onCollapse | 展开-收起时的回调函数,有点击 trigger 以及响应式反馈两种方式可以触发 | (collapsed, type) => {} | - |
#### breakpoint width
diff --git a/components/layout/style/light.less b/components/layout/style/light.less
index bee2b222df..35d636df1c 100644
--- a/components/layout/style/light.less
+++ b/components/layout/style/light.less
@@ -1,4 +1,4 @@
-.@{layout-prefix-cls}-sider.@{layout-prefix-cls}-light {
+.@{layout-prefix-cls}-sider-light {
background: @layout-sider-background-light;
.@{layout-prefix-cls}-sider-trigger {
color: @layout-trigger-color-light;
diff --git a/components/list/__tests__/index.test.js b/components/list/__tests__/index.test.js
index 053381f896..6ff8527356 100644
--- a/components/list/__tests__/index.test.js
+++ b/components/list/__tests__/index.test.js
@@ -17,11 +17,6 @@ describe('List', () => {
const dataSource = [];
const wrapper = mount(
);
- expect(
- wrapper
- .find('div')
- .first()
- .props().locale,
- ).toBe(undefined);
+ expect(wrapper.find('div').first().props().locale).toBe(undefined);
});
});
diff --git a/components/list/demo/grid-test.md b/components/list/demo/grid-test.md
index c004406fc4..50bf67ccdc 100644
--- a/components/list/demo/grid-test.md
+++ b/components/list/demo/grid-test.md
@@ -33,7 +33,7 @@ const data = [
{
title: 'Title 5',
},
- {
+ {
title: 'Title 6',
},
];
@@ -57,11 +57,7 @@ ReactDOM.render(
>
)}
/>
- }
- />
+ } />
ReactNode | - | |
+| rowKey | Item's unique key, could be a string or function that returns a string | string \| Function(record): string | `key` | |
| size | Size of list | `default` \| `large` \| `small` | `default` | |
| split | Toggles rendering of the split under the list item | boolean | true | |
-| dataSource | DataSource array for list | any[] | - | |
-| renderItem | Customize list item when using `dataSource` | (item) => ReactNode | - | |
### pagination
Properties for pagination.
-| Property | Description | Type | Default |
-| -------- | ---------------------------------------- | --------------------------- | -------- |
+| Property | Description | Type | Default |
+| --- | --- | --- | --- |
| position | The specify the position of `Pagination` | `top` \| `bottom` \| `both` | `bottom` |
More about pagination, please check [`Pagination`](/components/pagination/).
### List grid props
-| Property | Description | Type | Default | Version |
-| -------- | ------------------------ | ------ | ------- | ------- |
-| column | The column of grid | number | - | |
-| gutter | The spacing between grid | number | 0 | |
-| xs | `<576px` column of grid | number | - | |
-| sm | `≥576px` column of grid | number | - | |
-| md | `≥768px` column of grid | number | - | |
-| lg | `≥992px` column of grid | number | - | |
-| xl | `≥1200px` column of grid | number | - | |
-| xxl | `≥1600px` column of grid | number | - | |
+| Property | Description | Type | Default | Version |
+| --- | --- | --- | --- | --- |
+| column | The column of grid | number | - | |
+| gutter | The spacing between grid | number | 0 | |
+| xs | `<576px` column of grid | number | - | |
+| sm | `≥576px` column of grid | number | - | |
+| md | `≥768px` column of grid | number | - | |
+| lg | `≥992px` column of grid | number | - | |
+| xl | `≥1200px` column of grid | number | - | |
+| xxl | `≥1600px` column of grid | number | - | |
### List.Item
@@ -65,8 +65,8 @@ More about pagination, please check [`Pagination`](/components/pagination/).
### List.Item.Meta
-| Property | Description | Type | Default | Version |
-| ----------- | ---------------------------- | --------- | ------- | ------- |
-| avatar | The avatar of list item | ReactNode | - | |
-| description | The description of list item | ReactNode | - | |
-| title | The title of list item | ReactNode | - | |
+| Property | Description | Type | Default | Version |
+| --- | --- | --- | --- | --- |
+| avatar | The avatar of list item | ReactNode | - | |
+| description | The description of list item | ReactNode | - | |
+| title | The title of list item | ReactNode | - | |
diff --git a/components/list/index.zh-CN.md b/components/list/index.zh-CN.md
index ce68ff35e3..05508ada30 100644
--- a/components/list/index.zh-CN.md
+++ b/components/list/index.zh-CN.md
@@ -22,6 +22,7 @@ cover: https://gw.alipayobjects.com/zos/alicdn/5FrZKStG_/List.svg
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| bordered | 是否展示边框 | boolean | false | |
+| dataSource | 列表数据源 | any\[] | - | |
| footer | 列表底部 | ReactNode | - | |
| grid | 列表栅格配置 | [object](#List-grid-props) | - | |
| header | 列表头部 | ReactNode | - | |
@@ -30,33 +31,32 @@ cover: https://gw.alipayobjects.com/zos/alicdn/5FrZKStG_/List.svg
| loadMore | 加载更多 | ReactNode | - | |
| locale | 默认文案设置,目前包括空数据文案 | object | {emptyText: `暂无数据`} | |
| pagination | 对应的 `pagination` 配置, 设置 false 不显示 | boolean \| object | false | |
+| renderItem | 当使用 dataSource 时,可以用 `renderItem` 自定义渲染列表项 | (item) => ReactNode | - | |
| size | list 的尺寸 | `default` \| `large` \| `small` | `default` | |
| split | 是否展示分割线 | boolean | true | |
-| dataSource | 列表数据源 | any[] | - | |
-| renderItem | 当使用 dataSource 时,可以用 `renderItem` 自定义渲染列表项 | (item) => ReactNode | - | |
### pagination
分页的配置项。
-| 参数 | 说明 | 类型 | 默认值 |
-| -------- | ------------------ | --------------------------- | -------- |
+| 参数 | 说明 | 类型 | 默认值 |
+| --- | --- | --- | --- |
| position | 指定分页显示的位置 | `top` \| `bottom` \| `both` | `bottom` |
更多配置项,请查看 [`Pagination`](/components/pagination/)。
### List grid props
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| ------ | -------------------- | ------ | ------ | ---- |
-| column | 列数 | number | - | |
-| gutter | 栅格间隔 | number | 0 | |
-| xs | `<576px` 展示的列数 | number | - | |
-| sm | `≥576px` 展示的列数 | number | - | |
-| md | `≥768px` 展示的列数 | number | - | |
-| lg | `≥992px` 展示的列数 | number | - | |
-| xl | `≥1200px` 展示的列数 | number | - | |
-| xxl | `≥1600px` 展示的列数 | number | - | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| column | 列数 | number | - | |
+| gutter | 栅格间隔 | number | 0 | |
+| xs | `<576px` 展示的列数 | number | - | |
+| sm | `≥576px` 展示的列数 | number | - | |
+| md | `≥768px` 展示的列数 | number | - | |
+| lg | `≥992px` 展示的列数 | number | - | |
+| xl | `≥1200px` 展示的列数 | number | - | |
+| xxl | `≥1600px` 展示的列数 | number | - | |
### List.Item
@@ -67,8 +67,8 @@ cover: https://gw.alipayobjects.com/zos/alicdn/5FrZKStG_/List.svg
### List.Item.Meta
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| ----------- | ------------------ | --------- | ------ | ---- |
-| avatar | 列表元素的图标 | ReactNode | - | |
-| description | 列表元素的描述内容 | ReactNode | - | |
-| title | 列表元素的标题 | ReactNode | - | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| avatar | 列表元素的图标 | ReactNode | - | |
+| description | 列表元素的描述内容 | ReactNode | - | |
+| title | 列表元素的标题 | ReactNode | - | |
diff --git a/components/locale-provider/by_BY.tsx b/components/locale-provider/by_BY.tsx
index f2c5a76b82..61e41a6f34 100644
--- a/components/locale-provider/by_BY.tsx
+++ b/components/locale-provider/by_BY.tsx
@@ -1,3 +1,3 @@
import locale from '../locale/by_BY';
-export default locale;
\ No newline at end of file
+export default locale;
diff --git a/components/locale/ar_EG.tsx b/components/locale/ar_EG.tsx
index ffa2085343..ec103d1df7 100644
--- a/components/locale/ar_EG.tsx
+++ b/components/locale/ar_EG.tsx
@@ -68,9 +68,9 @@ const localeValues: Locale = {
},
Form: {
defaultValidateMessages: {
- "default": 'خطأ في حقل الإدخال ${label}',
+ default: 'خطأ في حقل الإدخال ${label}',
required: 'يرجى إدخال ${label}',
- "enum": '${label} يجب أن يكون واحدا من [${enum}]',
+ enum: '${label} يجب أن يكون واحدا من [${enum}]',
whitespace: '${label} لا يمكن أن يكون حرفًا فارغًا',
date: {
format: '${label} تنسيق التاريخ غير صحيح',
diff --git a/components/locale/default.tsx b/components/locale/default.tsx
index 67b2d7e924..8b48689255 100644
--- a/components/locale/default.tsx
+++ b/components/locale/default.tsx
@@ -28,9 +28,9 @@ const localeValues: Locale = {
sortTitle: 'Sort',
expand: 'Expand row',
collapse: 'Collapse row',
- triggerDesc: 'Click sort by descend',
- triggerAsc: 'Click sort by ascend',
- cancelSort: 'Click to cancel sort',
+ triggerDesc: 'Click to sort descending',
+ triggerAsc: 'Click to sort ascending',
+ cancelSort: 'Click to cancel sorting',
},
Modal: {
okText: 'OK',
@@ -78,7 +78,7 @@ const localeValues: Locale = {
Form: {
optional: '(optional)',
defaultValidateMessages: {
- default: 'Field validation error ${label}',
+ default: 'Field validation error for ${label}',
required: 'Please enter ${label}',
enum: '${label} must be one of [${enum}]',
whitespace: '${label} cannot be a blank character',
@@ -104,14 +104,14 @@ const localeValues: Locale = {
},
string: {
len: '${label} must be ${len} characters',
- min: '${label} at least ${min} characters',
- max: '${label} up to ${max} characters',
+ min: '${label} must be at least ${min} characters',
+ max: '${label} must be up to ${max} characters',
range: '${label} must be between ${min}-${max} characters',
},
number: {
len: '${label} must be equal to ${len}',
- min: '${label} minimum value is ${min}',
- max: '${label} maximum value is ${max}',
+ min: '${label} must be minimum ${min}',
+ max: '${label} must be maximum ${max}',
range: '${label} must be between ${min}-${max}',
},
array: {
diff --git a/components/locale/en_GB.tsx b/components/locale/en_GB.tsx
index 6db6ad5f4a..0d85dd73ec 100644
--- a/components/locale/en_GB.tsx
+++ b/components/locale/en_GB.tsx
@@ -46,7 +46,7 @@ const localeValues: Locale = {
},
Form: {
defaultValidateMessages: {
- default: 'Field validation error ${label}',
+ default: 'Field validation error for ${label}',
required: 'Please enter ${label}',
enum: '${label} must be one of [${enum}]',
whitespace: '${label} cannot be a blank character',
@@ -72,14 +72,14 @@ const localeValues: Locale = {
},
string: {
len: '${label} must be ${len} characters',
- min: '${label} at least ${min} characters',
- max: '${label} up to ${max} characters',
+ min: '${label} must be at least ${min} characters',
+ max: '${label} must be up to ${max} characters',
range: '${label} must be between ${min}-${max} characters',
},
number: {
len: '${label} must be equal to ${len}',
- min: '${label} minimum value is ${min}',
- max: '${label} maximum value is ${max}',
+ min: '${label} must be minimum ${min}',
+ max: '${label} must be maximum ${max}',
range: '${label} must be between ${min}-${max}',
},
array: {
diff --git a/components/locale/ga_IE.tsx b/components/locale/ga_IE.tsx
index 5c222a1b25..c50106706a 100644
--- a/components/locale/ga_IE.tsx
+++ b/components/locale/ga_IE.tsx
@@ -26,9 +26,9 @@ const localeValues: Locale = {
sortTitle: 'Sort',
expand: 'Expand row',
collapse: 'Collapse row',
- triggerDesc: 'Click sort by descend',
- triggerAsc: 'Click sort by ascend',
- cancelSort: 'Click to cancel sort',
+ triggerDesc: 'Click to sort descending',
+ triggerAsc: 'Click to sort ascending',
+ cancelSort: 'Click to cancel sorting',
},
Modal: {
okText: 'OK',
@@ -75,7 +75,7 @@ const localeValues: Locale = {
},
Form: {
defaultValidateMessages: {
- default: 'Field validation error ${label}',
+ default: 'Field validation error for ${label}',
required: 'Please enter ${label}',
enum: '${label} must be one of [${enum}]',
whitespace: '${label} cannot be a blank character',
@@ -101,14 +101,14 @@ const localeValues: Locale = {
},
string: {
len: '${label} must be ${len} characters',
- min: '${label} at least ${min} characters',
- max: '${label} up to ${max} characters',
+ min: '${label} must be at least ${min} characters',
+ max: '${label} must be up to ${max} characters',
range: '${label} must be between ${min}-${max} characters',
},
number: {
len: '${label} must be equal to ${len}',
- min: '${label} minimum value is ${min}',
- max: '${label} maximum value is ${max}',
+ min: '${label} must be minimum ${min}',
+ max: '${label} must be maximum ${max}',
range: '${label} must be between ${min}-${max}',
},
array: {
diff --git a/components/mentions/index.en-US.md b/components/mentions/index.en-US.md
index d9fdf77880..e413737749 100644
--- a/components/mentions/index.en-US.md
+++ b/components/mentions/index.en-US.md
@@ -24,29 +24,29 @@ When need to mention someone or something.
| Property | Description | Type | Default |
| --- | --- | --- | --- |
| autoFocus | Auto get focus when component mounted | boolean | false |
+| autoSize | Textarea height autosize feature, can be set to true \| false or an object { minRows: 2, maxRows: 6 } | boolean \| object | false |
| defaultValue | Default value | string | - |
| filterOption | Customize filter option logic | false \| (input: string, option: OptionProps) => boolean | - |
+| getPopupContainer | Set the mount HTML node for suggestions | () => HTMLElement | - |
| notFoundContent | Set mentions content when not match | ReactNode | `Not Found` |
| placement | Set popup placement | `top` \| `bottom` | `bottom` |
-| prefix | Set trigger prefix keyword | string \| string[] | `@` |
-| split | Set split string before and after selected mention | string | `` |
+| prefix | Set trigger prefix keyword | string \| string\[] | `@` |
+| split | Set split string before and after selected mention | string | ` ` |
| validateSearch | Customize trigger search logic | (text: string, props: MentionsProps) => void | - |
| value | Set value of mentions | string | - |
-| onChange | Trigger when value changed | (text: string) => void | - |
-| onSelect | Trigger when user select the option | (option: OptionProps, prefix: string) => void | - |
-| onSearch | Trigger when prefix hit | (text: string, prefix: string) => void | - |
-| onFocus | Trigger when mentions get focus | () => void | - |
| onBlur | Trigger when mentions lose focus | () => void | - |
-| getPopupContainer | Set the mount HTML node for suggestions | () => HTMLElement | - |
-| autoSize | Textarea height autosize feature, can be set to true \| false or an object { minRows: 2, maxRows: 6 } | boolean \| object | false |
+| onChange | Trigger when value changed | (text: string) => void | - |
+| onFocus | Trigger when mentions get focus | () => void | - |
| onResize | The callback function that is triggered when textarea resize | function({ width, height }) | - |
+| onSearch | Trigger when prefix hit | (text: string, prefix: string) => void | - |
+| onSelect | Trigger when user select the option | (option: OptionProps, prefix: string) => void | - |
### Mention methods
-| Name | Description |
-| ------- | ------------ |
-| blur() | Remove focus |
-| focus() | Get focus |
+| Name | Description |
+| --- | --- |
+| blur() | Remove focus |
+| focus() | Get focus |
### Option
diff --git a/components/mentions/index.zh-CN.md b/components/mentions/index.zh-CN.md
index 0fdff80861..7876603712 100644
--- a/components/mentions/index.zh-CN.md
+++ b/components/mentions/index.zh-CN.md
@@ -25,33 +25,33 @@ cover: https://gw.alipayobjects.com/zos/alicdn/jPE-itMFM/Mentions.svg
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| autoFocus | 自动获得焦点 | boolean | false |
+| autoSize | 自适应内容高度,可设置为 true \| false 或对象:{ minRows: 2, maxRows: 6 } | boolean \| object | false |
| defaultValue | 默认值 | string | - |
| filterOption | 自定义过滤逻辑 | false \| (input: string, option: OptionProps) => boolean | - |
+| getPopupContainer | 指定建议框挂载的 HTML 节点 | () => HTMLElement | - |
| notFoundContent | 当下拉列表为空时显示的内容 | ReactNode | `Not Found` |
| placement | 弹出层展示位置 | `top` \| `bottom` | `bottom` |
-| prefix | 设置触发关键字 | string \| string[] | `@` |
-| split | 设置选中项前后分隔符 | string | `` |
+| prefix | 设置触发关键字 | string \| string\[] | `@` |
+| split | 设置选中项前后分隔符 | string | ` ` |
| validateSearch | 自定义触发验证逻辑 | (text: string, props: MentionsProps) => void | - |
| value | 设置值 | string | - |
-| onChange | 值改变时触发 | (text: string) => void | - |
-| onSelect | 选择选项时触发 | (option: OptionProps, prefix: string) => void | - |
-| onSearch | 搜索时触发 | (text: string, prefix: string) => void | - |
-| onFocus | 获得焦点时触发 | () => void | - |
| onBlur | 失去焦点时触发 | () => void | - |
-| getPopupContainer | 指定建议框挂载的 HTML 节点 | () => HTMLElement | - |
-| autoSize | 自适应内容高度,可设置为 true \| false 或对象:{ minRows: 2, maxRows: 6 } | boolean \| object | false |
+| onChange | 值改变时触发 | (text: string) => void | - |
+| onFocus | 获得焦点时触发 | () => void | - |
| onResize | resize 回调 | function({ width, height }) | - |
+| onSearch | 搜索时触发 | (text: string, prefix: string) => void | - |
+| onSelect | 选择选项时触发 | (option: OptionProps, prefix: string) => void | - |
### Mentions 方法
-| 名称 | 描述 |
-| ------- | -------- |
-| blur() | 移除焦点 |
+| 名称 | 描述 |
+| --- | --- |
+| blur() | 移除焦点 |
| focus() | 获取焦点 |
### Option
-| 参数 | 说明 | 类型 | 默认值 |
-| -------- | -------------- | --------- | ------ |
-| children | 选项内容 | ReactNode | - |
-| value | 选择时填充的值 | string | - |
+| 参数 | 说明 | 类型 | 默认值 |
+| --- | --- | --- | --- |
+| children | 选项内容 | ReactNode | - |
+| value | 选择时填充的值 | string | - |
diff --git a/components/menu/__tests__/__snapshots__/demo.test.js.snap b/components/menu/__tests__/__snapshots__/demo.test.js.snap
index b041d707e9..5682fab658 100644
--- a/components/menu/__tests__/__snapshots__/demo.test.js.snap
+++ b/components/menu/__tests__/__snapshots__/demo.test.js.snap
@@ -662,30 +662,28 @@ exports[`renders ./components/menu/demo/sider-current.md correctly 1`] = `
role="button"
style="padding-left:24px"
>
-
-
+
-
-
-
-
-
- Navigation One
-
+
+
+
+
+ Navigation One
- }
- >
+ } title="Navigation One">
Option 1
Option 2
Option 3
diff --git a/components/menu/index.en-US.md b/components/menu/index.en-US.md
index bc53fc19e4..38fd8af004 100644
--- a/components/menu/index.en-US.md
+++ b/components/menu/index.en-US.md
@@ -36,10 +36,6 @@ More layouts with navigation: [Layout](/components/layout).
| inlineIndent | Indent (in pixels) of inline menu items on each level | number | 24 | |
| mode | Type of menu | `vertical` \| `horizontal` \| `inline` | `vertical` | |
| multiple | Allows selection of multiple items | boolean | false | |
-| onClick | Called when a menu item is clicked | function({ item, key, keyPath, domEvent }) | - | |
-| onDeselect | Called when a menu item is deselected (multiple mode only) | function({ item, key, keyPath, selectedKeys, domEvent }) | - | |
-| onOpenChange | Called when sub-menus are opened or closed | function(openKeys: string\[]) | - | |
-| onSelect | Called when a menu item is selected | function({ item, key, keyPath, selectedKeys, domEvent }) | - | |
| openKeys | Array with the keys of currently opened sub-menus | string\[] | - | |
| overflowedIndicator | Customized icon when menu is collapsed | ReactNode | - | |
| selectable | Allows selecting menu items | boolean | true | |
@@ -49,18 +45,22 @@ More layouts with navigation: [Layout](/components/layout).
| subMenuOpenDelay | Delay time to show submenu when mouse enters, (in seconds) | number | 0 | |
| theme | Color theme of the menu | `light` \| `dark` | `light` | |
| triggerSubMenuAction | Which action can trigger submenu open/close | `hover` \| `click` | `hover` | |
+| onClick | Called when a menu item is clicked | function({ item, key, keyPath, domEvent }) | - | |
+| onDeselect | Called when a menu item is deselected (multiple mode only) | function({ item, key, keyPath, selectedKeys, domEvent }) | - | |
+| onOpenChange | Called when sub-menus are opened or closed | function(openKeys: string\[]) | - | |
+| onSelect | Called when a menu item is selected | function({ item, key, keyPath, selectedKeys, domEvent }) | - | |
> More options in [rc-menu](https://github.com/react-component/menu#api)
### Menu.Item
-| Param | Description | Type | Default value | Version |
-| -------- | ------------------------------------ | --------- | ------------- | ------- |
-| danger | Display the danger style | boolean | false | 4.3.0 |
-| disabled | Whether menu item is disabled | boolean | false | |
-| icon | The icon of the menu item | ReactNode | - | 4.2.0 |
-| key | Unique ID of the menu item | string | - | |
-| title | Set display title for collapsed item | string | - | |
+| Param | Description | Type | Default value | Version |
+| --- | --- | --- | --- | --- |
+| danger | Display the danger style | boolean | false | 4.3.0 |
+| disabled | Whether menu item is disabled | boolean | false | |
+| icon | The icon of the menu item | ReactNode | - | 4.2.0 |
+| key | Unique ID of the menu item | string | - | |
+| title | Set display title for collapsed item | string | - | |
> Note: `icon` is a newly added prop in`4.2.0`. For previous versions, please use the following method to define the icon.
>
@@ -89,17 +89,17 @@ More layouts with navigation: [Layout](/components/layout).
| disabled | Whether sub-menu is disabled | boolean | false | |
| icon | Icon of sub menu | ReactNode | - | 4.2.0 |
| key | Unique ID of the sub-menu | string | - | |
-| onTitleClick | Callback executed when the sub-menu title is clicked | function({ key, domEvent }) | - | |
| popupClassName | Sub-menu class name | string | - | |
| popupOffset | Sub-menu offset | \[number, number] | - | |
| title | Title of sub menu | ReactNode | - | |
+| onTitleClick | Callback executed when the sub-menu title is clicked | function({ key, domEvent }) | - | |
### Menu.ItemGroup
-| Param | Description | Type | Default value | Version |
-| -------- | ---------------------- | ----------- | ------------- | ------- |
-| children | Sub-menu items | MenuItem\[] | - | |
-| title | The title of the group | ReactNode | - | |
+| Param | Description | Type | Default value | Version |
+| --- | --- | --- | --- | --- |
+| children | Sub-menu items | MenuItem\[] | - | |
+| title | The title of the group | ReactNode | - | |
### Menu.Divider
diff --git a/components/menu/index.zh-CN.md b/components/menu/index.zh-CN.md
index ed048c4274..91df958d4c 100644
--- a/components/menu/index.zh-CN.md
+++ b/components/menu/index.zh-CN.md
@@ -37,10 +37,6 @@ cover: https://gw.alipayobjects.com/zos/alicdn/3XZcjGpvK/Menu.svg
| inlineIndent | inline 模式的菜单缩进宽度 | number | 24 | |
| mode | 菜单类型,现在支持垂直、水平、和内嵌模式三种 | `vertical` \| `horizontal` \| `inline` | `vertical` | |
| multiple | 是否允许多选 | boolean | false | |
-| onClick | 点击 MenuItem 调用此函数 | function({ item, key, keyPath, domEvent }) | - | |
-| onDeselect | 取消选中时调用,仅在 multiple 生效 | function({ item, key, keyPath, selectedKeys, domEvent }) | - | |
-| onOpenChange | SubMenu 展开/关闭的回调 | function(openKeys: string\[]) | - | |
-| onSelect | 被选中时调用 | function({ item, key, keyPath, selectedKeys, domEvent }) | - | |
| openKeys | 当前展开的 SubMenu 菜单项 key 数组 | string\[] | - | |
| overflowedIndicator | 自定义 Menu 折叠时的图标 | ReactNode | - | |
| selectable | 是否允许选中 | boolean | true | |
@@ -50,18 +46,22 @@ cover: https://gw.alipayobjects.com/zos/alicdn/3XZcjGpvK/Menu.svg
| subMenuOpenDelay | 用户鼠标进入子菜单后开启延时,单位:秒 | number | 0 | |
| theme | 主题颜色 | `light` \| `dark` | `light` | |
| triggerSubMenuAction | SubMenu 展开/关闭的触发行为 | `hover` \| `click` | `hover` | |
+| onClick | 点击 MenuItem 调用此函数 | function({ item, key, keyPath, domEvent }) | - | |
+| onDeselect | 取消选中时调用,仅在 multiple 生效 | function({ item, key, keyPath, selectedKeys, domEvent }) | - | |
+| onOpenChange | SubMenu 展开/关闭的回调 | function(openKeys: string\[]) | - | |
+| onSelect | 被选中时调用 | function({ item, key, keyPath, selectedKeys, domEvent }) | - | |
> 更多属性查看 [rc-menu](https://github.com/react-component/menu#api)
### Menu.Item
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| -------- | ------------------------ | --------- | ------ | ----- |
-| danger | 展示错误状态样式 | boolean | false | 4.3.0 |
-| disabled | 是否禁用 | boolean | false | |
-| icon | 菜单图标 | ReactNode | - | 4.2.0 |
-| key | item 的唯一标志 | string | - | |
-| title | 设置收缩时展示的悬浮标题 | string | - | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| danger | 展示错误状态样式 | boolean | false | 4.3.0 |
+| disabled | 是否禁用 | boolean | false | |
+| icon | 菜单图标 | ReactNode | - | 4.2.0 |
+| key | item 的唯一标志 | string | - | |
+| title | 设置收缩时展示的悬浮标题 | string | - | |
> 注意:`icon` 是 `4.2.0` 新增的属性,之前的版本请使用下面的方式定义图标。
>
@@ -84,23 +84,23 @@ cover: https://gw.alipayobjects.com/zos/alicdn/3XZcjGpvK/Menu.svg
### Menu.SubMenu
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| -------------- | -------------- | ----------------------------- | ------ | ----- |
-| children | 子菜单的菜单项 | Array<MenuItem \| SubMenu> | - | |
-| disabled | 是否禁用 | boolean | false | |
-| icon | 菜单图标 | ReactNode | - | 4.2.0 |
-| key | 唯一标志 | string | - | |
-| onTitleClick | 点击子菜单标题 | function({ key, domEvent }) | - | |
-| popupClassName | 子菜单样式 | string | - | |
-| popupOffset | 子菜单偏移量 | \[number, number] | - | |
-| title | 子菜单项值 | ReactNode | - | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| children | 子菜单的菜单项 | Array<MenuItem \| SubMenu> | - | |
+| disabled | 是否禁用 | boolean | false | |
+| icon | 菜单图标 | ReactNode | - | 4.2.0 |
+| key | 唯一标志 | string | - | |
+| popupClassName | 子菜单样式 | string | - | |
+| popupOffset | 子菜单偏移量 | \[number, number] | - | |
+| title | 子菜单项值 | ReactNode | - | |
+| onTitleClick | 点击子菜单标题 | function({ key, domEvent }) | - | |
### Menu.ItemGroup
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| -------- | ------------ | ----------- | ------ | ---- |
-| children | 分组的菜单项 | MenuItem\[] | - | |
-| title | 分组标题 | ReactNode | - | |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| children | 分组的菜单项 | MenuItem\[] | - | |
+| title | 分组标题 | ReactNode | - | |
### Menu.Divider
diff --git a/components/menu/style/index.less b/components/menu/style/index.less
index e29fd9d261..0e02e5d360 100644
--- a/components/menu/style/index.less
+++ b/components/menu/style/index.less
@@ -337,7 +337,6 @@
&-horizontal {
line-height: @menu-horizontal-line-height;
- white-space: nowrap;
border: 0;
border-bottom: @border-width-base @border-style-base @border-color-split;
box-shadow: none;
@@ -483,7 +482,7 @@
> .@{menu-prefix-cls}-submenu-title,
> .@{menu-prefix-cls}-submenu > .@{menu-prefix-cls}-submenu-title {
left: 0;
- padding: 0 (@menu-collapsed-width - @menu-icon-size-lg) / 2;
+ padding: 0 ~'calc(50% - @{menu-icon-size-lg} / 2)';
text-overflow: clip;
.@{menu-prefix-cls}-submenu-arrow {
display: none;
diff --git a/components/menu/style/rtl.less b/components/menu/style/rtl.less
index 21987789c0..32913df6d1 100644
--- a/components/menu/style/rtl.less
+++ b/components/menu/style/rtl.less
@@ -136,7 +136,7 @@
&-inline-collapsed&-vertical {
.@{menu-prefix-cls}-submenu-title {
.@{menu-prefix-cls}-rtl& {
- padding: 0 (@menu-collapsed-width - @menu-icon-size-lg) / 2;
+ padding: 0 ~'calc(50% - @{menu-icon-size-lg} / 2)';
}
}
}
diff --git a/components/message/index.en-US.md b/components/message/index.en-US.md
index 83e8e3169d..e9a7beae7c 100644
--- a/components/message/index.en-US.md
+++ b/components/message/index.en-US.md
@@ -51,13 +51,13 @@ The properties of config are as follows:
| Property | Description | Type | Default |
| --- | --- | --- | --- |
+| className | Customized CSS class | string | - |
| content | The content of the message | ReactNode | - |
| duration | Time(seconds) before auto-dismiss, don't dismiss if set to 0 | number | 3 |
-| onClose | Specify a function that will be called when the message is closed | function | - |
| icon | Customized Icon | ReactNode | - |
| key | The unique identifier of the Message | string \| number | - |
-| className | Customized CSS class | string | - |
| style | Customized inline style | [CSSProperties](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/e434515761b36830c3e58a970abf5186f005adac/types/react/index.d.ts#L794) | - |
+| onClose | Specify a function that will be called when the message is closed | function | - |
### Global static methods
@@ -89,9 +89,9 @@ message.config({
| duration | Time before auto-dismiss, in seconds | number | 1.5 | |
| getContainer | Return the mount node for Message | () => HTMLElement | () => document.body | |
| maxCount | Max message show, drop oldest if exceed limit | number | - | |
-| top | Distance from top | number | 24 | |
-| rtl | Whether to enable RTL mode | boolean | false | |
| prefixCls | The prefix className of message node | string | `ant-message` | 4.5.0 |
+| rtl | Whether to enable RTL mode | boolean | false | |
+| top | Distance from top | number | 24 | |
## FAQ
diff --git a/components/message/index.zh-CN.md b/components/message/index.zh-CN.md
index a27b5ed8bb..b1ffe1cf45 100644
--- a/components/message/index.zh-CN.md
+++ b/components/message/index.zh-CN.md
@@ -25,11 +25,11 @@ cover: https://gw.alipayobjects.com/zos/alicdn/hAkKTIW0K/Message.svg
- `message.warn(content, [duration], onClose)` // alias of warning
- `message.loading(content, [duration], onClose)`
-| 参数 | 说明 | 类型 | 默认值 |
-| -------- | ------------------------------------------- | ------------------- | ------ |
-| content | 提示内容 | ReactNode \| config | - |
-| duration | 自动关闭的延时,单位秒。设为 0 时不自动关闭 | number | 3 |
-| onClose | 关闭时触发的回调函数 | function | - |
+| 参数 | 说明 | 类型 | 默认值 |
+| --- | --- | --- | --- |
+| content | 提示内容 | ReactNode \| config | - |
+| duration | 自动关闭的延时,单位秒。设为 0 时不自动关闭 | number | 3 |
+| onClose | 关闭时触发的回调函数 | function | - |
组件同时提供 promise 接口。
@@ -52,13 +52,13 @@ cover: https://gw.alipayobjects.com/zos/alicdn/hAkKTIW0K/Message.svg
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
+| className | 自定义 CSS class | string | - |
| content | 提示内容 | ReactNode | - |
| duration | 自动关闭的延时,单位秒。设为 0 时不自动关闭 | number | 3 |
-| onClose | 关闭时触发的回调函数 | function | - |
| icon | 自定义图标 | ReactNode | - |
| key | 当前提示的唯一标志 | string \| number | - |
-| className | 自定义 CSS class | string | - |
| style | 自定义内联样式 | [CSSProperties](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/e434515761b36830c3e58a970abf5186f005adac/types/react/index.d.ts#L794) | - |
+| onClose | 关闭时触发的回调函数 | function | - |
### 全局方法
@@ -90,9 +90,9 @@ message.config({
| duration | 默认自动关闭延时,单位秒 | number | 3 | |
| getContainer | 配置渲染节点的输出位置 | () => HTMLElement | () => document.body | |
| maxCount | 最大显示数, 超过限制时,最早的消息会被自动关闭 | number | - | |
-| top | 消息距离顶部的位置 | number | 24 | |
-| rtl | 是否开启 RTL 模式 | boolean | false | |
| prefixCls | 消息节点的 className 前缀 | string | `ant-message` | 4.5.0 |
+| rtl | 是否开启 RTL 模式 | boolean | false | |
+| top | 消息距离顶部的位置 | number | 24 | |
## FAQ
diff --git a/components/modal/demo/modal-render.md b/components/modal/demo/modal-render.md
index 81a614ec52..713222fd67 100644
--- a/components/modal/demo/modal-render.md
+++ b/components/modal/demo/modal-render.md
@@ -46,9 +46,7 @@ class App extends React.Component {
render() {
return (
<>
-
- Open Draggable Modal
-
+ Open Draggable Modal
{
>
);
-}
+};
ReactDOM.render( , mountNode);
```
diff --git a/components/modal/index.en-US.md b/components/modal/index.en-US.md
index 8f3a4de573..d6b7493150 100644
--- a/components/modal/index.en-US.md
+++ b/components/modal/index.en-US.md
@@ -17,8 +17,8 @@ When requiring users to interact with the application, but without jumping to a
| --- | --- | --- | --- | --- |
| afterClose | Specify a function that will be called when modal is closed completely | function | - | |
| bodyStyle | Body style for modal body element. Such as height, padding etc | CSSProperties | {} | |
-| cancelText | Text of the Cancel button | ReactNode | `Cancel` | |
| cancelButtonProps | The cancel button props | [ButtonProps](/components/button/#API) | - | |
+| cancelText | Text of the Cancel button | ReactNode | `Cancel` | |
| centered | Centered Modal | boolean | false | |
| closable | Whether a close (x) button is visible on top right of the modal dialog or not | boolean | true | |
| closeIcon | Custom close icon | ReactNode | <CloseOutlined /> | |
@@ -35,14 +35,14 @@ When requiring users to interact with the application, but without jumping to a
| okButtonProps | The ok button props | [ButtonProps](/components/button/#API) | - | |
| okText | Text of the OK button | ReactNode | `OK` | |
| okType | Button `type` of the OK button | string | `primary` | |
-| onCancel | Specify a function that will be called when a user clicks mask, close button on top right or Cancel button | function(e) | - | |
-| onOk | Specify a function that will be called when a user clicks the OK button | function(e) | - | |
| style | Style of floating layer, typically used at least for adjusting the position | CSSProperties | - | |
| title | The modal dialog's title | ReactNode | - | |
| visible | Whether the modal dialog is visible or not | boolean | false | |
| width | Width of the modal dialog | string \| number | 520 | |
| wrapClassName | The class name of the container of the modal dialog | string | - | |
| zIndex | The `z-index` of the Modal | number | 1000 | |
+| onCancel | Specify a function that will be called when a user clicks mask, close button on top right or Cancel button | function(e) | - | |
+| onOk | Specify a function that will be called when a user clicks the OK button | function(e) | - | |
#### Note
@@ -79,12 +79,12 @@ The items listed above are all functions, expecting a settings object as paramet
| okButtonProps | The ok button props | [ButtonProps](/components/button/#API) | - | |
| okText | Text of the OK button | string | `OK` | |
| okType | Button `type` of the OK button | string | `primary` | |
-| onCancel | Specify a function that will be called when the user clicks the Cancel button. The parameter of this function is a function whose execution should include closing the dialog. You can also just return a promise and when the promise is resolved, the modal dialog will also be closed | function(close) | - | |
-| onOk | Specify a function that will be called when the user clicks the OK button. The parameter of this function is a function whose execution should include closing the dialog. You can also just return a promise and when the promise is resolved, the modal dialog will also be closed | function(close) | - | |
| style | Style of floating layer, typically used at least for adjusting the position | CSSProperties | - | |
| title | Title | ReactNode | - | |
| width | Width of the modal dialog | string \| number | 416 | |
| zIndex | The `z-index` of the Modal | number | 1000 | |
+| onCancel | Specify a function that will be called when the user clicks the Cancel button. The parameter of this function is a function whose execution should include closing the dialog. You can also just return a promise and when the promise is resolved, the modal dialog will also be closed | function(close) | - | |
+| onOk | Specify a function that will be called when the user clicks the OK button. The parameter of this function is a function whose execution should include closing the dialog. You can also just return a promise and when the promise is resolved, the modal dialog will also be closed | function(close) | - | |
All the `Modal.method`s will return a reference, and then we can update and close the modal dialog by the reference.
@@ -114,7 +114,7 @@ browserHistory.listen(() => {
### Modal.useModal()
-When you need using Context, you can use `contextHolder` which created by `Modal.useModal` to insert into children. Modal created by hooks will get all the context where `contextHolder` are. Created `modal` has the same creating function with `Modal.method`](<#Modal.method()>).
+When you need using Context, you can use `contextHolder` which created by `Modal.useModal` to insert into children. Modal created by hooks will get all the context where `contextHolder` are. Created `modal` has the same creating function with `Modal.method`](<#Modal.method()>).
```jsx
const [modal, contextHolder] = Modal.useModal();
@@ -163,3 +163,7 @@ return (
```
**Note:** You must insert `contextHolder` into your children with hooks. You can use origin method if you do not need context connection.
+
+### How to disable motion?
+
+You can config `transitionName=""` and `maskTransitionName=""` to remove motion class. But you should note that these prop is internal usage which we don't promise exist in next major version.
diff --git a/components/modal/index.zh-CN.md b/components/modal/index.zh-CN.md
index b5e16f8dfb..45b5882805 100644
--- a/components/modal/index.zh-CN.md
+++ b/components/modal/index.zh-CN.md
@@ -38,14 +38,14 @@ cover: https://gw.alipayobjects.com/zos/alicdn/3StSdUlSH/Modal.svg
| okButtonProps | ok 按钮 props | [ButtonProps](/components/button/#API) | - | |
| okText | 确认按钮文字 | ReactNode | `确定` | |
| okType | 确认按钮类型 | string | `primary` | |
-| onCancel | 点击遮罩层或右上角叉或取消按钮的回调 | function(e) | - | |
-| onOk | 点击确定回调 | function(e) | - | |
| style | 可用于设置浮层的样式,调整浮层位置等 | CSSProperties | - | |
| title | 标题 | ReactNode | - | |
| visible | 对话框是否可见 | boolean | - | |
| width | 宽度 | string \| number | 520 | |
| wrapClassName | 对话框外层容器的类名 | string | - | |
| zIndex | 设置 Modal 的 `z-index` | number | 1000 | |
+| onCancel | 点击遮罩层或右上角叉或取消按钮的回调 | function(e) | - | |
+| onOk | 点击确定回调 | function(e) | - | |
#### 注意
@@ -82,12 +82,12 @@ cover: https://gw.alipayobjects.com/zos/alicdn/3StSdUlSH/Modal.svg
| okButtonProps | ok 按钮 props | [ButtonProps](/components/button/#API) | - | |
| okText | 确认按钮文字 | string | `确定` | |
| okType | 确认按钮类型 | string | `primary` | |
-| onCancel | 取消回调,参数为关闭函数,返回 promise 时 resolve 后自动关闭 | function(close) | - | |
-| onOk | 点击确定回调,参数为关闭函数,返回 promise 时 resolve 后自动关闭 | function(close) | - | |
| style | 可用于设置浮层的样式,调整浮层位置等 | CSSProperties | - | |
| title | 标题 | ReactNode | - | |
| width | 宽度 | string \| number | 416 | |
| zIndex | 设置 Modal 的 `z-index` | number | 1000 | |
+| onCancel | 取消回调,参数为关闭函数,返回 promise 时 resolve 后自动关闭 | function(close) | - | |
+| onOk | 点击确定回调,参数为关闭函数,返回 promise 时 resolve 后自动关闭 | function(close) | - | |
以上函数调用后,会返回一个引用,可以通过该引用更新和关闭弹窗。
@@ -117,7 +117,7 @@ browserHistory.listen(() => {
### Modal.useModal()
-当你需要使用 Context 时,可以通过 `Modal.useModal` 创建一个 `contextHolder` 插入子节点中。通过 hooks 创建的临时 Modal 将会得到 `contextHolder` 所在位置的所有上下文。创建的 `modal` 对象拥有与 [`Modal.method`](<#Modal.method()>) 相同的创建通知方法。
+当你需要使用 Context 时,可以通过 `Modal.useModal` 创建一个 `contextHolder` 插入子节点中。通过 hooks 创建的临时 Modal 将会得到 `contextHolder` 所在位置的所有上下文。创建的 `modal` 对象拥有与 [`Modal.method`](#Modal.method()) 相同的创建通知方法。
```jsx
const [modal, contextHolder] = Modal.useModal();
@@ -166,3 +166,7 @@ return (
```
**异同:**通过 hooks 创建的 `contextHolder` 必须插入到子元素节点中才会生效,当你不需要上下文信息时请直接调用。
+
+### 如何关闭 Modal 动画?
+
+你可以通过 `transitionName=""` 和 `maskTransitionName=""` 去除动画 CSS,但是需要注意的是。该方法为内部方法,我们不保证下个大版本重构时该属性会被保留。
diff --git a/components/notification/index.en-US.md b/components/notification/index.en-US.md
index d137cccb41..1bb945c747 100644
--- a/components/notification/index.en-US.md
+++ b/components/notification/index.en-US.md
@@ -34,18 +34,18 @@ The properties of config are as follows:
| bottom | Distance from the bottom of the viewport, when `placement` is `bottomRight` or `bottomLeft` (unit: pixels) | number | 24 |
| btn | Customized close button | ReactNode | - |
| className | Customized CSS class | string | - |
+| closeIcon | Custom close icon | ReactNode | - |
| description | The content of notification box (required) | ReactNode | - |
| duration | Time in seconds before Notification is closed. When set to 0 or null, it will never be closed automatically | number | 4.5 |
| getContainer | Return the mount node for Notification | () => HTMLNode | () => document.body |
| icon | Customized icon | ReactNode | - |
-| closeIcon | Custom close icon | ReactNode | - |
| key | The unique identifier of the Notification | string | - |
| message | The title of notification box (required) | ReactNode | - |
-| onClose | Trigger when notification closed | function | - |
-| onClick | Specify a function that will be called when the notification is clicked | function | - |
| placement | Position of Notification, can be one of `topLeft` `topRight` `bottomLeft` `bottomRight` | string | `topRight` |
| style | Customized inline style | [CSSProperties](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/e434515761b36830c3e58a970abf5186f005adac/types/react/index.d.ts#L794) | - |
| top | Distance from the top of the viewport, when `placement` is `topRight` or `topLeft` (unit: pixels) | number | 24 |
+| onClick | Specify a function that will be called when the notification is clicked | function | - |
+| onClose | Trigger when notification closed | function | - |
`notification` also provides a global `config()` method that can be used for specifying the default options. Once this method is used, all the notification boxes will take into account these globally defined options when displaying.
@@ -71,8 +71,8 @@ notification.config({
| duration | Time in seconds before Notification is closed. When set to 0 or null, it will never be closed automatically | number | 4.5 |
| getContainer | Return the mount node for Notification | () => HTMLNode | () => document.body |
| placement | Position of Notification, can be one of `topLeft` `topRight` `bottomLeft` `bottomRight` | string | `topRight` |
-| top | Distance from the top of the viewport, when `placement` is `topRight` or `topLeft` (unit: pixels) | number | 24 |
| rtl | Whether to enable RTL mode | boolean | false |
+| top | Distance from the top of the viewport, when `placement` is `topRight` or `topLeft` (unit: pixels) | number | 24 |
## FAQ
diff --git a/components/notification/index.zh-CN.md b/components/notification/index.zh-CN.md
index 6fab9482bc..31817a357c 100644
--- a/components/notification/index.zh-CN.md
+++ b/components/notification/index.zh-CN.md
@@ -32,8 +32,8 @@ config 参数如下:
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
-| btn | 自定义关闭按钮 | ReactNode | - |
| bottom | 消息从底部弹出时,距离底部的位置,单位像素 | number | 24 |
+| btn | 自定义关闭按钮 | ReactNode | - |
| className | 自定义 CSS class | string | - |
| closeIcon | 自定义关闭图标 | ReactNode | - |
| description | 通知提醒内容,必选 | ReactNode | - |
@@ -42,11 +42,11 @@ config 参数如下:
| icon | 自定义图标 | ReactNode | - |
| key | 当前通知唯一标志 | string | - |
| message | 通知提醒标题,必选 | ReactNode | - |
-| onClose | 当通知关闭时触发 | function | - |
-| onClick | 点击通知时触发的回调函数 | function | - |
| placement | 弹出位置,可选 `topLeft` `topRight` `bottomLeft` `bottomRight` | string | `topRight` |
| style | 自定义内联样式 | [CSSProperties](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/e434515761b36830c3e58a970abf5186f005adac/types/react/index.d.ts#L794) | - |
| top | 消息从顶部弹出时,距离顶部的位置,单位像素 | number | 24 |
+| onClick | 点击通知时触发的回调函数 | function | - |
+| onClose | 当通知关闭时触发 | function | - |
还提供了一个全局配置方法,在调用前提前配置,全局一次生效。
@@ -72,8 +72,8 @@ notification.config({
| duration | 默认自动关闭延时,单位秒 | number | 4.5 |
| getContainer | 配置渲染节点的输出位置 | () => HTMLNode | () => document.body |
| placement | 弹出位置,可选 `topLeft` `topRight` `bottomLeft` `bottomRight` | string | `topRight` |
-| top | 消息从顶部弹出时,距离顶部的位置,单位像素 | number | 24 |
| rtl | 是否开启 RTL 模式 | boolean | false |
+| top | 消息从顶部弹出时,距离顶部的位置,单位像素 | number | 24 |
## FAQ
diff --git a/components/notification/style/index.less b/components/notification/style/index.less
index f41c292b2f..9c0074312c 100644
--- a/components/notification/style/index.less
+++ b/components/notification/style/index.less
@@ -6,19 +6,19 @@
@notification-width: 384px;
@notification-padding: @notification-padding-vertical @notification-padding-horizontal;
@notification-margin-bottom: 16px;
+@notification-margin-edge: 24px;
.@{notification-prefix-cls} {
.reset-component;
position: fixed;
z-index: @zindex-notification;
- max-width: ~'calc(100vw - 32px)';
- margin-right: 24px;
+ margin-right: @notification-margin-edge;
&-topLeft,
&-bottomLeft {
margin-right: 0;
- margin-left: 24px;
+ margin-left: @notification-margin-edge;
.@{notification-prefix-cls}-fade-enter.@{notification-prefix-cls}-fade-enter-active,
.@{notification-prefix-cls}-fade-appear.@{notification-prefix-cls}-fade-appear-active {
@@ -35,6 +35,7 @@
&-notice {
position: relative;
width: @notification-width;
+ max-width: ~'calc(100vw - @{notification-margin-edge} * 2)';
margin-bottom: @notification-margin-bottom;
margin-left: auto;
overflow: hidden;
diff --git a/components/page-header/index.en-US.md b/components/page-header/index.en-US.md
index 1b2f59b538..7cbbefbf19 100644
--- a/components/page-header/index.en-US.md
+++ b/components/page-header/index.en-US.md
@@ -17,15 +17,15 @@ PageHeader can be used to highlight the page topic, display important informatio
| Param | Description | Type | Default value | Version |
| --- | --- | --- | --- | --- |
-| title | Custom title text | ReactNode | - | |
-| subTitle | Custom subtitle text | ReactNode | - | |
-| ghost | PageHeader type, will change background color | boolean | true | |
| avatar | Avatar next to the title bar | [AvatarProps](/components/avatar/) | - | |
| backIcon | Custom back icon, if false the back icon will not be displayed | ReactNode \| boolean | <ArrowLeft /> | |
-| tags | Tag list next to title | [Tag](/components/tag/)[] \| [Tag](/components/tag/) | - | |
-| extra | Operating area, at the end of the line of the title line | ReactNode | - | |
| breadcrumb | Breadcrumb configuration | [Breadcrumb](/components/breadcrumb/) | - | |
+| extra | Operating area, at the end of the line of the title line | ReactNode | - | |
| footer | PageHeader's footer, generally used to render TabBar | ReactNode | - | |
+| ghost | PageHeader type, will change background color | boolean | true | |
+| subTitle | Custom subtitle text | ReactNode | - | |
+| tags | Tag list next to title | [Tag](/components/tag/)\[] \| [Tag](/components/tag/) | - | |
+| title | Custom title text | ReactNode | - | |
| onBack | Back icon click event | () => void | - | |