react-onsenui
Version:
Onsen UI - React Components for Hybrid Cordova/PhoneGap Apps with Material Design and iOS UI components
114 lines (101 loc) • 2.5 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import 'onsenui/esm/elements/ons-list';
import onsCustomElement from '../onsCustomElement';
const Element = onsCustomElement('ons-list');
/**
* @original ons-list
* @category list
* @tutorial react/Reference/list
* @description
* [en]
* Component for representing a list. It takes an array called datasource and calls renderRow(row, index) for every row. Furthermore, the header and the footer can be specified with `renderRow` and `renderHeader` respectively. [/en]
* [ja][/ja]
* @example
<List
dataSource={['Row 1', 'Row 2']}
renderHeader={this.renderHeader}
renderRow={(row, idx) => (
<ListItem modifier={idx === this.state.data.length - 1 ? 'longdivider' : null}>
{row}
<Button modifier="quiet" onClick={this.remove.bind(this, idx)}>Remove</Button>
</ListItem>
)}
renderFooter={this.renderFooter}
/>
*/
const List = React.forwardRef((props, ref) => {
const {renderHeader, renderFooter, renderRow, dataSource, ...rest} = props;
const rows = dataSource.map((data, index) => renderRow(data, index));
return (
<Element
{...rest}
ref={ref}
>
{renderHeader()}
{rows}
{props.children}
{renderFooter()}
</Element>
);
});
List.propTypes = {
/**
* @name modifier
* @type string
* @description
* [en]
* Specify modifier name to specify custom styles.
* [/en]
* [ja][/ja]
*/
modifier: PropTypes.string,
/**
* @name dataSource
* @type string
* @description
* [en]
* Source of the list data. Should be an array.
* [/en]
* [ja][/ja]
*/
dataSource: PropTypes.array,
/**
* @name renderRow
* @type function
* @description
* [en]
* Function to specify the rendering function for every element in
* in the dataSource.
* [/en]
* [ja][/ja]
*/
renderRow: PropTypes.func,
/**
* @name renderHeader
* @type function
* @description
* [en]
* Function to specify the rendering function for the header
* [/en]
* [ja][/ja]
*/
renderHeader: PropTypes.func,
/**
* @name renderFooter
* @type function
* @description
* [en]
* Function to specify the rendering function for the footer
* [/en]
* [ja][/ja]
*/
renderFooter: PropTypes.func
};
List.defaultProps = {
dataSource: [],
renderRow: () => null,
renderHeader: () => null,
renderFooter: () => null
};
export default List;