UNPKG

knk

Version:

react components based on react

193 lines (191 loc) 6.53 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; /** * 异步树组件 */ import React, { useState, useEffect } from 'react'; import { TreeSelect, Spin, message } from 'antd'; import { fetch } from '../../../common/api'; import { log } from '../../../common/tool'; import '../../../style/ajax_tree_select.less'; var SHOW_PARENT = TreeSelect.SHOW_PARENT, TreeNode = TreeSelect.TreeNode; var AjaxTreeSelect = /*#__PURE__*/React.forwardRef(function (props, ref) { var isOpen = React.useRef(true); var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), loading = _useState2[0], setLoading = _useState2[1]; var _useState3 = useState([]), _useState4 = _slicedToArray(_useState3, 2), treeData = _useState4[0], setTreeData = _useState4[1]; useEffect(function () { handleGetTreeData(); return function () { isOpen.current = false; }; }, []); var handleGetTreeData = function handleGetTreeData() { var apiPath = props.apiPath, apiData = props.apiData, apiMethod = props.apiMethod, treeNameKey = props.treeNameKey, treeValueKey = props.treeValueKey, treeChildren = props.treeChildren; setLoading(true); fetch(apiPath, apiData, apiMethod).then(function (data) { var dataArr = []; if (data.data) { dataArr = Array.isArray(data.data) ? data.data : [data.data]; } var buildTreeData = dataArr.map(function (item) { return { title: treeNameKey ? item[treeNameKey] : item.name, value: treeValueKey ? item[treeValueKey] : item.groupId, key: treeValueKey ? item[treeValueKey] : item.groupId, children: buildChildData(item[treeChildren]) }; }); if (!multiple && !checkable) { buildTreeData.unshift({ title: '请选择', value: '', key: 'all', children: [] }); } // 判断如果卸载,则不再设置数据 if (!isOpen.current) return; setTreeData(buildTreeData); }).catch(function (err) { if (!isOpen.current) return; log.error(err); message.error("\u83B7\u53D6\u6570\u636E\u5931\u8D25:".concat(err.message) || ''); }).finally(function () { if (!isOpen.current) return; setLoading(false); }); function buildChildData(child) { if (!child || !Array.isArray(child)) return []; return Object.keys(child).map(function (groupId) { var item = child[groupId]; return { title: treeNameKey ? item[treeNameKey] : item.name, value: treeValueKey ? item[treeValueKey] : item.groupId, key: treeValueKey ? item[treeValueKey] : item.groupId, children: buildChildData(item[treeChildren]) }; }); } }; var handleChange = function handleChange(groupIds) { var onChange = props.onChange; onChange(groupIds); }; // 异步加载数据 var onLoadData = function onLoadData(treeNode) { var apiPath = props.apiPath, apiMethod = props.apiMethod, treeChildren = props.treeChildren, treeValueKey = props.treeValueKey, parentId = props.parentId; return new Promise(function (resolve) { var nodeValue = treeNode.props[treeValueKey]; if (treeNode.props[treeChildren] && treeNode.props[treeChildren].length) { resolve(true); return; } var sendData = {}; sendData[parentId || 'parentId'] = nodeValue; fetch(apiPath, sendData, apiMethod).then(function (res) { var data = res && res.data || []; if (data.length) { var buildTreeNode = function buildTreeNode(item) { var len = item.length; for (var i = 0; i < len; i++) { if (item[i][treeChildren] && item[i][treeChildren].length) { buildTreeNode(item[i][treeChildren]); } if (item[i][treeValueKey] === nodeValue) { item[i][treeChildren] = data; break; } } }; buildTreeNode(data); } // 判断如果卸载,则不再设置数据 if (!isOpen.current) return; setTreeData(data); resolve(true); }).catch(function (err) { if (!isOpen.current) return; log.error(err); message.error("\u83B7\u53D6\u6570\u636E\u5931\u8D25:".concat(err.message) || ''); }).finally(function () { if (!isOpen.current) return; setLoading(false); }); }); }; // 处理展示 var renderTreeNodes = function renderTreeNodes(data) { return data && data.length ? data.map(function (item) { if (item.children && item.children.length) { return /*#__PURE__*/React.createElement(TreeNode, { key: item.key, title: item.title, value: item.value }, item.children && item.children.length ? renderTreeNodes(item.children) : ''); } return /*#__PURE__*/React.createElement(TreeNode, _extends({}, item, { key: item.key, title: item.title, value: item.value })); }) : ''; }; var value = props.value, placeholder = props.placeholder, disabled = props.disabled, multiple = props.multiple, checkable = props.checkable, showSearch = props.showSearch, allowClear = props.allowClear, isOnLoad = props.isOnLoad, isSelectParent = props.isSelectParent, dropdownStyle = props.dropdownStyle, maxTagCount = props.maxTagCount; var onLoadProps = isOnLoad ? { loadData: onLoadData } : {}; return /*#__PURE__*/React.createElement(Spin, { spinning: loading, className: !isSelectParent ? 'app-tree-select-no-parent' : '', ref: ref }, /*#__PURE__*/React.createElement(TreeSelect, _extends({ showSearch: showSearch, value: value, dropdownStyle: dropdownStyle, placeholder: placeholder, maxTagCount: maxTagCount, onChange: handleChange, treeNodeFilterProp: "title", notFoundContent: "\u672A\u627E\u5230\u6570\u636E", multiple: multiple, treeCheckable: checkable, allowClear: allowClear, disabled: disabled }, onLoadProps), renderTreeNodes(treeData))); }); AjaxTreeSelect.defaultProps = { treeChildren: 'children', showCheckedStrategy: SHOW_PARENT, dropdownStyle: { maxHeight: 400, overflow: 'auto' }, placeholder: '请选择' }; export default AjaxTreeSelect;