diff --git a/components/transfer/item.tsx b/components/transfer/item.tsx new file mode 100644 index 0000000000..34426ef28a --- /dev/null +++ b/components/transfer/item.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import classNames from 'classnames'; +import PureRenderMixin from 'rc-util/lib/PureRenderMixin'; +import assign from 'object-assign'; +import Lazyload from 'react-lazy-load'; +import Checkbox from '../checkbox'; + +function isRenderResultPlainObject(result) { + return result && !React.isValidElement(result) && + Object.prototype.toString.call(result) === '[object Object]'; +} + +export default class Item extends React.Component { + shouldComponentUpdate(...args) { + return PureRenderMixin.shouldComponentUpdate.apply(this, args); + } + matchFilter = (text) => { + const { filter, filterOption, item } = this.props; + if (filterOption) { + return filterOption(filter, item); + } + return text.indexOf(filter) >= 0; + } + render() { + const { render, filter, item, lazy, checked, prefixCls, onClick } = this.props; + const renderResult = render(item); + let renderedText; + let renderedEl; + if (isRenderResultPlainObject(renderResult)) { + renderedText = renderResult.value; + renderedEl = renderResult.label; + } else { + renderedText = renderResult; + renderedEl = renderResult; + } + + if (filter && filter.trim() && !this.matchFilter(renderedText)) { + return null; + } + + const className = classNames({ + [`${prefixCls}-content-item`]: true, + [`${prefixCls}-content-item-disabled`]: item.disabled, + }); + + const lazyProps = assign({ + height: 32, + offset: 500, + throttle: 0, + debounce: false, + }, lazy); + + return ( + +
  • onClick(item)} + > + + {renderedEl} +
  • +
    + ); + } +} diff --git a/components/transfer/list.tsx b/components/transfer/list.tsx index aa92930e2c..ef02077c97 100644 --- a/components/transfer/list.tsx +++ b/components/transfer/list.tsx @@ -1,21 +1,15 @@ import React from 'react'; -import Checkbox from '../checkbox'; import Search from './search'; import classNames from 'classnames'; import Animate from 'rc-animate'; import PureRenderMixin from 'rc-util/lib/PureRenderMixin'; import assign from 'object-assign'; -import Lazyload from 'react-lazy-load'; import { TransferItem } from './index'; +import Item from './item'; function noop() { } -export function isRenderResultPlainObject(result) { - return result && !React.isValidElement(result) && - Object.prototype.toString.call(result) === '[object Object]'; -} - export interface TransferListProps { prefixCls: string; dataSource: TransferItem[]; @@ -128,16 +122,8 @@ export default class TransferList extends React.Component= 0; - } - render() { - const { prefixCls, dataSource, titleText, filter, checkedKeys, lazy, + const { prefixCls, dataSource, titleText, filter, checkedKeys, lazy, filterOption, body = noop, footer = noop, showSearch, render = noop, style } = this.props; let { searchPlaceholder, notFoundContent } = this.props; @@ -154,49 +140,22 @@ export default class TransferList extends React.Component { - const renderResult = render(item); - - if (isRenderResultPlainObject(renderResult)) { - return { - item: item, - renderedText: renderResult.value, - renderedEl: renderResult.label, - }; - } - return { - item: item, - renderedText: renderResult, - renderedEl: renderResult, - }; - }).filter(({ item, renderedText }) => { - return !(filter && filter.trim() && !this.matchFilter(filter, item, renderedText)); - }).map(({ item, renderedText, renderedEl }) => { if (!item.disabled) { filteredDataSource.push(item); } - - const className = classNames({ - [`${prefixCls}-content-item`]: true, - [`${prefixCls}-content-item-disabled`]: item.disabled, - }); - const lazyProps = assign({ - height: 32, - offset: 500, - throttle: 0, - debounce: false, - }, lazy); + const checked = checkedKeys.indexOf(item.key) >= 0; return ( - -
  • this.handleSelect(item)} - > - key === item.key)} disabled={item.disabled} /> - {renderedEl} -
  • -
    + ); });