enr 2.0.0-alpha.3 → 2.0.0

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.
Files changed (83) hide show
  1. package/README.md +19 -17
  2. package/cjs/components/ThemeContext/index.js +0 -8
  3. package/cjs/components/image/index.js +1 -1
  4. package/cjs/components/layout/content.js +1 -1
  5. package/cjs/components/layout/footer.js +1 -1
  6. package/cjs/components/layout/header.js +1 -1
  7. package/cjs/components/layout/layout.js +6 -11
  8. package/cjs/components/ripples/LazyRippleEle.js +3 -0
  9. package/cjs/components/ripples/RipplesEle.js +3 -0
  10. package/cjs/components/ripples/useOptionUpdate.js +0 -7
  11. package/cjs/customHooks/use-xcn/core.js +2 -2
  12. package/cjs/customHooks/useAnimationFrame.js +1 -15
  13. package/cjs/customHooks/useRipples/class-build-background.js +31 -62
  14. package/cjs/customHooks/useRipples/class-element-environment.js +1 -3
  15. package/cjs/customHooks/useRipples/class-event-action.js +76 -55
  16. package/cjs/customHooks/useRipples/class-html-element-meta.js +6 -39
  17. package/cjs/customHooks/useRipples/class-param.js +27 -10
  18. package/cjs/customHooks/useRipples/class-render-action.js +9 -41
  19. package/cjs/customHooks/useRipples/class-render-data.js +3 -5
  20. package/cjs/customHooks/useRipples/class-ripple.js +43 -36
  21. package/cjs/customHooks/useRipples/class-webgl.js +4 -16
  22. package/cjs/customHooks/useRipples/index.js +1 -3
  23. package/cjs/customHooks/useRipples/use-lazy-ripple.js +0 -11
  24. package/cjs/index.js +4 -4
  25. package/cjs/shared/dist/es/log-production.js +3 -5
  26. package/es/components/ThemeContext/index.js +0 -8
  27. package/es/components/image/index.js +1 -1
  28. package/es/components/layout/content.js +1 -1
  29. package/es/components/layout/footer.js +1 -1
  30. package/es/components/layout/header.js +1 -1
  31. package/es/components/layout/layout.js +6 -11
  32. package/es/components/ripples/LazyRippleEle.js +3 -0
  33. package/es/components/ripples/RipplesEle.js +3 -0
  34. package/es/components/ripples/useOptionUpdate.js +0 -7
  35. package/es/customHooks/use-xcn/core.js +2 -2
  36. package/es/customHooks/useAnimationFrame.js +1 -15
  37. package/es/customHooks/useRipples/class-build-background.js +31 -62
  38. package/es/customHooks/useRipples/class-element-environment.js +1 -3
  39. package/es/customHooks/useRipples/class-event-action.js +76 -55
  40. package/es/customHooks/useRipples/class-html-element-meta.js +6 -39
  41. package/es/customHooks/useRipples/class-param.js +27 -10
  42. package/es/customHooks/useRipples/class-render-action.js +9 -41
  43. package/es/customHooks/useRipples/class-render-data.js +3 -5
  44. package/es/customHooks/useRipples/class-ripple.js +43 -36
  45. package/es/customHooks/useRipples/class-webgl.js +4 -16
  46. package/es/customHooks/useRipples/index.js +1 -3
  47. package/es/customHooks/useRipples/use-lazy-ripple.js +0 -11
  48. package/es/index.js +2 -2
  49. package/es/shared/dist/es/log-production.js +3 -5
  50. package/es/src/components/ThemeContext/types.d.ts +1 -1
  51. package/es/src/components/ripples/LazyRippleEle.d.ts +2 -2
  52. package/es/src/components/ripples/RipplesEle.d.ts +2 -2
  53. package/es/src/components/ripples/index.d.ts +2 -1
  54. package/es/src/components/ripples/types.d.ts +68 -0
  55. package/es/src/customHooks/use-xcn/core.d.ts +1 -1
  56. package/es/src/customHooks/use-xcn/css.d.ts +1 -1
  57. package/es/src/customHooks/useAnimationFrame.d.ts +1 -1
  58. package/es/src/customHooks/useRipples/class-build-background.d.ts +18 -7
  59. package/es/src/customHooks/useRipples/class-element-environment.d.ts +1 -1
  60. package/es/src/customHooks/useRipples/class-event-action.d.ts +18 -10
  61. package/es/src/customHooks/useRipples/class-html-element-meta.d.ts +4 -4
  62. package/es/src/customHooks/useRipples/class-param.d.ts +18 -9
  63. package/es/src/customHooks/useRipples/class-render-action.d.ts +7 -10
  64. package/es/src/customHooks/useRipples/class-render-data.d.ts +3 -2
  65. package/es/src/customHooks/useRipples/class-ripple.d.ts +13 -6
  66. package/es/src/customHooks/useRipples/class-webgl.d.ts +3 -3
  67. package/es/src/customHooks/useRipples/index.d.ts +3 -3
  68. package/es/src/customHooks/useRipples/types.d.ts +0 -51
  69. package/es/src/customHooks/useRipples/use-lazy-ripple.d.ts +1 -1
  70. package/es/src/customHooks/useRipples/{decoration-observable.d.ts → util-decoration-observable.d.ts} +4 -3
  71. package/es/src/index.client.d.ts +3 -2
  72. package/package.json +4 -3
  73. package/styles/common.css +1 -1
  74. package/styles/common.scss +25 -25
  75. package/styles/flex.scss +13 -13
  76. package/styles/header.scss +18 -18
  77. package/styles/image.scss +3 -3
  78. package/styles/input.scss +18 -18
  79. package/styles/root.scss +3 -3
  80. package/styles/text.scss +21 -21
  81. /package/cjs/shared/dist/es/node_modules/.pnpm/{@qqi_log@1.1.3 → @qqi_log@1.1.4}/node_modules/@qqi/log/es/virtual-dog.js +0 -0
  82. /package/es/shared/dist/es/node_modules/.pnpm/{@qqi_log@1.1.3 → @qqi_log@1.1.4}/node_modules/@qqi/log/es/virtual-dog.js +0 -0
  83. /package/es/src/customHooks/useRipples/{_scale.d.ts → util-scale.d.ts} +0 -0
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # enReact UI
1
+ # en React
2
2
 
