lm-carpicker
Version:
* 作者:liuduan * 邮箱:liuduan.05.05@163.com * 版本:**`0.3.5`**
115 lines (105 loc) • 3.9 kB
JavaScript
import React, { Component, Children, cloneElement } from 'react'
import PropTypes from 'prop-types'
export default class Wrapper extends Component {
static propTypes = {
selectedMap: PropTypes.array, // 选中集合 id
selectedLabel: PropTypes.array, // 选中集合 text
onSelect: PropTypes.func, // 点选 选项后的回调,可用于请求数据操作等
onDismiss: PropTypes.func, // 点击取消按钮后的回调
onOk: PropTypes.func, // 点击提交按钮后的回调
};
static defaultProps = {
selectedMap: [],
selectedLabel: [],
onSelect() { },
onDismiss() { },
onOk() { }
};
constructor(props) {
super(props);
this.state = {
selectedMap: [].concat(props.selectedMap),
selectedLabel: [].concat(props.selectedLabel)
};
}
componentWillReceiveProps(nextProps) {
// 监听 props.selectedMap 变化, 若不同则改变
const nextSelectedMap = nextProps.selectedMap, beforeSelectedMap = this.props.selectedMap, len = this.props.children.length;
if (nextSelectedMap.length === len && nextSelectedMap[nextSelectedMap.length - 1] !== beforeSelectedMap[beforeSelectedMap.length - 1]) {
this.setState({
selectedMap: [].concat(nextSelectedMap),
selectedLabel: [].concat(nextProps.selectedLabel)
});
}
}
// 点击item项
onSelect(index, val, label) {
const { disabled, children, onSelect, onOk } = this.props;
if (disabled) return;
// 更新当前selected
let { selectedMap, selectedLabel } = this.state, len = children.length;
selectedMap[index] = val;
selectedLabel[index] = label;
// 如果是最后一项直接提交
if (index < len - 1) {
// 如果不是, 将后面的选中值设置为空
let i = index;
i++;
for (i; i < len; i++) {
selectedMap[i] = ''
}
} else {
onOk(selectedMap, selectedLabel);
}
this.setState({
selectedMap,
selectedLabel
}, () => { onSelect(selectedMap[index], index) });
}
// 点击取消
onDismiss(index) {
const { onDismiss } = this.props;
let { selectedMap, selectedLabel } = this.state;
// 如果是第一个恢复值
if (index === 0) {
selectedMap = [].concat(this.props.selectedMap);
selectedLabel = [].concat(this.props.selectedLabel);
} else {
// 更新当前selected
selectedMap[index] = '';
selectedMap[index - 1] = '';
}
this.setState({
selectedMap,
selectedLabel
}, () => { onDismiss(index) });
}
// 控制 弹框 显示隐藏
controlShow = (visible, index) => {
if (visible) {
if (index === 0) {
return true;
} else {
return this.state.selectedMap[index - 1] ? true : false
}
} else {
return false;
}
}
render() {
return (
<React.Fragment>
{Children.map(this.props.children, (child, index) => {
return cloneElement(child, {
index: index,
visible: this.controlShow(this.props.visible, index),
selected: this.state.selectedMap[index],
onSelect: this.onSelect.bind(this, index),
onDismiss: this.onDismiss.bind(this, index),
...child.props
});
})}
</React.Fragment>
)
}
}