@hi-ui/cascader 5.0.0-experimental.2 → 5.0.0-experimental.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @hi-ui/cascader
2
2
 
3
+ ## 5.0.0-experimental.3
4
+
5
+ ### Minor Changes
6
+
7
+ - bf1174ed8: feat(cascader): 每次打开选择面板时自动定位到已选节点位置 (5.0)
8
+
3
9
  ## 5.0.0-experimental.2
4
10
 
5
11
  ### Minor Changes
@@ -22,6 +22,7 @@ var index = require('./utils/index.js');
22
22
  var context = require('./context.js');
23
23
  var treeUtils = require('@hi-ui/tree-utils');
24
24
  var typeAssertion = require('@hi-ui/type-assertion');
25
+ var scrollIntoView = require('scroll-into-view-if-needed');
25
26
  var VirtualList = require('@hi-ui/virtual-list');
26
27
  function _interopDefaultCompat(e) {
27
28
  return e && _typeof(e) === 'object' && 'default' in e ? e : {
@@ -29,6 +30,7 @@ function _interopDefaultCompat(e) {
29
30
  };
30
31
  }
31
32
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
33
+ var scrollIntoView__default = /*#__PURE__*/_interopDefaultCompat(scrollIntoView);
32
34
  var VirtualList__default = /*#__PURE__*/_interopDefaultCompat(VirtualList);
33
35
  var menuListPrefix = classname.getPrefixCls('cascader-menu-list');
34
36
  var CascaderMenuList = /*#__PURE__*/React.forwardRef(function (_a, ref) {
@@ -82,6 +84,26 @@ var CascaderMenu = function CascaderMenu(_ref) {
82
84
  height: 260,
83
85
  itemHeight: 32
84
86
  };
87
+ var activeNodeRef = React.useRef();
88
+ var _useState = React.useState(null),
89
+ activeNode = _useState[0],
90
+ setActiveNode = _useState[1];
91
+ var timeoutId = React.useRef(null);
92
+ React.useEffect(function () {
93
+ if (activeNode) {
94
+ timeoutId.current = setTimeout(function () {
95
+ scrollIntoView__default["default"](activeNode, {
96
+ scrollMode: 'if-needed',
97
+ block: 'center'
98
+ });
99
+ }, 100);
100
+ }
101
+ return function () {
102
+ if (timeoutId.current) {
103
+ clearTimeout(timeoutId.current);
104
+ }
105
+ };
106
+ }, [activeNode, activeNodeRef, virtual]);
85
107
  return /*#__PURE__*/React__default["default"].createElement("ul", {
86
108
  className: cls,
87
109
  style: menuStyle,
@@ -99,13 +121,15 @@ var CascaderMenu = function CascaderMenu(_ref) {
99
121
  return /*#__PURE__*/React__default["default"].createElement(MenuItem, {
100
122
  key: option.id,
101
123
  option: option,
102
- prefixCls: prefixCls
124
+ prefixCls: prefixCls,
125
+ setActiveNode: setActiveNode
103
126
  });
104
127
  }) : null);
105
128
  };
106
129
  var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
107
130
  var option = _ref2.option,
108
- prefixCls = _ref2.prefixCls;
131
+ prefixCls = _ref2.prefixCls,
132
+ setActiveNode = _ref2.setActiveNode;
109
133
  var _useCascaderContext3 = context.useCascaderContext(),
110
134
  flatted = _useCascaderContext3.flatted,
111
135
  disabledContext = _useCascaderContext3.disabled,
@@ -125,7 +149,11 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {
125
149
  var disabled = disabledContext || option.disabled;
126
150
  var optionCls = classname.cx(prefixCls + "-option", active && prefixCls + "-option--active", loading && prefixCls + "-option--loading", disabled && prefixCls + "-option--disabled", selected && prefixCls + "-option--selected", classNames === null || classNames === void 0 ? void 0 : classNames.option);
127
151
  return /*#__PURE__*/React__default["default"].createElement("li", {
128
- ref: ref,
152
+ ref: function ref(node) {
153
+ if (node && active) {
154
+ setActiveNode === null || setActiveNode === void 0 ? void 0 : setActiveNode(node);
155
+ }
156
+ },
129
157
  key: option.id,
130
158
  role: "menu-item",
131
159
  className: prefixCls + "-item",
@@ -8,7 +8,7 @@
8
8
  * LICENSE file in the root directory of this source tree.
9
9
  */
10
10
  import { __rest } from 'tslib';
11
- import React, { forwardRef } from 'react';
11
+ import React, { forwardRef, useRef, useState, useEffect } from 'react';
12
12
  import { getPrefixCls, cx } from '@hi-ui/classname';
13
13
  import { __DEV__ } from '@hi-ui/env';
14
14
  import { defaultLoadingIcon, defaultSuffixIcon, defaultLeafIcon } from './icons/index.js';
@@ -16,6 +16,7 @@ import { getItemEventData, checkCanLoadChildren } from './utils/index.js';
16
16
  import { useCascaderContext } from './context.js';
17
17
  import { getTopDownAncestors } from '@hi-ui/tree-utils';
18
18
  import { isArrayNonEmpty, isFunction } from '@hi-ui/type-assertion';
19
+ import scrollIntoView from 'scroll-into-view-if-needed';
19
20
  import VirtualList from '@hi-ui/virtual-list';
20
21
  var menuListPrefix = getPrefixCls('cascader-menu-list');
21
22
  var CascaderMenuList = /*#__PURE__*/forwardRef(function (_a, ref) {
@@ -69,6 +70,26 @@ var CascaderMenu = function CascaderMenu(_ref) {
69
70
  height: 260,
70
71
  itemHeight: 32
71
72
  };
73
+ var activeNodeRef = useRef();
74
+ var _useState = useState(null),
75
+ activeNode = _useState[0],
76
+ setActiveNode = _useState[1];
77
+ var timeoutId = useRef(null);
78
+ useEffect(function () {
79
+ if (activeNode) {
80
+ timeoutId.current = setTimeout(function () {
81
+ scrollIntoView(activeNode, {
82
+ scrollMode: 'if-needed',
83
+ block: 'center'
84
+ });
85
+ }, 100);
86
+ }
87
+ return function () {
88
+ if (timeoutId.current) {
89
+ clearTimeout(timeoutId.current);
90
+ }
91
+ };
92
+ }, [activeNode, activeNodeRef, virtual]);
72
93
  return /*#__PURE__*/React.createElement("ul", {
73
94
  className: cls,
74
95
  style: menuStyle,
@@ -86,13 +107,15 @@ var CascaderMenu = function CascaderMenu(_ref) {
86
107
  return /*#__PURE__*/React.createElement(MenuItem, {
87
108
  key: option.id,
88
109
  option: option,
89
- prefixCls: prefixCls
110
+ prefixCls: prefixCls,
111
+ setActiveNode: setActiveNode
90
112
  });
91
113
  }) : null);
92
114
  };
93
115
  var MenuItem = /*#__PURE__*/forwardRef(function (_ref2, ref) {
94
116
  var option = _ref2.option,
95
- prefixCls = _ref2.prefixCls;
117
+ prefixCls = _ref2.prefixCls,
118
+ setActiveNode = _ref2.setActiveNode;
96
119
  var _useCascaderContext3 = useCascaderContext(),
97
120
  flatted = _useCascaderContext3.flatted,
98
121
  disabledContext = _useCascaderContext3.disabled,
@@ -112,7 +135,11 @@ var MenuItem = /*#__PURE__*/forwardRef(function (_ref2, ref) {
112
135
  var disabled = disabledContext || option.disabled;
113
136
  var optionCls = cx(prefixCls + "-option", active && prefixCls + "-option--active", loading && prefixCls + "-option--loading", disabled && prefixCls + "-option--disabled", selected && prefixCls + "-option--selected", classNames === null || classNames === void 0 ? void 0 : classNames.option);
114
137
  return /*#__PURE__*/React.createElement("li", {
115
- ref: ref,
138
+ ref: function ref(node) {
139
+ if (node && active) {
140
+ setActiveNode === null || setActiveNode === void 0 ? void 0 : setActiveNode(node);
141
+ }
142
+ },
116
143
  key: option.id,
117
144
  role: "menu-item",
118
145
  className: prefixCls + "-item",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hi-ui/cascader",
3
- "version": "5.0.0-experimental.2",
3
+ "version": "5.0.0-experimental.3",
4
4
  "description": "A sub-package for @hi-ui/hiui.",
5
5
  "keywords": [],
6
6
  "author": "HiUI <mi-hiui@xiaomi.com>",