UNPKG

@antmjs/vantui

Version:

一套适用于Taro3及React的vantui组件库

534 lines (532 loc) 22.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.Cascader = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = require("react"); var _components = require("@tarojs/components"); var _tab = _interopRequireDefault(require("../tab")); var _tabs = _interopRequireDefault(require("../tabs")); var _button = _interopRequireDefault(require("../button")); var _popup = _interopRequireDefault(require("../popup")); var _defaultProps = require("../default-props"); var _cascaderItem = require("./cascaderItem"); var _helper = require("./helper"); var _scrollViewTimeout = _interopRequireDefault(require("./scrollViewTimeout")); var _tree = _interopRequireDefault(require("./tree")); var _jsxRuntime = require("react/jsx-runtime"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } /* eslint-disable import/no-named-as-default */ var d = (0, _defaultProps.get)().Cascader || {}; var defaultProps = { className: '', style: {}, visible: false, options: [], value: [], title: '', textKey: 'text', valueKey: 'value', childrenKey: 'children', convertConfig: {}, closeable: false, closeIconPosition: 'top-right', closeIcon: 'close', checkStrictly: false, okText: '确定', lazy: false, lazyLoad: function lazyLoad() {}, onClose: function onClose() {}, onChange: function onChange() {}, onPathChange: function onPathChange() {} }; var InternalCascader = function InternalCascader(props) { var _defaultProps$d$props = _objectSpread(_objectSpread(_objectSpread({}, defaultProps), d), props), className = _defaultProps$d$props.className, style = _defaultProps$d$props.style, visible = _defaultProps$d$props.visible, options = _defaultProps$d$props.options, value = _defaultProps$d$props.value, title = _defaultProps$d$props.title, textKey = _defaultProps$d$props.textKey, valueKey = _defaultProps$d$props.valueKey, childrenKey = _defaultProps$d$props.childrenKey, convertConfig = _defaultProps$d$props.convertConfig, closeable = _defaultProps$d$props.closeable, closeIconPosition = _defaultProps$d$props.closeIconPosition, closeIcon = _defaultProps$d$props.closeIcon, lazy = _defaultProps$d$props.lazy, checkStrictly = _defaultProps$d$props.checkStrictly, okText = _defaultProps$d$props.okText, lazyLoad = _defaultProps$d$props.lazyLoad, onClose = _defaultProps$d$props.onClose, onChange = _defaultProps$d$props.onChange, scrollIntoView = _defaultProps$d$props.scrollIntoView, onPathChange = _defaultProps$d$props.onPathChange; var _useState = (0, _react.useState)('c1'), _useState2 = (0, _slicedToArray2.default)(_useState, 2), tabvalue = _useState2[0], setTabvalue = _useState2[1]; var _useState3 = (0, _react.useState)([]), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), optiosData = _useState4[0], setOptiosData = _useState4[1]; var _useState5 = (0, _react.useState)(false), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), tabAnimate = _useState6[0], settabAnimate = _useState6[1]; var isLazy = function isLazy() { return !!state.configs.lazy && Boolean(state.configs.lazyLoad); }; var _useState7 = (0, _react.useState)({ optionsData: [], panes: [{ nodes: [], selectedNode: [], paneKey: '' }], innerValue: value, tree: new _tree.default([], {}), tabsCursor: 0, // 选中的tab项 initLoading: false, currentProcessNode: [], configs: { lazy: lazy, lazyLoad: lazyLoad, valueKey: valueKey, textKey: textKey, childrenKey: childrenKey, convertConfig: convertConfig }, lazyLoadMap: new Map() }), _useState8 = (0, _slicedToArray2.default)(_useState7, 1), state = _useState8[0]; (0, _react.useEffect)(function () { if (value !== state.innerValue) { state.innerValue = value; } // eslint-disable-next-line react-hooks/exhaustive-deps }, [value]); (0, _react.useEffect)(function () { initData(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [options]); var initData = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() { return _regenerator.default.wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: // 初始化开始处理数据 state.lazyLoadMap.clear(); if (convertConfig && Object.keys(convertConfig).length > 0) { state.optionsData = (0, _helper.convertListToOptions)(options, convertConfig); } else { state.optionsData = options; } state.tree = new _tree.default(state.optionsData, { value: state.configs.valueKey, text: state.configs.textKey, children: state.configs.childrenKey }); if (!(isLazy() && !state.tree.nodes.length)) { _context.next = 6; break; } _context.next = 6; return invokeLazyLoad({ root: true, loading: true, text: '', value: '' }); case 6: state.panes = [{ nodes: state.tree.nodes, selectedNode: null, paneKey: 'c1' }]; syncValue(); setOptiosData(state.panes); case 9: case "end": return _context.stop(); } }, _callee); })); return function initData() { return _ref.apply(this, arguments); }; }(); // 处理有默认值时的数据 var syncValue = /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() { var _state$tree, _state$tree$nodes; var currentValue, needToSync, parent, last, pathNodes; return _regenerator.default.wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: currentValue = state.innerValue; if (!(currentValue === undefined || currentValue === null || !((_state$tree = state.tree) !== null && _state$tree !== void 0 && (_state$tree$nodes = _state$tree.nodes) !== null && _state$tree$nodes !== void 0 && _state$tree$nodes.length))) { _context3.next = 3; break; } return _context3.abrupt("return"); case 3: if (!(currentValue.length === 0)) { _context3.next = 6; break; } state.tabsCursor = 0; // state.panes = [{ nodes: state.tree.nodes, selectedNode: null }]; return _context3.abrupt("return"); case 6: needToSync = currentValue; if (!(isLazy() && Array.isArray(currentValue) && currentValue.length)) { _context3.next = 19; break; } needToSync = []; parent = state.tree.nodes.find(function (node) { return node.value === currentValue[0]; }); if (!parent) { _context3.next = 19; break; } needToSync = [parent.value]; state.initLoading = true; _context3.next = 15; return currentValue.slice(1).reduce( /*#__PURE__*/function () { var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(p, value) { var _parent$children; var parent, node; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return p; case 2: parent = _context2.sent; _context2.next = 5; return invokeLazyLoad(parent); case 5: node = parent === null || parent === void 0 ? void 0 : (_parent$children = parent.children) === null || _parent$children === void 0 ? void 0 : _parent$children.find(function (item) { return item.value === value; }); if (node) { needToSync.push(value); } return _context2.abrupt("return", Promise.resolve(node)); case 8: case "end": return _context2.stop(); } }, _callee2); })); return function (_x, _x2) { return _ref3.apply(this, arguments); }; }(), Promise.resolve(parent)); case 15: last = _context3.sent; _context3.next = 18; return invokeLazyLoad(last); case 18: state.initLoading = false; case 19: if (needToSync.length && currentValue === value) { pathNodes = state.tree.getPathNodesByValue(needToSync); pathNodes.forEach(function (node, index) { state.tabsCursor = index; // 当有默认值时,不触发 chooseItem 里的 emit 事件 _chooseItem(node, true); }); } case 20: case "end": return _context3.stop(); } }, _callee3); })); return function syncValue() { return _ref2.apply(this, arguments); }; }(); var invokeLazyLoad = /*#__PURE__*/function () { var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(node) { var parent, lazyLoadPromise, nodes; return _regenerator.default.wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: if (node) { _context4.next = 2; break; } return _context4.abrupt("return"); case 2: if (state.configs.lazyLoad) { _context4.next = 5; break; } node.leaf = true; return _context4.abrupt("return"); case 5: if (!(state.tree.isLeaf(node, isLazy()) || state.tree.hasChildren(node, isLazy()))) { _context4.next = 7; break; } return _context4.abrupt("return"); case 7: node.loading = true; parent = node.root ? null : node; lazyLoadPromise = state.lazyLoadMap.get(node); if (!lazyLoadPromise) { lazyLoadPromise = new Promise(function (resolve) { var _state$configs$lazyLo, _state$configs; // 外部必须resolve (_state$configs$lazyLo = (_state$configs = state.configs).lazyLoad) === null || _state$configs$lazyLo === void 0 ? void 0 : _state$configs$lazyLo.call(_state$configs, node, resolve); }); state.lazyLoadMap.set(node, lazyLoadPromise); } _context4.next = 13; return lazyLoadPromise; case 13: nodes = _context4.sent; if (Array.isArray(nodes) && nodes.length > 0) { state.tree.updateChildren(nodes, parent); } else { // 如果加载完成后没有提供子节点,作为叶子节点处理 node.leaf = true; } node.loading = false; state.lazyLoadMap.delete(node); case 17: case "end": return _context4.stop(); } }, _callee4); })); return function invokeLazyLoad(_x3) { return _ref4.apply(this, arguments); }; }(); var close = function close() { settabAnimate(false); onClose && onClose(); }; var closePopup = function closePopup() { close(); settabAnimate(false); }; var onOk = function onOk() { var pathNodes = state.panes.map(function (item) { return item.selectedNode; }); var optionParams = pathNodes.reduce(function (pre, cur) { if (cur) { pre.push(cur.value); } return pre; }, []); onChange === null || onChange === void 0 ? void 0 : onChange(optionParams, pathNodes); closePopup(); }; /* type: 是否是静默模式,是的话不触发事件 tabsCursor: tab的索引 */ var _chooseItem = /*#__PURE__*/function () { var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(node, type) { var pathNodes, _pathNodes, optionParams, level, _pathNodes2, _optionParams; return _regenerator.default.wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: if (!(!type && node.disabled || !state.panes[state.tabsCursor])) { _context5.next = 2; break; } return _context5.abrupt("return"); case 2: if (!checkStrictly) { _context5.next = 9; break; } pathNodes = state.panes.map(function (item) { return item.selectedNode; }); if (!pathNodes.includes(node)) { _context5.next = 9; break; } // 取消选中状态 state.panes = state.panes.slice(0, node.level + 1); // @ts-ignore state.panes[node.level].selectedNode = null; setOptiosData(state.panes); return _context5.abrupt("return"); case 9: if (!state.tree.isLeaf(node, isLazy())) { _context5.next = 16; break; } node.leaf = true; // @ts-ignore state.panes[state.tabsCursor].selectedNode = node; state.panes = state.panes.slice(0, node.level + 1); if (!type) { _pathNodes = state.panes.map(function (item) { return item.selectedNode; }); optionParams = _pathNodes.map(function (item) { return item.value; }); onChange === null || onChange === void 0 ? void 0 : onChange(optionParams, _pathNodes); onPathChange === null || onPathChange === void 0 ? void 0 : onPathChange(optionParams, _pathNodes); close(); } setOptiosData(state.panes); return _context5.abrupt("return"); case 16: if (!state.tree.hasChildren(node, isLazy())) { _context5.next = 26; break; } level = node.level + 1; // @ts-ignore state.panes[state.tabsCursor].selectedNode = node; state.panes = state.panes.slice(0, level); state.tabsCursor = level; state.panes.push({ nodes: node.children || [], selectedNode: null, paneKey: "c".concat(state.tabsCursor + 1) }); setOptiosData(state.panes); // 延时触发优化交互 setTabvalue("c".concat(state.tabsCursor + 1)); if (!type) { _pathNodes2 = state.panes.map(function (item) { return item.selectedNode; }); _optionParams = _pathNodes2.map(function (item) { return item === null || item === void 0 ? void 0 : item.value; }); onPathChange === null || onPathChange === void 0 ? void 0 : onPathChange(_optionParams, _pathNodes2); } return _context5.abrupt("return"); case 26: state.currentProcessNode = node; if (!node.loading) { _context5.next = 29; break; } return _context5.abrupt("return"); case 29: _context5.next = 31; return invokeLazyLoad(node); case 31: if (state.currentProcessNode === node) { // @ts-ignore state.panes[state.tabsCursor].selectedNode = node; _chooseItem(node, type); } setOptiosData(state.panes); case 33: case "end": return _context5.stop(); } }, _callee5); })); return function chooseItem(_x4, _x5) { return _ref5.apply(this, arguments); }; }(); return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, { className: "van-cascader ".concat(className), style: style, children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_popup.default, { className: "van-cascadar-popup", show: visible, position: "bottom", round: true, closeable: closeable && !checkStrictly, closeIconPosition: closeIconPosition, closeIcon: closeIcon, onClickOverlay: closePopup, onClose: closePopup, children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.View, { className: 'van-cascader__title', children: [title, checkStrictly && /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.default, { onClick: onOk, plain: true, type: "default", className: "van-cascader__ok-btn", children: okText })] }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_tabs.default, { active: tabvalue, animated: tabAnimate, renderNavLeft: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, { className: "van-cascader-tab-box", children: optiosData.map(function (pane, index) { var _pane$selectedNode, _pane$selectedNode2; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, { onClick: function onClick() { if (!tabAnimate) settabAnimate(true); setTabvalue(pane.paneKey); state.tabsCursor = index; }, className: "van-tabs__titles-item ".concat(tabvalue === pane.paneKey ? 'active' : ''), children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.Text, { className: "van-tabs__titles-item__text", children: [!state.initLoading && state.panes.length && (pane === null || pane === void 0 ? void 0 : (_pane$selectedNode = pane.selectedNode) === null || _pane$selectedNode === void 0 ? void 0 : _pane$selectedNode.text), !state.initLoading && state.panes.length && !(pane !== null && pane !== void 0 && (_pane$selectedNode2 = pane.selectedNode) !== null && _pane$selectedNode2 !== void 0 && _pane$selectedNode2.text) && '请选择', !(!state.initLoading && state.panes.length) && 'Loading...'] }) }, pane.paneKey); }) }), children: !state.initLoading && state.panes.length ? optiosData.map(function (pane, index) { return /*#__PURE__*/(0, _jsxRuntime.jsx)(_tab.default, { active: tabvalue === pane.paneKey, name: pane.paneKey, lazyRender: true, lazyTimeout: 200, onClick: function onClick() { if (!tabAnimate && index !== optiosData.length - 1) settabAnimate(true); }, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_scrollViewTimeout.default, { timeout: 400, optiosData: optiosData, tabvalue: tabvalue, value: value, scrollIntoView: scrollIntoView, children: pane.nodes && pane.nodes.map(function (node, index) { var _pane$selectedNode3; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_cascaderItem.CascaderItem, _objectSpread(_objectSpread({}, props), {}, { data: node, checked: ((_pane$selectedNode3 = pane.selectedNode) === null || _pane$selectedNode3 === void 0 ? void 0 : _pane$selectedNode3.value) === node.value, chooseItem: function chooseItem(node) { return _chooseItem(node, false); }, id: "vant-cascader-item".concat(node.value) }), index); }) }) }, pane.paneKey); }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_tab.default, { active: true, name: "-999", lazyRender: true, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, { className: "van-cascader-tab" }) }, "-999") })] }) }); }; var Cascader = InternalCascader; exports.Cascader = Cascader;