mh-rn-component
Version:
227 lines (206 loc) • 5.9 kB
JavaScript
import React, { useEffect, useState } from 'react';
import { View, Text, StyleSheet, TouchableWithoutFeedback } from "react-native";
import Columns from "./Columns";
const Picker = _ref => {
let {
show,
title = "标题",
confirmButtonText = "确认",
cancelButtonText = "取消",
visibleItemCount = 5,
columnHeight = 44,
columns,
cascadeLevel,
customFieldName = {
value: "value",
children: "children"
},
toolbar,
...rest
} = _ref;
const customFieldNameValue = customFieldName.value || "value";
const customFieldNameChildren = customFieldName.children || "children"; // 当前列的选项数组
const [columnsData, setColumnsData] = useState([]); // 要返回的选中数组
const [currentValue, setCurrentValue] = useState(new Array(columnsData.length)); // 当前各列选中的index
const [columnsSelect, setColumnsSelect] = useState(new Array(columnsData.length));
const formattedColumns = () => {
// 判断是否事级联选择
if (cascadeLevel) {
let cascadeArr = new Array(cascadeLevel);
for (let i = 0; i < cascadeLevel; i++) {
if (i === 0) {
cascadeArr[0] = {
values: columns
};
} else {
var _cascadeArr;
cascadeArr[i] = {
values: (_cascadeArr = cascadeArr[i - 1]) === null || _cascadeArr === void 0 ? void 0 : _cascadeArr.values[0][customFieldNameChildren],
defaultIndex: 0
};
}
}
setColumnsData(() => {
return [...cascadeArr];
});
} else {
setColumnsData([...columns]);
}
}; // 重组 级联数据结构
const cascadeFormat = (value, columnsIndex) => {
for (let i = columnsIndex + 1; i < columnsData.length; i++) {
if (i === columnsIndex + 1) {
columnsData[i].values = columnsData[i - 1].values[value].children;
} else {
columnsData[i].values = columnsData[i - 1].values[0].children;
}
setColumnsSelect(prev => {
prev[i] = 0;
return [...prev];
});
setCurrentValue(prev => {
prev[i] = columnsData[i].values[0][customFieldNameValue];
return prev;
});
}
setColumnsData([...columnsData]);
};
useEffect(() => {
formattedColumns();
}, [columns, cascadeLevel]);
/**
* 多列选择/级联选择
* @param value 选中的要返回的数据
* @param index 选中的位置
* @param columnsIndex 改变的是第几列 0开始
*/
const multiColumnChange = (value, index, columnsIndex) => {
setCurrentValue(prev => {
prev[columnsIndex] = value;
return prev;
});
setColumnsSelect(prev => {
prev[columnsIndex] = index;
return [...prev];
});
if (cascadeLevel) {
cascadeFormat(index, columnsIndex);
}
};
const confirm = () => {
rest.onConfirm && rest.onConfirm(currentValue);
rest.showChange(!show);
};
const cancel = () => {
rest.onCancel && rest.onCancel(currentValue);
rest.showChange(!show);
};
const change = () => {
// 组合一下change
const backValue = columnsSelect.reduce((acc, cur, index) => {
let _obj = {
index: cur,
value: currentValue[index]
};
acc.push(_obj);
return acc;
}, []);
if (backValue.length > 0) {
rest.onChange && rest.onChange(backValue);
}
};
useEffect(() => {
change();
}, [columnsSelect]);
return /*#__PURE__*/React.createElement(React.Fragment, null, show && /*#__PURE__*/React.createElement(View, {
style: styles.bg
}, /*#__PURE__*/React.createElement(TouchableWithoutFeedback, {
onPress: () => rest.showChange(false)
}, /*#__PURE__*/React.createElement(View, {
style: styles.handel_bg
})), /*#__PURE__*/React.createElement(View, {
style: styles.picker
}, /*#__PURE__*/React.createElement(View, {
style: styles.picker_title
}, /*#__PURE__*/React.createElement(Text, {
onPress: cancel,
style: [styles.picker_fontSize, {
color: "#cccccc"
}]
}, cancelButtonText), /*#__PURE__*/React.createElement(Text, {
style: [styles.picker_title_content]
}, title), /*#__PURE__*/React.createElement(Text, {
onPress: confirm,
style: [styles.picker_fontSize, {
color: "#3170a7"
}]
}, confirmButtonText)), /*#__PURE__*/React.createElement(View, {
style: [styles.picker_main, {
height: columnHeight * visibleItemCount
}]
}, columnsData.map((item, index) => {
return /*#__PURE__*/React.createElement(Columns, {
onChange: multiColumnChange,
columnIndex: index,
visibleItemCount: visibleItemCount,
defaultIndex: item.defaultIndex || 0,
columnHeight: columnHeight,
data: item.values,
key: index,
customFieldName: customFieldName,
cascadeLevel: cascadeLevel
});
})))));
};
const styles = StyleSheet.create({
bg: {
width: "100%",
height: "100%",
flex: 1,
justifyContent: "flex-end",
position: 'absolute',
top: 0,
left: 0,
alignItems: 'center',
backgroundColor: 'rgba(0, 0, 0, .4)'
},
handel_bg: {
flex: 1,
width: '100%'
},
picker: {
width: "100%",
minHeight: 300,
// maxHeight: 440,
backgroundColor: "#ffffff",
borderTopLeftRadius: 10,
borderTopRightRadius: 10
},
picker_title: {
padding: 8,
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center"
},
picker_title_content: {
fontSize: 18
},
picker_fontSize: {
fontSize: 16
},
picker_main: {
width: "100%",
flexDirection: "row",
alignItems: "flex-start",
overflow: "hidden"
},
picker_frame: {
width: "100%",
backgroundColor: "rgba(248,223,112,0.5)",
position: "absolute",
top: "50%",
left: 0
}
});
export default Picker;
//# sourceMappingURL=index.js.map