feat: update list

pull/1845/head
tangjinzhou 2020-02-20 21:21:09 +08:00
parent 45ff6701e6
commit c7b0cb0732
9 changed files with 274 additions and 275 deletions

View File

@ -1,5 +1,5 @@
module.exports = {
dev: {
componentName: 'layout', // dev components
componentName: 'list', // dev components
},
};

View File

@ -259,6 +259,10 @@ export function isEmptyElement(c) {
return !(c.tag || (c.text && c.text.trim() !== ''));
}
export function isStringElement(c) {
return !c.tag;
}
export function filterEmpty(children = []) {
return children.filter(c => !isEmptyElement(c));
}

View File

@ -3,12 +3,14 @@ import classNames from 'classnames';
import {
getSlotOptions,
getComponentFromProp,
isEmptyElement,
isStringElement,
getListeners,
isEmptyElement,
} from '../_util/props-util';
import { Col } from '../grid';
import { ConfigConsumerProps } from '../config-provider';
import { ListGridType } from './index';
import { cloneElement } from '../_util/vnode';
export const ListItemProps = {
prefixCls: PropTypes.string,
@ -68,59 +70,68 @@ export default {
listContext: { default: () => ({}) },
configProvider: { default: () => ConfigConsumerProps },
},
methods: {
isItemContainsTextNodeAndNotSingular() {
const { $slots } = this;
let result;
const children = $slots.default || [];
children.forEach(element => {
if (isStringElement(element) && !isEmptyElement(element)) {
result = true;
}
});
return result && children.length > 1;
},
isFlexMode() {
const extra = getComponentFromProp(this, 'extra');
const { itemLayout } = this.listContext;
if (itemLayout === 'vertical') {
return !!extra;
}
return !this.isItemContainsTextNodeAndNotSingular();
},
},
render() {
const { grid } = this.listContext;
const { grid, itemLayout } = this.listContext;
const { prefixCls: customizePrefixCls, $slots } = this;
const listeners = getListeners(this);
const getPrefixCls = this.configProvider.getPrefixCls;
const prefixCls = getPrefixCls('list', customizePrefixCls);
const classString = `${prefixCls}-item`;
const extra = getComponentFromProp(this, 'extra');
const actions = getComponentFromProp(this, 'actions');
const metaContent = [];
const otherContent = [];
($slots.default || []).forEach(element => {
if (!isEmptyElement(element)) {
if (getSlotOptions(element).__ANT_LIST_ITEM_META) {
metaContent.push(element);
} else {
otherContent.push(element);
}
}
});
const contentClassString = classNames(`${prefixCls}-item-content`, {
[`${prefixCls}-item-content-single`]: metaContent.length < 1,
});
const content =
otherContent.length > 0 ? <div class={contentClassString}>{otherContent}</div> : null;
let actionsContent;
if (actions && actions.length > 0) {
const actionsContentItem = (action, i) => (
const actionsContent = actions && actions.length > 0 && (
<ul class={`${prefixCls}-item-action`} key="actions">
{actions.map((action, i) => (
<li key={`${prefixCls}-item-action-${i}`}>
{action}
{i !== actions.length - 1 && <em class={`${prefixCls}-item-action-split`} />}
</li>
);
actionsContent = (
<ul class={`${prefixCls}-item-action`}>
{actions.map((action, i) => actionsContentItem(action, i))}
))}
</ul>
);
}
const extraContent = (
<div class={`${prefixCls}-item-extra-wrap`}>
<div class={`${prefixCls}-item-main`}>
{metaContent}
{content}
const Tag = grid ? 'div' : 'li';
const itemChildren = (
<Tag
{...{ on: listeners }}
class={classNames(`${prefixCls}-item`, {
[`${prefixCls}-item-no-flex`]: !this.isFlexMode(),
})}
>
{itemLayout === 'vertical' && extra
? [
<div class={`${prefixCls}-item-main`} key="content">
{$slots.default}
{actionsContent}
</div>
<div class={`${prefixCls}-item-extra`}>{extra}</div>
</div>
</div>,
<div class={`${prefixCls}-item-extra`} key="extra">
{extra}
</div>,
]
: [$slots.default, actionsContent, cloneElement(extra, { key: 'extra' })]}
</Tag>
);
const mainContent = grid ? (
@ -133,20 +144,10 @@ export default {
xl={getGrid(grid, 'xl')}
xxl={getGrid(grid, 'xxl')}
>
<div {...{ on: listeners }} class={classString}>
{extra && extraContent}
{!extra && metaContent}
{!extra && content}
{!extra && actionsContent}
</div>
{itemChildren}
</Col>
) : (
<div {...{ on: listeners }} class={classString}>
{extra && extraContent}
{!extra && metaContent}
{!extra && content}
{!extra && actionsContent}
</div>
itemChildren
);
return mainContent;

View File

@ -4,7 +4,8 @@ exports[`renders ./components/list/demo/basic.md correctly 1`] = `
<div class="ant-list ant-list-split">
<div class="ant-spin-nested-loading">
<div class="ant-spin-container">
<div class="ant-list-item">
<ul class="ant-list-items">
<li class="ant-list-item">
<div class="ant-list-item-meta">
<div class="ant-list-item-meta-avatar"><span class="ant-avatar ant-avatar-circle ant-avatar-image"><img src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"></span></div>
<div class="ant-list-item-meta-content">
@ -12,8 +13,8 @@ exports[`renders ./components/list/demo/basic.md correctly 1`] = `
<div class="ant-list-item-meta-description">Ant Design, a design language for background applications, is refined by Ant UED Team</div>
</div>
</div>
</div>
<div class="ant-list-item">
</li>
<li class="ant-list-item">
<div class="ant-list-item-meta">
<div class="ant-list-item-meta-avatar"><span class="ant-avatar ant-avatar-circle ant-avatar-image"><img src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"></span></div>
<div class="ant-list-item-meta-content">
@ -21,8 +22,8 @@ exports[`renders ./components/list/demo/basic.md correctly 1`] = `
<div class="ant-list-item-meta-description">Ant Design, a design language for background applications, is refined by Ant UED Team</div>
</div>
</div>
</div>
<div class="ant-list-item">
</li>
<li class="ant-list-item">
<div class="ant-list-item-meta">
<div class="ant-list-item-meta-avatar"><span class="ant-avatar ant-avatar-circle ant-avatar-image"><img src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"></span></div>
<div class="ant-list-item-meta-content">
@ -30,8 +31,8 @@ exports[`renders ./components/list/demo/basic.md correctly 1`] = `
<div class="ant-list-item-meta-description">Ant Design, a design language for background applications, is refined by Ant UED Team</div>
</div>
</div>
</div>
<div class="ant-list-item">
</li>
<li class="ant-list-item">
<div class="ant-list-item-meta">
<div class="ant-list-item-meta-avatar"><span class="ant-avatar ant-avatar-circle ant-avatar-image"><img src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"></span></div>
<div class="ant-list-item-meta-content">
@ -39,7 +40,8 @@ exports[`renders ./components/list/demo/basic.md correctly 1`] = `
<div class="ant-list-item-meta-description">Ant Design, a design language for background applications, is refined by Ant UED Team</div>
</div>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
@ -50,9 +52,8 @@ exports[`renders ./components/list/demo/grid.md correctly 1`] = `
<div class="ant-spin-nested-loading">
<div class="ant-spin-container">
<div class="ant-row" style="margin-left: -8px; margin-right: -8px;">
<div class="ant-col-6" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-col ant-col-6" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">
<div class="ant-card ant-card-bordered">
<div class="ant-card-head">
<div class="ant-card-head-wrapper">
@ -63,10 +64,8 @@ exports[`renders ./components/list/demo/grid.md correctly 1`] = `
</div>
</div>
</div>
</div>
<div class="ant-col-6" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-col ant-col-6" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">
<div class="ant-card ant-card-bordered">
<div class="ant-card-head">
<div class="ant-card-head-wrapper">
@ -77,10 +76,8 @@ exports[`renders ./components/list/demo/grid.md correctly 1`] = `
</div>
</div>
</div>
</div>
<div class="ant-col-6" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-col ant-col-6" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">
<div class="ant-card ant-card-bordered">
<div class="ant-card-head">
<div class="ant-card-head-wrapper">
@ -91,10 +88,8 @@ exports[`renders ./components/list/demo/grid.md correctly 1`] = `
</div>
</div>
</div>
</div>
<div class="ant-col-6" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-col ant-col-6" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">
<div class="ant-card ant-card-bordered">
<div class="ant-card-head">
<div class="ant-card-head-wrapper">
@ -109,7 +104,6 @@ exports[`renders ./components/list/demo/grid.md correctly 1`] = `
</div>
</div>
</div>
</div>
`;
exports[`renders ./components/list/demo/infinite-load.md correctly 1`] = `
@ -119,7 +113,15 @@ exports[`renders ./components/list/demo/infinite-load.md correctly 1`] = `
<div class="ant-spin-container">
<div class="ant-list-empty-text">
<div class="ant-empty ant-empty-normal">
<div class="ant-empty-image"><img alt="No Data" src=""></div>
<div class="ant-empty-image"><svg width="64" height="41" viewBox="0 0 64 41" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0 1)" fill="none" fillRule="evenodd">
<ellipse fill="#F5F5F5" cx="32" cy="33" rx="32" ry="7"></ellipse>
<g fillRule="nonzero" stroke="#D9D9D9">
<path d="M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z"></path>
<path d="M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z" fill="#FAFAFA"></path>
</g>
</g>
</svg></div>
<p class="ant-empty-description">No Data</p>
</div>
</div>
@ -148,7 +150,7 @@ exports[`renders ./components/list/demo/loadmore.md correctly 1`] = `
<div class="demo-loadmore-list ant-list ant-list-split ant-list-loading ant-list-something-after-last-item">
<div class="ant-spin-nested-loading">
<div>
<div class="ant-spin ant-spin-spinning"><span class="ant-spin-dot ant-spin-dot-spin"><i></i><i></i><i></i><i></i></span></div>
<div class="ant-spin ant-spin-spinning"><span class="ant-spin-dot ant-spin-dot-spin"><i class="ant-spin-dot-item"></i><i class="ant-spin-dot-item"></i><i class="ant-spin-dot-item"></i><i class="ant-spin-dot-item"></i></span></div>
</div>
<div class="ant-spin-container ant-spin-blur">
<div style="min-height: 53;"></div>
@ -163,9 +165,8 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
<div class="ant-spin-nested-loading">
<div class="ant-spin-container">
<div class="ant-row" style="margin-left: -8px; margin-right: -8px;">
<div class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-col ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">
<div class="ant-card ant-card-bordered">
<div class="ant-card-head">
<div class="ant-card-head-wrapper">
@ -176,10 +177,8 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
</div>
</div>
</div>
</div>
<div class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-col ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">
<div class="ant-card ant-card-bordered">
<div class="ant-card-head">
<div class="ant-card-head-wrapper">
@ -190,10 +189,8 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
</div>
</div>
</div>
</div>
<div class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-col ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">
<div class="ant-card ant-card-bordered">
<div class="ant-card-head">
<div class="ant-card-head-wrapper">
@ -204,10 +201,8 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
</div>
</div>
</div>
</div>
<div class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-col ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">
<div class="ant-card ant-card-bordered">
<div class="ant-card-head">
<div class="ant-card-head-wrapper">
@ -218,10 +213,8 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
</div>
</div>
</div>
</div>
<div class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-col ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">
<div class="ant-card ant-card-bordered">
<div class="ant-card-head">
<div class="ant-card-head-wrapper">
@ -232,10 +225,8 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
</div>
</div>
</div>
</div>
<div class="ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-col ant-col-xs-24 ant-col-sm-12 ant-col-md-6 ant-col-lg-6 ant-col-xl-4 ant-col-xxl-8" style="padding-left: 8px; padding-right: 8px;">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">
<div class="ant-card ant-card-bordered">
<div class="ant-card-head">
<div class="ant-card-head-wrapper">
@ -250,7 +241,6 @@ exports[`renders ./components/list/demo/resposive.md correctly 1`] = `
</div>
</div>
</div>
</div>
`;
exports[`renders ./components/list/demo/simple.md correctly 1`] = `
@ -262,21 +252,13 @@ exports[`renders ./components/list/demo/simple.md correctly 1`] = `
</div>
<div class="ant-spin-nested-loading">
<div class="ant-spin-container">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Racing car sprays burning fuel into crowd.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Japanese princess to wed commoner.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Australian walks 100km after outback crash.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Man charged over missing wedding girl.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Los Angeles battles huge wildfires.</div>
</div>
<ul class="ant-list-items">
<li class="ant-list-item">Racing car sprays burning fuel into crowd.</li>
<li class="ant-list-item">Japanese princess to wed commoner.</li>
<li class="ant-list-item">Australian walks 100km after outback crash.</li>
<li class="ant-list-item">Man charged over missing wedding girl.</li>
<li class="ant-list-item">Los Angeles battles huge wildfires.</li>
</ul>
</div>
</div>
<div class="ant-list-footer">
@ -290,21 +272,13 @@ exports[`renders ./components/list/demo/simple.md correctly 1`] = `
</div>
<div class="ant-spin-nested-loading">
<div class="ant-spin-container">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Racing car sprays burning fuel into crowd.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Japanese princess to wed commoner.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Australian walks 100km after outback crash.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Man charged over missing wedding girl.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Los Angeles battles huge wildfires.</div>
</div>
<ul class="ant-list-items">
<li class="ant-list-item">Racing car sprays burning fuel into crowd.</li>
<li class="ant-list-item">Japanese princess to wed commoner.</li>
<li class="ant-list-item">Australian walks 100km after outback crash.</li>
<li class="ant-list-item">Man charged over missing wedding girl.</li>
<li class="ant-list-item">Los Angeles battles huge wildfires.</li>
</ul>
</div>
</div>
<div class="ant-list-footer">
@ -318,21 +292,13 @@ exports[`renders ./components/list/demo/simple.md correctly 1`] = `
</div>
<div class="ant-spin-nested-loading">
<div class="ant-spin-container">
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Racing car sprays burning fuel into crowd.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Japanese princess to wed commoner.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Australian walks 100km after outback crash.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Man charged over missing wedding girl.</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-content ant-list-item-content-single">Los Angeles battles huge wildfires.</div>
</div>
<ul class="ant-list-items">
<li class="ant-list-item">Racing car sprays burning fuel into crowd.</li>
<li class="ant-list-item">Japanese princess to wed commoner.</li>
<li class="ant-list-item">Australian walks 100km after outback crash.</li>
<li class="ant-list-item">Man charged over missing wedding girl.</li>
<li class="ant-list-item">Los Angeles battles huge wildfires.</li>
</ul>
</div>
</div>
<div class="ant-list-footer">
@ -346,8 +312,8 @@ exports[`renders ./components/list/demo/vertical.md correctly 1`] = `
<div class="ant-list ant-list-vertical ant-list-lg ant-list-split ant-list-something-after-last-item">
<div class="ant-spin-nested-loading">
<div class="ant-spin-container">
<div class="ant-list-item">
<div class="ant-list-item-extra-wrap">
<ul class="ant-list-items">
<li class="ant-list-item">
<div class="ant-list-item-main">
<div class="ant-list-item-meta">
<div class="ant-list-item-meta-avatar"><span class="ant-avatar ant-avatar-circle ant-avatar-image"><img src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"></span></div>
@ -356,9 +322,7 @@ exports[`renders ./components/list/demo/vertical.md correctly 1`] = `
<div class="ant-list-item-meta-description">Ant Design, a design language for background applications, is refined by Ant UED Team.</div>
</div>
</div>
<div class="ant-list-item-content">
We supply a series of design principles, practical patterns and high quality design resources (Sketch and Axure), to help people create their product prototypes beautifully and efficiently.
</div>
<ul class="ant-list-item-action">
<li><span><i aria-label="icon: star-o" class="anticon anticon-star-o" style="margin-right: 8px;"><svg viewBox="64 64 896 896" data-icon="star" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false" class=""><path d="M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 0 0 .6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0 0 46.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3zM664.8 561.6l36.1 210.3L512 672.7 323.1 772l36.1-210.3-152.8-149L417.6 382 512 190.7 606.4 382l211.2 30.7-152.8 148.9z"></path></svg></i>
156
@ -372,10 +336,8 @@ exports[`renders ./components/list/demo/vertical.md correctly 1`] = `
</ul>
</div>
<div class="ant-list-item-extra"><img width="272" alt="logo" src="https://gw.alipayobjects.com/zos/rmsportal/mqaQswcyDLcXyDKnZfES.png"></div>
</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-extra-wrap">
</li>
<li class="ant-list-item">
<div class="ant-list-item-main">
<div class="ant-list-item-meta">
<div class="ant-list-item-meta-avatar"><span class="ant-avatar ant-avatar-circle ant-avatar-image"><img src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"></span></div>
@ -384,9 +346,7 @@ exports[`renders ./components/list/demo/vertical.md correctly 1`] = `
<div class="ant-list-item-meta-description">Ant Design, a design language for background applications, is refined by Ant UED Team.</div>
</div>
</div>
<div class="ant-list-item-content">
We supply a series of design principles, practical patterns and high quality design resources (Sketch and Axure), to help people create their product prototypes beautifully and efficiently.
</div>
<ul class="ant-list-item-action">
<li><span><i aria-label="icon: star-o" class="anticon anticon-star-o" style="margin-right: 8px;"><svg viewBox="64 64 896 896" data-icon="star" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false" class=""><path d="M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 0 0 .6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0 0 46.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3zM664.8 561.6l36.1 210.3L512 672.7 323.1 772l36.1-210.3-152.8-149L417.6 382 512 190.7 606.4 382l211.2 30.7-152.8 148.9z"></path></svg></i>
156
@ -400,10 +360,8 @@ exports[`renders ./components/list/demo/vertical.md correctly 1`] = `
</ul>
</div>
<div class="ant-list-item-extra"><img width="272" alt="logo" src="https://gw.alipayobjects.com/zos/rmsportal/mqaQswcyDLcXyDKnZfES.png"></div>
</div>
</div>
<div class="ant-list-item">
<div class="ant-list-item-extra-wrap">
</li>
<li class="ant-list-item">
<div class="ant-list-item-main">
<div class="ant-list-item-meta">
<div class="ant-list-item-meta-avatar"><span class="ant-avatar ant-avatar-circle ant-avatar-image"><img src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"></span></div>
@ -412,9 +370,7 @@ exports[`renders ./components/list/demo/vertical.md correctly 1`] = `
<div class="ant-list-item-meta-description">Ant Design, a design language for background applications, is refined by Ant UED Team.</div>
</div>
</div>
<div class="ant-list-item-content">
We supply a series of design principles, practical patterns and high quality design resources (Sketch and Axure), to help people create their product prototypes beautifully and efficiently.
</div>
<ul class="ant-list-item-action">
<li><span><i aria-label="icon: star-o" class="anticon anticon-star-o" style="margin-right: 8px;"><svg viewBox="64 64 896 896" data-icon="star" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false" class=""><path d="M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 0 0 .6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0 0 46.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3zM664.8 561.6l36.1 210.3L512 672.7 323.1 772l36.1-210.3-152.8-149L417.6 382 512 190.7 606.4 382l211.2 30.7-152.8 148.9z"></path></svg></i>
156
@ -428,8 +384,8 @@ exports[`renders ./components/list/demo/vertical.md correctly 1`] = `
</ul>
</div>
<div class="ant-list-item-extra"><img width="272" alt="logo" src="https://gw.alipayobjects.com/zos/rmsportal/mqaQswcyDLcXyDKnZfES.png"></div>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class="ant-list-footer">

View File

@ -6,7 +6,15 @@ exports[`List renders empty list 1`] = `
<div class="ant-spin-container">
<div class="ant-list-empty-text">
<div class="ant-empty ant-empty-normal">
<div class="ant-empty-image"><img alt="No Data" src=""></div>
<div class="ant-empty-image"><svg width="64" height="41" viewBox="0 0 64 41" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0 1)" fill="none" fillRule="evenodd">
<ellipse fill="#F5F5F5" cx="32" cy="33" rx="32" ry="7"></ellipse>
<g fillRule="nonzero" stroke="#D9D9D9">
<path d="M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z"></path>
<path d="M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z" fill="#FAFAFA"></path>
</g>
</g>
</svg></div>
<p class="ant-empty-description">No Data</p>
</div>
</div>

View File

@ -1,8 +1,11 @@
import { mount } from '@vue/test-utils';
import { asyncExpect } from '@/tests/utils';
import List from '..';
import mountTest from '../../../tests/shared/mountTest';
describe('List', () => {
mountTest(List);
mountTest(List.Item);
it('locale not passed to internal div', async () => {
const locale = { emptyText: 'Custom text' };
const wrapper = mount(

View File

@ -2,20 +2,21 @@
### List
| Property | Description | Type | Default |
| --- | --- | --- | --- |
| bordered | Toggles rendering of the border around the list | boolean | false |
| footer | List footer renderer | string\|slot | - |
| grid | The grid type of list. You can set grid to something like {gutter: 16, column: 4} | object | - |
| header | List header renderer | string\|slot | - |
| itemLayout | The layout of list, default is `horizontal`, If a vertical list is desired, set the itemLayout property to `vertical` | string | - |
| rowKey | Item's unique key, could be a string or function that returns a string | string\|Function(record):string | `key` |
| loading | Shows a loading indicator while the contents of the list are being fetched | boolean\|[object](https://www.antdv.com/components/spin/#API) | false |
| loadMore | Shows a load more content | string\|slot | - |
| locale | i18n text including empty text | object | emptyText: 'No Data' <br> |
| pagination | Pagination [config](https://www.antdv.com/components/pagination/#API), hide it by setting it to false | boolean \| object | false |
| split | Toggles rendering of the split under the list item | boolean | true |
| renderItem | Custom item renderer, slot="renderItem" and slot-scope="item, index" | (item, index) => vNode | | - |
| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
| bordered | Toggles rendering of the border around the list | boolean | false | |
| footer | List footer renderer | string\|slot | - | |
| grid | The grid type of list. You can set grid to something like {gutter: 16, column: 4} | object | - | |
| header | List header renderer | string\|slot | - | |
| itemLayout | The layout of list, default is `horizontal`, If a vertical list is desired, set the itemLayout property to `vertical` | string | - | |
| rowKey | Item's unique key, could be a string or function that returns a string | string\|Function(record):string | `key` | |
| loading | Shows a loading indicator while the contents of the list are being fetched | boolean\|[object](https://www.antdv.com/components/spin/#API) | false | |
| loadMore | Shows a load more content | string\|slot | - | |
| locale | i18n text including empty text | object | emptyText: 'No Data' <br> | |
| pagination | Pagination [config](https://www.antdv.com/components/pagination/#API), hide it by setting it to false | boolean \| object | false | |
| split | Toggles rendering of the split under the list item | boolean | true | |
| dataSource | dataSource array for list | any[] | - | 3.20.1 |
| renderItem | Custom item renderer, slot="renderItem" and slot-scope="item, index" | (item, index) => vNode | | - | |
### pagination

View File

@ -38,7 +38,7 @@ export const ListSize = ['small', 'default', 'large'];
export const ListProps = () => ({
bordered: PropTypes.bool,
dataSource: PropTypes.any,
dataSource: PropTypes.array,
extra: PropTypes.any,
grid: PropTypes.shape(ListGridType).loose,
itemLayout: PropTypes.string,
@ -87,15 +87,31 @@ const List = {
},
total: 0,
};
this.onPaginationChange = this.triggerPaginationEvent('onChange');
this.onPaginationShowSizeChange = this.triggerPaginationEvent('onShowSizeChange');
const { pagination } = this.$props;
const paginationObj = pagination && typeof pagination === 'object' ? pagination : {};
return {
paginationCurrent: 1,
paginationCurrent: paginationObj.defaultCurrent || 1,
paginationSize: paginationObj.defaultPageSize || 10,
};
},
methods: {
triggerPaginationEvent(eventName) {
return (page, pageSize) => {
const { pagination } = this.$props;
this.paginationCurrent = page;
this.paginationSize = pageSize;
if (pagination && pagination[eventName]) {
pagination[eventName](page, pageSize);
}
};
},
renderItem2(item, index) {
const { $scopedSlots, rowKey } = this;
let key;
const renderItem = this.renderItem || $scopedSlots.renderItem;
if (!renderItem) return null;
let key;
if (typeof rowKey === 'function') {
key = rowKey(item);
} else if (typeof rowKey === 'string') {
@ -138,11 +154,12 @@ const List = {
itemLayout,
pagination,
grid,
dataSource,
dataSource = [],
size,
loading,
$slots,
paginationCurrent,
paginationSize,
} = this;
const getPrefixCls = this.configProvider.getPrefixCls;
const prefixCls = getPrefixCls('list', customizePrefixCls);
@ -185,13 +202,14 @@ const List = {
...this.defaultPaginationProps,
total: dataSource.length,
current: paginationCurrent,
pageSize: paginationSize,
...(pagination || {}),
};
const largestPage = Math.ceil(paginationProps.total / paginationProps.pageSize);
if (paginationProps.current > largestPage) {
paginationProps.current = largestPage;
}
const { class: cls, style, onShowSizeChange = () => {}, ...restProps } = paginationProps;
const { class: cls, style, ...restProps } = paginationProps;
const paginationContent = pagination ? (
<div class={`${prefixCls}-pagination`}>
<Pagination
@ -199,7 +217,10 @@ const List = {
props: omit(restProps, ['onChange']),
class: cls,
style,
on: { change: this.defaultPaginationProps.onChange, showSizeChange: onShowSizeChange },
on: {
change: this.onPaginationChange,
showSizeChange: this.onPaginationShowSizeChange,
},
}}
/>
</div>
@ -225,7 +246,11 @@ const List = {
}),
);
childrenContent = grid ? <Row gutter={grid.gutter}>{childrenList}</Row> : childrenList;
childrenContent = grid ? (
<Row gutter={grid.gutter}>{childrenList}</Row>
) : (
<ul class={`${prefixCls}-items`}>{childrenList}</ul>
);
} else if (!children.length && !isLoading) {
const renderEmpty = this.configProvider.renderEmpty;
childrenContent = this.renderEmpty(prefixCls, renderEmpty);

View File

@ -2,21 +2,22 @@
### List
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| bordered | 是否展示边框 | boolean | false |
| footer | 列表底部 | string\|slot | - |
| grid | 列表栅格配置 | object | - |
| header | 列表头部 | string\|slot | - |
| itemLayout | 设置 `List.Item` 布局, 设置成 `vertical` 则竖直样式显示, 默认横排 | string | - |
| loading | 当卡片内容还在加载中时,可以用 `loading` 展示一个占位 | boolean\|[object](https://www.antdv.com/components/spin-cn/#API) | false |
| loadMore | 加载更多 | string\|slot | - |
| locale | 默认文案设置,目前包括空数据文案 | object | emptyText: '暂无数据' |
| pagination | 对应的 `pagination` [配置](https://www.antdv.com/components/pagination-cn/#API), 设置 `false` 不显示 | boolean\|object | false |
| size | list 的尺寸 | `default` \| `middle` \| `small` | `default` |
| split | 是否展示分割线 | boolean | true |
| renderItem | 自定义`Item`函数,也可使用 slot="renderItem" 和 slot-scope="item, index" | (item, index) => vNode | | - |
| rowKey | 各项 key 的取值,可以是字符串或一个函数 | item => string\|number | |
| 参数 | 说明 | 类型 | 默认值 | 版本 |
| --- | --- | --- | --- | --- |
| bordered | 是否展示边框 | boolean | false | |
| footer | 列表底部 | string\|slot | - | |
| grid | 列表栅格配置 | object | - | |
| header | 列表头部 | string\|slot | - | |
| itemLayout | 设置 `List.Item` 布局, 设置成 `vertical` 则竖直样式显示, 默认横排 | string | - | |
| loading | 当卡片内容还在加载中时,可以用 `loading` 展示一个占位 | boolean\|[object](https://www.antdv.com/components/spin-cn/#API) | false | |
| loadMore | 加载更多 | string\|slot | - | |
| locale | 默认文案设置,目前包括空数据文案 | object | emptyText: '暂无数据' | |
| pagination | 对应的 `pagination` [配置](https://www.antdv.com/components/pagination-cn/#API), 设置 `false` 不显示 | boolean\|object | false | |
| size | list 的尺寸 | `default` \| `middle` \| `small` | `default` | |
| split | 是否展示分割线 | boolean | true | |
| dataSource | 列表数据源 | any[] | - | 1.5.0 |
| renderItem | 自定义`Item`函数,也可使用 slot="renderItem" 和 slot-scope="item, index" | (item, index) => vNode | | - | |
| rowKey | 各项 key 的取值,可以是字符串或一个函数 | item => string\|number | | |
### pagination