3
3
  ## 一、安装
4
4
 
@@ -19,7 +19,7 @@ npm install --save earthnut
19
19
  - 在同时配置了 `imgUrl`、`background-image`、`background-color` 时仅会显示一个效果(混合效果暂时并未实现)。优先展示 `imgUrl`,然后是 `background-image`,之后是 `background-color` 。如果都未设置则会展示默认的老式地板砖背景图
20
20
  - 尽量不要是使用透明色或是当前的主背景色,否则导致涟漪的效果不明显
21
21
 
22
- 开发者提示:**切换背景最好不要通过设置**
22
+ 开发者提示:**切换背景最好不要通过设置样式,显示使用 `param.imgUrl` 效果更佳**
23
23
 
24
24
  ## 三、自定义钩子
25
25
 
@@ -27,25 +27,25 @@ npm install --save earthnut
27
27
 
28
28
  就是 `useRef` 和 `useEffect` 的简单使用。
29
29
 
30
- ```tsx
30
+ ```jsx
31
31
  import { useTimeId } from 'enr';
32
32
 
33
33
  export function Home() {
34
34
  const timeId = useTimeId();
35
35
 
36
+ const cf = () => {
37
+ timeId.current = setTimeout(
38
+ () => console.log('没有感情的按钮 A 打印了一条没有感情的消息'),
39
+ 2500,
40
+ );
41
+ };
42
+
43
+ const clearTimeoutId = () => clearTimeout(timeId.current);
44
+
36
45
  return (
37
46
  <>
38
- <button
39
- onclick={() => {
40
- timeId.current = setTimeout(
41
- () => console.log('没有感情的按钮 A 打印了一条没有感情的消息'),
42
- 2500,
43
- );
44
- }}
45
- >
46
- 没有感情的按钮 A
47
- </button>
48
- <button onclick={() => clearTimeout(timeId.current)}>没有感情的按钮 B</button>
47
+ <button onclick={cf}>没有感情的按钮 A</button>
48
+ <button onclick={clearTimeoutId}>没有感情的按钮 B</button>
49
49
  </>
50
50
  );
51
51
  }
