antd-multi-asl-cascader-pro
Version:
A multiple cascader component for antd
134 lines (133 loc) • 5.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const react_1 = require("react");
const unstated_next_1 = require("unstated-next");
const utils_1 = require("./libs/utils");
const useFlattenData_1 = tslib_1.__importDefault(require("./hooks/useFlattenData"));
const useCascade = (params) => {
const {
// 全部级联数据
data,
// 用户选中的数据
value: valueProp, onChange, onCascaderChange, selectLeafOnly, } = params || {};
// 是否显示下垃圾
const [popupVisible, setPopupVisible] = (0, react_1.useState)(false);
// 被拍平后的全部数据
const { flattenData } = (0, useFlattenData_1.default)(data);
// menu里全部的数据,按列分
const [menuData, setMenuData] = (0, react_1.useState)([]);
// 点击显示两的路径
const [menuPath, setMenuPath] = (0, react_1.useState)([]);
// 把从props传入的value 转换成节点类型,并兼容其父子节点
const transformValue = (0, react_1.useCallback)((propsValue) => {
const value = (0, utils_1.transPropsValueToValues)(propsValue, data || []);
const nextValue = (0, utils_1.transformValue)(value, flattenData);
// if (onChange && !shallowEqualArray(nextValue, value)) {
// requestAnimationFrame(() => triggerChange(nextValue))
// }
return nextValue;
}, [flattenData, data]);
// 选中的全部数据(合并后)
const [value, setValue] = (0, react_1.useState)([]);
// 选中的全部数据(合并前,原始数据)
const selectedLeafNode = (0, react_1.useMemo)(() => (0, utils_1.findAllLeafNode)(value), [value]);
// selector 的改变触发的函数
const triggerChange = (0, react_1.useCallback)((nextValue) => {
const selectedLeafNode = (0, utils_1.findAllLeafNode)(nextValue);
const hasError = onChange && onChange((0, utils_1.transTreeNodesToArray)(selectedLeafNode), selectedLeafNode);
if (hasError) {
return;
}
setValue(nextValue);
console.log(1);
setPopupVisible(false);
}, []);
// 用户点击 menuItem 的时候的回调函数,动态显示columns
const addMenu = (0, react_1.useCallback)((menu, index) => {
if (menu && menu.length) {
setMenuData((prevMenuData) => [...prevMenuData.slice(0, index), menu]);
}
else {
setMenuData((prevMenuData) => [...prevMenuData.slice(0, index)]);
}
}, []);
// const addChildrenToNode = useCallback(
// (target: TreeNode, children: TreeNode[]): TreeNode[] => {
// const found = findNodeByValue(target.value, dataRef.current!)
// if (found) {
// found.children = children
// }
// return [...dataRef.current!]
// },
// []
// )
const lastItemRef = (0, react_1.useRef)(null);
const handleCascaderChange = (0, react_1.useCallback)((item, depth) => {
const { children } = item;
lastItemRef.current = item;
// onCascaderChange?.(item, {
// add: (newChildren: TreeNode[]) => {
// const newData = addChildrenToNode(item, newChildren)
// if (lastItemRef.current === item) {
// item.children = newChildren
// newChildren.forEach((child) => {
// child.parent = item
// })
// setFlattenData((prev) => [...prev, ...newChildren])
// handleCascaderChange(item, depth)
// }
// return newData
// },
// })
addMenu(children, depth + 1);
// 设置 亮的路径
setMenuPath((prevMenuPath) => prevMenuPath.slice(0, depth).concat(item));
}, [menuPath, onCascaderChange]);
const handleSelectChange = (0, react_1.useCallback)((item, checked, value) => {
const newValue = (0, utils_1.reconcile)(item, checked, value);
const selectedLeafNode = (0, utils_1.findAllLeafNode)(newValue);
const hasError = onChange && onChange((0, utils_1.transTreeNodesToArray)(selectedLeafNode), selectedLeafNode);
if (hasError) {
return;
}
setValue([...newValue]);
}, [flattenData]);
const resetMenuState = (0, react_1.useCallback)(() => {
if (flattenData.length === 1) {
return setMenuData([]);
}
else {
setMenuData([flattenData.filter((item) => !item.parent)]);
}
setMenuPath([]);
}, [flattenData]);
// 传入的 value 有变更时重新计算
(0, react_1.useEffect)(() => {
if (popupVisible) {
setValue(transformValue(valueProp || []));
resetMenuState();
}
}, [popupVisible]);
(0, react_1.useEffect)(() => {
setValue(transformValue(valueProp || []));
}, [valueProp, transformValue]);
return {
menuPath,
popupVisible,
setPopupVisible,
menuData,
addMenu,
setMenuData,
value,
setValue,
handleCascaderChange,
handleSelectChange,
flattenData,
resetMenuState,
triggerChange,
selectLeafOnly,
selectedLeafNode
};
};
exports.default = (0, unstated_next_1.createContainer)(useCascade);