lm-carpicker
Version:
* 作者:liuduan * 邮箱:liuduan.05.05@163.com * 版本:**`0.3.5`**
114 lines (93 loc) • 3.06 kB
JavaScript
import React from 'react'
import PropTypes from 'prop-types'
import PickerHoc from './pickerHoc'
import PopupHoc from './popupHoc'
const Picker = props => {
let uuid = 0;
let { data, selected, onSelect, renderList } = props;
let component = null;
// 列表渲染函数
if (!renderList) renderList = (data = [], selected, onSelect, isModel) => {
if (data instanceof Array && data.length) {
return data.map((item, i) => {
const { text, value, difftext, modelid } = item;
return (
<li
key={value || modelid}
className={`item ${selected && [value, modelid].indexOf(selected) !== -1 ? 'active' : ''}`}
onClick={() => { onSelect(isModel ? modelid : value, text) }}
>
<p>{text}</p>
{difftext && <p className="desc">{difftext}</p>}
</li>
);
});
} else {
return null;
}
}
// 车品牌/渲染
const renderComponent = (data) => {
const demoData = data && data[0]
if (!demoData) return null;
if (!checkData(demoData)) {
return (
<div className="area">
<ul className="list">
{renderList(data, selected, onSelect)}
</ul>
</div>
);
}
return data.map((listData, i) => {
let { zimu, brandList, year, modelList, list = [] } = listData;
let isModel = 'modelList' in listData;
zimu = zimu === '热门' ? '热门品牌' : zimu;
return (
<div key={uuid++} className="area">
{
isModel || zimu
? <h4 className="title" id={zimu || year || i}>{isModel ? year : zimu}</h4>
: null
}
<ul className="list">
{renderList(isModel ? modelList : (brandList || list), selected, onSelect, isModel)}
</ul>
</div>
);
});
}
// 执行渲染
if (data.length) component = renderComponent(data);
return (
<div className="main">
{component}
</div>
);
}
Picker.propTypes = {
index: PropTypes.number,
data: PropTypes.array.isRequired,
selected: PropTypes.string,
onSelect: PropTypes.func
};
Picker.defaultProps = {
index: 0,
data: [],
selected: '',
onSelect() { }
};
export default PopupHoc(PickerHoc(Picker));
function checkData(data = {}) {
let flag = false;
let arr = Object.keys(data);
let i = 0, l = arr.length;
for (; i < l; i++) {
const val = data[arr[i]];
if (Object.prototype.toString.call(val) === '[object Array]') {
flag = true;
break;
}
}
return flag;
}