diff --git a/components/_util/props-util.js b/components/_util/props-util.js
index 0a1cf7d6b..a16c3059b 100644
--- a/components/_util/props-util.js
+++ b/components/_util/props-util.js
@@ -196,7 +196,7 @@ export function isEmptyElement (ele) {
}
export function filterEmpty (children = []) {
- return children.filter(c => c.tag || c.text.trim() !== '')
+ return children.filter(c => c.tag || (c.text && c.text.trim() !== ''))
}
const initDefaultProps = (propTypes, defaultProps) => {
Object.keys(defaultProps).forEach(k => {
diff --git a/components/list/__tests__/__snapshots__/empty.test.js.snap b/components/list/__tests__/__snapshots__/empty.test.js.snap
new file mode 100644
index 000000000..c2c5b6d91
--- /dev/null
+++ b/components/list/__tests__/__snapshots__/empty.test.js.snap
@@ -0,0 +1,3 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`List renders empty list 1`] = `
`;
diff --git a/components/list/__tests__/empty.test.js b/components/list/__tests__/empty.test.js
new file mode 100644
index 000000000..24da421ad
--- /dev/null
+++ b/components/list/__tests__/empty.test.js
@@ -0,0 +1,13 @@
+import { mount } from '@vue/test-utils'
+import List from '..'
+
+describe('List', () => {
+ it('renders empty list', () => {
+ const wrapper = mount({
+ render () {
+ return } />
+ },
+ })
+ expect(wrapper.html()).toMatchSnapshot()
+ })
+})
diff --git a/components/list/__tests__/loading.test.js b/components/list/__tests__/loading.test.js
new file mode 100644
index 000000000..718447f67
--- /dev/null
+++ b/components/list/__tests__/loading.test.js
@@ -0,0 +1,55 @@
+import { mount } from '@vue/test-utils'
+import { asyncExpect } from '@/tests/utils'
+import List from '..'
+import Icon from '../../icon'
+
+describe('List', () => {
+ it('renders empty loading', () => {
+ const loading = {
+ spinning: true,
+ }
+ const wrapper = mount(
+ {
+ render () {
+ return } />
+ },
+ })
+ expect(wrapper.findAll('.ant-list-empty-text')).toHaveLength(0)
+ })
+
+ it('renders object loading', () => {
+ const loading = {
+ spinning: true,
+ }
+ const wrapper = mount(
+ {
+ render () {
+ return }
+ />
+ },
+ })
+ expect(wrapper.findAll('.ant-spin-spinning')).toHaveLength(1)
+ })
+
+ it('renders object loading with indicator', () => {
+ const wrapper = mount(
+ {
+ render () {
+ return
,
+ }}
+ dataSource={[1]}
+ renderItem={() => }
+ />
+ },
+ }
+
+ )
+ expect(wrapper.findAll('.anticon-loading')).toHaveLength(1)
+ })
+})
diff --git a/components/list/demo/test.vue b/components/list/demo/test.vue
new file mode 100644
index 000000000..922a207af
--- /dev/null
+++ b/components/list/demo/test.vue
@@ -0,0 +1,8 @@
+
diff --git a/components/list/index.jsx b/components/list/index.jsx
index 7e0c04f14..11848bdf0 100644
--- a/components/list/index.jsx
+++ b/components/list/index.jsx
@@ -10,7 +10,7 @@ import Pagination from '../pagination'
import { Row } from '../grid'
import Item from './Item'
-import { initDefaultProps, getComponentFromProp } from '../_util/props-util'
+import { initDefaultProps, getComponentFromProp, filterEmpty } from '../_util/props-util'
import { cloneElement } from '../_util/vnode'
export { ListItemProps, ListItemMetaProps } from './Item'
@@ -38,7 +38,7 @@ export const ListProps = () => ({
extra: PropTypes.any,
grid: PropTypes.shape(ListGridType).loose,
itemLayout: PropTypes.string,
- loading: PropTypes.oneOfType([PropTypes.bool, SpinProps()]),
+ loading: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
loadMore: PropTypes.any,
pagination: PropTypes.any,
prefixCls: PropTypes.string,
@@ -139,7 +139,7 @@ export default {
const loadMore = getComponentFromProp(this, 'loadMore')
const footer = getComponentFromProp(this, 'footer')
const header = getComponentFromProp(this, 'header')
- const children = $slots.default || []
+ const children = filterEmpty($slots.default || [])
let loadingProp = loading
if (typeof loadingProp === 'boolean') {
loadingProp = {
@@ -220,7 +220,7 @@ export default {
childrenContent = grid ? (
{childrenList}
) : childrenList
- } else if (!children && !isLoading) {
+ } else if (!children.length && !isLoading) {
childrenContent = (
({
prefixCls: PropTypes.string,
@@ -12,6 +13,7 @@ export const SpinProps = () => ({
wrapperClassName: PropTypes.string,
tip: PropTypes.string,
delay: PropTypes.number,
+ indicator: PropTypes.any,
})
export default {
@@ -91,7 +93,16 @@ export default {
[`${prefixCls}-spinning`]: stateSpinning,
[`${prefixCls}-show-text`]: !!tip || notCssAnimationSupported,
}
- const spinIndicator = $slots.indicator ? $slots.indicator : (
+ let indicator = getComponentFromProp(this, 'indicator')
+ if (Array.isArray(indicator)) {
+ indicator = filterEmpty(indicator)
+ indicator = indicator.length === 1 ? indicator[0] : indicator
+ }
+ let spinIndicator = null
+ if (isValidElement(indicator)) {
+ spinIndicator = cloneElement(indicator, { class: `${prefixCls}-dot` })
+ }
+ spinIndicator = spinIndicator || (
diff --git a/components/spin/__tests__/__snapshots__/index.test.js.snap b/components/spin/__tests__/__snapshots__/index.test.js.snap
index a5e06e950..e332c7ba0 100644
--- a/components/spin/__tests__/__snapshots__/index.test.js.snap
+++ b/components/spin/__tests__/__snapshots__/index.test.js.snap
@@ -11,6 +11,6 @@ exports[`Spin should only affect the spin element when set style to a nested
-
+
`;
diff --git a/components/spin/index.en-US.md b/components/spin/index.en-US.md
index b8cd0f985..a306599cf 100644
--- a/components/spin/index.en-US.md
+++ b/components/spin/index.en-US.md
@@ -4,7 +4,7 @@
| Property | Description | Type | Default Value |
| -------- | ----------- | ---- | ------------- |
| delay | specifies a delay in milliseconds for loading state (prevent flush) | number (milliseconds) | - |
-| indicator | vue node of the spinning indicator | slot | - |
+| indicator | vue node of the spinning indicator | vNode \|slot | - |
| size | size of Spin, options: `small`, `default` and `large` | string | `default` |
| spinning | whether Spin is spinning | boolean | true |
| tip | customize description content when Spin has children | string | - |
diff --git a/components/spin/index.zh-CN.md b/components/spin/index.zh-CN.md
index ed0ec4072..7d88996bb 100644
--- a/components/spin/index.zh-CN.md
+++ b/components/spin/index.zh-CN.md
@@ -4,7 +4,7 @@
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| delay | 延迟显示加载效果的时间(防止闪烁) | number (毫秒) | - |
-| indicator | 加载指示符 | slot方式 | - |
+| indicator | 加载指示符 | vNode \| slot | - |
| size | 组件大小,可选值为 `small` `default` `large` | string | 'default' |
| spinning | 是否旋转 | boolean | true |
| tip | 当作为包裹元素时,可以自定义描述文案 | string | - |
diff --git a/site/dev.js b/site/dev.js
index 36ff263d6..56cfa6a0b 100644
--- a/site/dev.js
+++ b/site/dev.js
@@ -10,7 +10,7 @@ import Api from './components/api'
import './components'
import demoBox from './components/demoBox'
import demoContainer from './components/demoContainer'
-import Test from '../components/list/demo/index'
+import Test from '../components/list/demo/test'
Vue.use(VueClipboard)
Vue.use(VueRouter)