@@ -112,15 +112,18 @@ export default defineConfig({
112
112
  });
113
113
  ```
114
114
 
115
- 为了防止意外覆盖别人的自定义 css 属性,该样式皆以 `en-` 为前缀。譬如:
115
+ 为了防止意外覆盖别人的自定义 css 属性,该样式皆以 `en-` 为前缀。但是如果使用 `en()` 函数导入,可能不需要显式的添加 `en-` 前缀。譬如:
116
116
 
117
117
  ```tsx
118
+ import { xcn } from 'xcn';
118
119
  import { _en } from 'enr';
119
120
 
120
121
  export function Home() {
121
122
  return (
122
123
  <div>
123
- <p className={_en('text-in-one-line')}>无论我字数多少,仅会会在同一行就行打印。</p>
124
+ <p className={xcn(_en('text-in-one-line'), 'en-light')}>
125
+ 无论我字数多少,仅会会在同一行就行打印。
126
+ </p>
124
127
  </div>
125
128
  );
126
129
  }
@@ -130,7 +133,6 @@ export function Home() {
130
133
 
131
134
  - `css`、`scss` 的直接导出仅是 `common.css`、`common.scss` 的别名
132
135
  - `reset.css`、`reset.scss` 不建议在非项目中使用,因为使用 `*` 修改了所有元素为 `border-box` 且定位为 `relative`。旧项目引入该文件可能会覆盖所有的已配置好的盒样式
133
- - 为了方便使用,包装了
134
136
 
135
137
  ## 文档
136
138
 
@@ -3,7 +3,6 @@
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
  var react = require('react');
6
- var logProduction = require('../../shared/dist/es/log-production.js');
7
6
  var storageStore = require('../../shared/dist/es/storage-store.js');
8
7
  var sys = require('../../shared/dist/es/sys.js');
9
8
  var cookie = require('../../shared/dist/es/cookie.js');
@@ -64,10 +63,8 @@ function ThemeColorModeProvider({ children, initialTheme }) {
64
63
  * @param newColorMode
65
64
  */
66
65
  const autoChange = (newColorMode) => {
67
- logProduction.dog.type = true;
68
66
  // 这是当前的
69
67
  const _auto = !storageStore.storageStore.theme;
70
- logProduction.dog('手动切换当前的模式', _auto);
71
68
  if (_auto) {
72
69
  cookie.manageCookie.deleteItem('theme');
73
70
  storageStore.storageStore.theme = '';
@@ -79,17 +76,13 @@ function ThemeColorModeProvider({ children, initialTheme }) {
79
76
  }); // 将值同步到 cookie ,以防止水合有误
80
77
  window.document.documentElement.setAttribute('data-theme', newColorMode);
81
78
  setAuto(_auto);
82
- logProduction.dog.type = true;
83
79
  };
84
80
  /**
85
81
  * 设置指定的色值
86
82
  * @param newColorMode
87
83
  */
88
84
  const setSpecifiedColorMode = (newColorMode) => {
89
- logProduction.dog.type = true;
90
- logProduction.dog('执行设置当前的主题样式模式', newColorMode);
91
85
  if (['light', 'dark'].indexOf(newColorMode) < 0) {
92
- logProduction.dog('新设置的模式不正确不允许设置');
93
86
  return colorMode;
94
87
  }
95
88
  storageStore.storageStore.theme = newColorMode; // 将新的主题色值类型保存到本地
@@ -99,7 +92,6 @@ function ThemeColorModeProvider({ children, initialTheme }) {
99
92
  // 手动触发副作用
100
93
  else
101
94
  autoChange(colorMode);
102
- logProduction.dog.type = true;
103
95
  return newColorMode;
104
96
  };
105
97
  /** 移除指定,设置为跟随系统 */
@@ -23,7 +23,7 @@ const Content = styled.styled.img `
23
23
  const Image = react.memo(({ loadingSrc = _default.default, ...props }) => {
24
24
  const { resultSrc, loadComplete } = useSrcChange.useSrcChange(props.src ?? loadingSrc);
25
25
  const { className, ..._props } = props;
26
- return (jsxRuntime.jsx(Content, { src: resultSrc || loadingSrc, className: xcn.xcn(loadComplete === 1 && 'enr-loading', className), ..._props }));
26
+ return (jsxRuntime.jsx(Content, { src: resultSrc || loadingSrc, className: xcn.xcn(loadComplete === 1 && 'en-loading', className), ..._props }));
27
27
  });
28
28
  Image.displayName = 'enr-image';
29
29
 
@@ -10,7 +10,7 @@ var index = require('../shared/EnLayoutContent/index.js');
10
10
  */
11
11
  const InternalValueC = props => {
12
12
  const { className, ..._props } = props;
13
- return (jsxRuntime.jsx(index.LayoutContentContainer, { className: xcn.xcn('enr-layout-main', className), "data-enr-ui": "layout-content", ..._props }));
13
+ return (jsxRuntime.jsx(index.LayoutContentContainer, { className: xcn.xcn('en-layout-main', className), "data-enr-ui": "layout-content", ..._props }));
14
14
  };
15
15
  InternalValueC.displayName = 'LayoutContent';
16
16
 
@@ -14,7 +14,7 @@ var index = require('../shared/EnLayoutContent/index.js');
14
14
  */
15
15
  const InternalValueF = ({ height: _height, ...props }) => {
16
16
  const { className, ..._props } = props;
17
- return (jsxRuntime.jsx(index.LayoutFooterContent, { className: xcn.xcn('enr-layout-footer', className), "data-enr-ui": "layout-footer", ..._props }));
17
+ return (jsxRuntime.jsx(index.LayoutFooterContent, { className: xcn.xcn('en-layout-footer', className), "data-enr-ui": "layout-footer", ..._props }));
18
18
  };
19
19
  InternalValueF.displayName = 'LayoutFooter';
20
20
 
@@ -14,7 +14,7 @@ var index = require('../shared/EnLayoutContent/index.js');
14
14
  */
15
15
  const InternalValueH = ({ height: _height, noSticky: _noSticky, ...props }) => {
16
16
  const { className, ..._props } = props;
17
- return (jsxRuntime.jsx(index.LayoutHeaderContainer, { className: xcn.xcn(['enr-layout-header'], className), "data-enr-ui": "layout-header", ..._props }));
17
+ return (jsxRuntime.jsx(index.LayoutHeaderContainer, { className: xcn.xcn(['en-layout-header'], className), "data-enr-ui": "layout-header", ..._props }));
18
18
  };
19
19
  InternalValueH.displayName = 'LayoutHeader';
20
20
 
@@ -4,7 +4,6 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var aTypeOfJs = require('a-type-of-js');
5
5
  var react = require('react');
6
6
  var xcn = require('xcn');
7
- var logProduction = require('../../shared/dist/es/log-production.js');
8
7
  var index = require('../shared/EnLayoutContent/index.js');
9
8
  var content = require('./content.js');
10
9
  var footer = require('./footer.js');
@@ -66,12 +65,9 @@ function isDecimal(value) {
66
65
  const Layout = ({ width = '100%', height = '100%', ...props }) => {
67
66
  const { style, className, children: _children, ..._props } = props;
68
67
  let children = _children;
69
- logProduction.dog.type = false;
70
68
  /** TODO : React 不推荐使用 Children ,尽然当前版本依旧支持 */
71
69
  /** 子组件的个数 */
72
70
  const childCount = react.Children.count(children);
73
- /** 头部 header 是否粘连影响下的样式 */
74
- logProduction.dog('子元素个数', childCount);
75
71
  /** 头部 header 组件 */
76
72
  let Header,
77
73
  /** 当前的样式 */
@@ -97,15 +93,15 @@ const Layout = ({ width = '100%', height = '100%', ...props }) => {
97
93
  /** 页脚的高度,缺省值为 `2rem` */
98
94
  footerHeight = '2rem';
99
95
  /** 头字符串样式类 */
100
- const $header = 'enr-layout-header',
96
+ const $header = 'en-layout-header',
101
97
  /** 内容字符串样式类 */
102
- $content = 'enr-layout-content',
98
+ $content = 'en-layout-content',
103
99
  /** 主区字符串样式类 */
104
- $main = 'enr-layout-main',
100
+ $main = 'en-layout-main',
105
101
  /** 侧边字符串样式类 */
106
- $sidebar = 'enr-layout-sidebar',
102
+ $sidebar = 'en-layout-sidebar',
107
103
  /** 页脚字符串样式类 */
108
- $footer = 'enr-layout-footer';
104
+ $footer = 'en-layout-footer';
109
105
  /** 由 Fragment 包裹的子元素完成解包 */
110
106
  if (childCount === 1) {
111
107
  /** TODO : React 不推荐使用 Children ,尽然当前版本依旧支持 */
@@ -178,7 +174,7 @@ const Layout = ({ width = '100%', height = '100%', ...props }) => {
178
174
  else if (!hasContent && child.type === Layout) {
179
175
  /** 组件 */
180
176
  const element = child;
181
- Content = (jsxRuntime.jsx(index.LayoutContentWrapper, { "data-enr-ui": "layout-content", className: xcn.xcn($main, 'enr-layout-main'), children: element }));
177
+ Content = (jsxRuntime.jsx(index.LayoutContentWrapper, { "data-enr-ui": "layout-content", className: xcn.xcn($main, 'en-layout-main'), children: element }));
182
178
  hasContent = true;
183
179
  }
184
180
  else if (!hasFooter && child.type === footer.InternalValueF) {
@@ -225,7 +221,6 @@ const Layout = ({ width = '100%', height = '100%', ...props }) => {
225
221
  const shouldUseOnlySideLayout = /-only-side$/.test(layoutType);
226
222
  /** 确定布局结构 */
227
223
  const shouldUseSideFullLayout = /^side.*full/.test(layoutType);
228
- logProduction.dog.type = true;
229
224
  return (jsxRuntime.jsx(index.EnLayoutContent, { "$headerNoSticky": headerNoSticky, "$layoutType": layoutType, "$header": $header, "$sidebar": $sidebar, "$main": $main, "$content": $content, "$footer": $footer, className: xcn.xcn(className), style: {
230
225
  '--layout-self-width': utils.getValue(width),
231
226
  '--layout-self-height': utils.getValue(height),
@@ -57,6 +57,9 @@ const LazyBackgroundRipple = ({ option, ...props }) => {
57
57
  pause() {
58
58
  ripples.current?.pause();
59
59
  },
60
+ play() {
61
+ ripples.current?.play();
62
+ },
60
63
  set(options) {
61
64
  if (aTypeOfJs.isUndefined(options))
62
65
  return;
@@ -54,6 +54,9 @@ const BackgroundRipple = ({ option, ...props }) => {
54
54
  pause() {
55
55
  ripplesRef.current?.pause();
56
56
  },
57
+ play() {
58
+ ripplesRef.current?.play();
59
+ },
57
60
  set(options) {
58
61
  if (aTypeOfJs.isUndefined(options))
59
62
  return;
@@ -2,7 +2,6 @@
2
2
 
3
3
  var aTypeOfJs = require('a-type-of-js');
4
4
  var react = require('react');
5
- var logProduction = require('../../shared/dist/es/log-production.js');
6
5
 
7
6
  /**
8
7
  * 更新参数数据
@@ -10,13 +9,10 @@ var logProduction = require('../../shared/dist/es/log-production.js');
10
9
  * @param option
11
10
  */
12
11
  function useOptionUpdate(ripplesRef, option) {
13
- logProduction.dog('执行打印', option);
14
12
  const oldOption = react.useRef({ ...option });
15
13
  /** 监听数据变化并给值 */
16
14
  react.useEffect(() => {
17
- logProduction.dog.type = false;
18
15
  if (!option || !ripplesRef.current) {
19
- logProduction.dog.type = true;
20
16
  return;
21
17
  }
22
18
  Object.keys(ripplesRef.current.defaults).forEach(e => {
@@ -25,15 +21,12 @@ function useOptionUpdate(ripplesRef, option) {
25
21
  /** 测试值是否相等 */
26
22
  const checkArr = ((v, ov) => (aTypeOfJs.isArray(v) && aTypeOfJs.isArray(ov) && (v.length !== ov.length || v.some((k, i) => k !== ov[i]))) ||
27
23
  ((!aTypeOfJs.isArray(v) || !aTypeOfJs.isArray(ov)) && v !== ov))(value, oldOption.current[e]);
28
- logProduction.dog('我在这里', value, oldOption.current[e]);
29
24
  if (ripplesRef.current && checkArr) {
30
- logProduction.dog('设置值', e, value);
31
25
  // 使用转化后的值
32
26
  oldOption.current[e] = aTypeOfJs.isArray(value) ? [...value] : option[e];
33
27
  ripplesRef.current.set(e, value);
34
28
  }
35
29
  });
36
- logProduction.dog.type = true;
37
30
  }, [option]);
38
31
  }
39
32
 
@@ -12,14 +12,14 @@ var xcn = require('xcn');
12
12
  * @copyright 2026 ©️ MrMudBean
13
13
  * @since 2026-01-28 13:03
14
14
  * @version 2.0.0-alpha.0
15
- * @lastModified 2026-01-28 16:03
15
+ * @lastModified 2026-02-02 11:38
16
16
  */
17
17
  /**
18
18
  * 在 xcn 中使用 enr 样式类
19
19
  * @param classNameList
20
20
  */
21
21
  function _en(...classNameList) {
22
- return xcn.xcn(...classNameList.map(e => 'enr-'.concat(e)));
22
+ return xcn.xcn(...classNameList.map(e => 'en-'.concat(e)));
23
23
  }
24
24
 
25
25
  exports._en = _en;
@@ -3,7 +3,6 @@
3
3
 
4
4
  var aTypeOfJs = require('a-type-of-js');
5
5
  var react = require('react');
6
- var logProduction = require('../shared/dist/es/log-production.js');
7
6
 
8
7
  /**
9
8
  * @module @enr/useAnimationFrame
@@ -14,7 +13,7 @@ var logProduction = require('../shared/dist/es/log-production.js');
14
13
  * @copyright 2026 ©️ MrMudBean
15
14
  * @since 2025-01-07 11:23
16
15
  * @version 2.0.0-alpha.0
17
- * @lastModified 2026-01-25 19:11
16
+ * @lastModified 2026-02-01 06:12
18
17
  */
19
18
  /**
20
19
  *
@@ -85,13 +84,10 @@ function useAnimationFrame(callback, option = false) {
85
84
  isUnmounted: true,
86
85
  result: {
87
86
  cancel() {
88
- logProduction.dog.type = false;
89
87
  const { id } = animationFrame.current;
90
- logProduction.dog('执行取消');
91
88
  if (id)
92
89
  window.cancelAnimationFrame(id);
93
90
  animationFrame.current.result.canceled = true;
94
- logProduction.dog.type = true;
95
91
  },
96
92
  canceled: false,
97
93
  render() {
@@ -117,38 +113,28 @@ function useAnimationFrame(callback, option = false) {
117
113
  }, [callback]);
118
114
  // 首次执行
119
115
  if (current.immediately && !current.noun && current.result.canceled) {
120
- logProduction.dog('重复执行');
121
116
  current.noun = true;
122
117
  current.result.render();
123
118
  }
124
119
  react.useEffect(() => {
125
- logProduction.dog.type = false;
126
- logProduction.dog('回调更替', '此时的是否为第一次执行状态为', current.firstRunEffect, '当前取消执行状态', current.result.canceled);
127
120
  /// 非仅执行一次再次这里需要执行
128
121
  if (!current.once) {
129
122
  if (current.firstRunEffect) {
130
123
  current.result.render();
131
124
  current.firstRunEffect = false; // 标记为不允许执行
132
- logProduction.dog.type = false;
133
- logProduction.dog('第一次执行', ',执行后状态', current.result.canceled);
134
125
  }
135
126
  else if (!current.firstRunEffect && !current.result.canceled) {
136
127
  /** 非第一次执行 */
137
128
  current.result.render();
138
- logProduction.dog.type = false;
139
- logProduction.dog('非首次执行', ',执行后状态', current.result.canceled);
140
129
  }
141
130
  }
142
- logProduction.dog.type = true;
143
131
  }, [callback]);
144
132
  /// 在组件退出时保证能正确的退出
145
133
  react.useEffect(() => {
146
- logProduction.dog('执行');
147
134
  current.isUnmounted = false;
148
135
  return () => {
149
136
  current.isUnmounted = true;
150
137
  setTimeout(() => {
151
- logProduction.dog('退出执行取消');
152
138
  if (current.isUnmounted)
153
139
  current.result.cancel();
154
140
  }, 0);