plain-design 1.0.0-beta.107 → 1.0.0-beta.109

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. package/dist/plain-design.commonjs.min.js +2 -2
  2. package/dist/plain-design.min.css +1 -1
  3. package/dist/plain-design.min.js +2 -2
  4. package/dist/report.html +2 -2
  5. package/package.json +3 -3
  6. package/src/packages/components/AddressCascade/createAddressCascade.multiple.tsx +5 -6
  7. package/src/packages/components/AddressCascade/createAddressCascade.single.tsx +6 -7
  8. package/src/packages/components/Application/utils/application.utils.ts +2 -3
  9. package/src/packages/components/Badge/badge.scss +4 -0
  10. package/src/packages/components/Cascade/createMultipleCascadeRender.tsx +3 -4
  11. package/src/packages/components/Cascade/createSingleCascadeRender.tsx +4 -5
  12. package/src/packages/components/DatePicker/createDateRender.multiple.tsx +5 -5
  13. package/src/packages/components/DatePicker/createDateRender.single.tsx +6 -5
  14. package/src/packages/components/DatePicker/index.tsx +2 -0
  15. package/src/packages/components/DatePicker/useRangeDateRender.tsx +6 -6
  16. package/src/packages/components/Form/validate/useFormItemValidation.tsx +25 -27
  17. package/src/packages/components/Input/useMultipleInput.tsx +4 -3
  18. package/src/packages/components/Input/useSuggestionInput.tsx +3 -4
  19. package/src/packages/components/Input/useTextareaInput.tsx +3 -3
  20. package/src/packages/components/Input/uses/useInputEnterHandler.tsx +10 -6
  21. package/src/packages/components/Object/createObjectRender.multiple.tsx +7 -7
  22. package/src/packages/components/Object/createObjectRender.single.tsx +10 -10
  23. package/src/packages/components/PageThemeUtils/index.tsx +2 -2
  24. package/src/packages/components/Select/createMultipleSelectRender.tsx +10 -6
  25. package/src/packages/components/Select/createPublicSelectRender.tsx +8 -4
  26. package/src/packages/components/Select/createSingleSelectRender.tsx +11 -7
  27. package/src/packages/components/Slider/useSlider.range.tsx +12 -9
  28. package/src/packages/components/Slider/useSlider.single.tsx +7 -8
  29. package/src/packages/components/Table/standard/PlcCheck/PlcCheck.hooks.tsx +2 -2
  30. package/src/packages/components/Table/standard/PlcCheck/PlcCheck.multiple.tsx +4 -5
  31. package/src/packages/components/Table/standard/PlcCheck/PlcCheck.single.tsx +3 -4
  32. package/src/packages/components/TimePicker/createSingleTimeRender.tsx +4 -5
  33. package/src/packages/components/TimePicker/useRangeTimeRender.tsx +6 -6
  34. package/src/packages/components/usePopup/PopupItem.tsx +3 -3
  35. package/src/packages/components/usePopup/trigger/useReferenceTrigger.tsx +51 -45
  36. package/src/packages/components/usePopupEditor/index.tsx +6 -9
  37. package/src/packages/components/useTooltip/index.tsx +5 -6
  38. package/src/packages/uses/useDragHorizontalScroll.ts +4 -5
  39. package/src/packages/uses/useFocusHandler.ts +25 -12
  40. package/src/packages/uses/useMultipleModel.tsx +3 -1
@@ -1,7 +1,6 @@
1
1
  import {iObjectCompositionParam, iObjectSelectOption} from "./object.utils";
2
- import {createEffects} from "@peryl/utils/createEffects";
3
2
  import {Select} from "../Select";
4
- import {computed, reactive, useRefs, watch} from "@peryl/react-compose";
3
+ import {createEffectsOfReaction, reactive, useRefs} from "@peryl/react-compose";
5
4
  import {convertRowToSelected, convertSelectedToRow} from "../$object/object.conver";
6
5
  import {PlainObject} from "@peryl/utils/event";
7
6
  import {SelectOption} from "../SelectOption";
@@ -15,7 +14,7 @@ import i18n from "../i18n";
15
14
  export function createObjectRenderSingle(
16
15
  { props, event, hooks, classes, inputSlots, object, loading, loadData, editComputed }: iObjectCompositionParam
17
16
  ) {
18
- const { effects } = createEffects();
17
+ const { effects, effectComputed, effectWatch } = createEffectsOfReaction();
19
18
 
20
19
  const { refs, onRef } = useRefs({ select: Select });
21
20
 
@@ -82,7 +81,7 @@ export function createObjectRenderSingle(
82
81
  hooks.onInputChange.exec(val);
83
82
  },
84
83
  };
85
- const inputAttrs = computed(() => {
84
+ const inputAttrs = effectComputed(() => {
86
85
  /*当前选中数据的显示值*/
87
86
  const label = props.modelValue;
88
87
  /*空值占位符,没有focus的时候就显示真实的placeholder,否则显示当前匹配option的label*/
@@ -98,6 +97,7 @@ export function createObjectRenderSingle(
98
97
  clearHandler: publicHandler.onClear
99
98
  });
100
99
  });
100
+
101
101
  return { state, inputAttrs };
102
102
  })();
103
103
 
@@ -109,7 +109,7 @@ export function createObjectRenderSingle(
109
109
  const selectHandler = (() => {
110
110
 
111
111
  /*将row转化为selected对象,用来辅助getSelectValue实现功能*/
112
- const row2selected = computed(() => {return !props.row || !props.modelValue ? null : convertRowToSelected(props.row, props.map);});
112
+ const row2selected = effectComputed(() => {return !props.row || !props.modelValue ? null : convertRowToSelected(props.row, props.map);});
113
113
 
114
114
  /*获取当前select的modelValue以及要渲染的select options数组*/
115
115
  const getSelectValue = (): { value: any, option: null | iObjectSelectOption[] } => {
@@ -124,9 +124,7 @@ export function createObjectRenderSingle(
124
124
  const state = reactive(getSelectValue());
125
125
 
126
126
  /*当绑定值变化时,重新计算select的modelValue以及option数组*/
127
- effects.push(
128
- watch(() => props.modelValue, () => {Object.assign(state, getSelectValue());})
129
- );
127
+ effectWatch(() => props.modelValue, () => {Object.assign(state, getSelectValue());});
130
128
 
131
129
  /**
132
130
  * 根据搜索关键词加载数据
@@ -147,16 +145,17 @@ export function createObjectRenderSingle(
147
145
  onClose: () => {Object.assign(state, getSelectValue());},
148
146
  };
149
147
  /*监听popper的部分参数*/
150
- const popperAttrs = computed(() => ({
148
+ const popperAttrs = effectComputed(() => ({
151
149
  ...handler,
152
150
  }));
151
+
153
152
  /*监听select的选中选项动作*/
154
153
  const onSelectChange = (code: string | null) => {
155
154
  const selected = !code ? null : state.option?.find(i => i.val === code)?.data;
156
155
  publicHandler.onSelect(selected);
157
156
  };
158
157
  /*给select传递的属性*/
159
- const selectAttrs = computed(() => ({
158
+ const selectAttrs = effectComputed(() => ({
160
159
  onUpdateModelValue: onSelectChange,
161
160
  loading: loading.value,
162
161
  class: classes.value,
@@ -169,6 +168,7 @@ export function createObjectRenderSingle(
169
168
  /*没有关键词的时候,提示输入关键词,已经有关键词并且没有选项的情况下提示placeholder*/
170
169
  noDataLabel: !inputHandler.state.inputValue && state.option == null ? (props.searchPlaceholder || i18n.$it('table.pleaseEnterSearchKey').d('请输入搜索关键词')) : undefined
171
170
  }));
171
+
172
172
  return { state, popperAttrs, onSelectChange, selectAttrs };
173
173
  })();
174
174
 
@@ -1,4 +1,4 @@
1
- import {computed, getComponentCls, reactive} from "@peryl/react-compose";
1
+ import {getComponentCls, globalComputed, reactive} from "@peryl/react-compose";
2
2
  import {createCache} from "../../utils/createCache";
3
3
  import {InputMode, ThemeMode, ThemeShape, ThemeSize} from "../../uses/useStyle";
4
4
  import {DeepPartial} from "../../utils/type";
@@ -27,7 +27,7 @@ export const PageThemeUtils = (() => {
27
27
  zoom: zoomCache.get(),
28
28
  });
29
29
 
30
- const configuration = computed((): DeepPartial<iApplicationConfiguration> => {
30
+ const configuration = globalComputed((): DeepPartial<iApplicationConfiguration> => {
31
31
  const config: DeepPartial<iApplicationConfiguration> = {};
32
32
  if (!config.theme) {config.theme = {};}
33
33
  if (!config.theme.base) {config.theme.base = {};}
@@ -8,6 +8,7 @@ import {useMultipleModel} from "../../uses/useMultipleModel";
8
8
  import i18n from "../i18n";
9
9
  import {Checkbox} from "../Checkbox";
10
10
  import {CheckboxStatus} from "../../utils/constant";
11
+ import {createEffects} from "@peryl/utils/createEffects";
11
12
 
12
13
  export function createMultipleSelectRender(params: iSelectCompositionParams) {
13
14
 
@@ -32,7 +33,9 @@ export function createMultipleSelectRender(params: iSelectCompositionParams) {
32
33
  */
33
34
  const scrollEnd = () => {delay().then(() => inputScrollEnd(() => selector.refs.input?.refs.el));};
34
35
 
35
- const model = useMultipleModel<any[] | null | undefined>(() => props.modelValue as any, emit.onUpdateModelValue, props);
36
+ const { effects } = createEffects();
37
+
38
+ const model = useMultipleModel<any[] | null | undefined>(() => props.modelValue as any, emit.onUpdateModelValue, props, undefined, effects);
36
39
 
37
40
  const selector = createPublicSelectRender(params, {
38
41
  isActivated,
@@ -97,6 +100,7 @@ export function createMultipleSelectRender(params: iSelectCompositionParams) {
97
100
  </>
98
101
  );
99
102
  },
103
+ effects,
100
104
  });
101
105
 
102
106
  const handler = {
@@ -181,7 +185,7 @@ export function createMultipleSelectRender(params: iSelectCompositionParams) {
181
185
  * @author 韦胜健
182
186
  * @date 2022/8/16 9:16
183
187
  */
184
- selector.effects.push(hooks.renderInput.use(() => {
188
+ effects.push(hooks.renderInput.use(() => {
185
189
 
186
190
  /*每次render input的时候解析内容*/
187
191
  selector.optionListHandler.decode();
@@ -224,21 +228,21 @@ export function createMultipleSelectRender(params: iSelectCompositionParams) {
224
228
  * @author 韦胜健
225
229
  * @date 2022/8/16 9:17
226
230
  */
227
- selector.effects.push(hooks.onPopperClose.use(() => {state.multipleText = null;}));
231
+ effects.push(hooks.onPopperClose.use(() => {state.multipleText = null;}));
228
232
 
229
233
  /**
230
234
  * input多值输入文本的时候保留这个文本
231
235
  * @author 韦胜健
232
236
  * @date 2022/8/16 9:17
233
237
  */
234
- selector.effects.push(hooks.onInputTextChange.use((val) => {state.multipleText = val;}));
238
+ effects.push(hooks.onInputTextChange.use((val) => {state.multipleText = val;}));
235
239
 
236
240
  /**
237
241
  * input清空动作
238
242
  * @author 韦胜健
239
243
  * @date 2022/8/16 9:17
240
244
  */
241
- selector.effects.push(hooks.onInputClear.use(() => {state.multipleText = null;}));
245
+ effects.push(hooks.onInputClear.use(() => {state.multipleText = null;}));
242
246
 
243
- return () => selector.effects.clear();
247
+ return effects.clear;
244
248
  }
@@ -10,7 +10,7 @@ import {VirtualList} from "../VirtualList";
10
10
  import {delay} from "@peryl/utils/delay";
11
11
  import {handleKeyboard} from "@peryl/utils/keyboard";
12
12
  import {useRenderReference} from "../../uses/useRenderReference";
13
- import {createEffects} from "@peryl/utils/createEffects";
13
+ import {iEffects} from "@peryl/utils/createEffects";
14
14
  import {createPopupEditor} from "../usePopupEditor";
15
15
 
16
16
  export function createPublicSelectRender(
@@ -33,6 +33,7 @@ export function createPublicSelectRender(
33
33
  defaultCurrent,
34
34
  multiple,
35
35
  processRenderPanel,
36
+ effects,
36
37
  }: {
37
38
  /**
38
39
  * 判断选项是否已经选中,用来provide给option组件判断自身是否已经选中
@@ -88,9 +89,13 @@ export function createPublicSelectRender(
88
89
  * @date 2022/8/16 8:40
89
90
  */
90
91
  processRenderPanel?: (defaultRender: () => RenderNode) => RenderNode,
92
+ /**
93
+ * 副作用收集函数
94
+ * @author 韦胜健
95
+ * @date 2024.9.3 22:45
96
+ */
97
+ effects: iEffects,
91
98
  }) {
92
- /*记录副作用函数*/
93
- const { effects } = createEffects();
94
99
 
95
100
  const { refs, onRef } = useRefs({
96
101
  /*用来创建popper的reference对象*/
@@ -391,7 +396,6 @@ export function createPublicSelectRender(
391
396
  };
392
397
 
393
398
  return {
394
- effects,
395
399
  refs,
396
400
  onRef,
397
401
  state,
@@ -3,6 +3,7 @@ import {Input} from "../Input";
3
3
  import {createPublicSelectRender} from "./createPublicSelectRender";
4
4
  import {reactive, useModel} from "@peryl/react-compose";
5
5
  import {delay} from "@peryl/utils/delay";
6
+ import {createEffects} from "@peryl/utils/createEffects";
6
7
 
7
8
  /**
8
9
  * 单选组合函数,支持普通单选以及虚拟列表的方式
@@ -18,15 +19,18 @@ export function createSingleSelectRender(params: iSelectCompositionParams) {
18
19
  inputValue: null as null | string
19
20
  });
20
21
 
22
+ const { effects } = createEffects();
23
+
21
24
  const model = useModel(() => props.modelValue, params.emit.onUpdateModelValue, {
22
25
  onChange: async () => {
23
26
  await delay();
24
27
  state.inputValue = selector.optionListHandler.getMatchLabel();
25
28
  }
26
- });
29
+ }, effects);
27
30
 
28
31
  const selector = createPublicSelectRender(params, {
29
32
  isActivated: props => isMatch({ option: props.val, value: model.value }),
33
+ effects,
30
34
  model,
31
35
  ...(() => {
32
36
  /**
@@ -69,7 +73,7 @@ export function createSingleSelectRender(params: iSelectCompositionParams) {
69
73
  defaultCurrent: undefined,
70
74
  });
71
75
 
72
- selector.effects.push(hooks.renderInput.use(() => {
76
+ effects.push(hooks.renderInput.use(() => {
73
77
 
74
78
  selector.optionListHandler.decode();
75
79
  /*显示文本*/
@@ -106,24 +110,24 @@ export function createSingleSelectRender(params: iSelectCompositionParams) {
106
110
  });
107
111
  }));
108
112
 
109
- selector.effects.push(hooks.onPopperClose.use(() => {
113
+ effects.push(hooks.onPopperClose.use(() => {
110
114
  /*重置input绑定值,防止输入一半取消选择时显示不正确的文本*/
111
115
  state.inputValue = selector.optionListHandler.getMatchLabel();
112
116
  }));
113
117
 
114
- selector.effects.push(hooks.onPopperShow.use(() => {
118
+ effects.push(hooks.onPopperShow.use(() => {
115
119
  state.inputValue = null;
116
120
  }));
117
121
 
118
- selector.effects.push(hooks.onInputTextChange.use((val) => {
122
+ effects.push(hooks.onInputTextChange.use((val) => {
119
123
  /*应用绑定值*/
120
124
  state.inputValue = val;
121
125
  }));
122
126
 
123
- selector.effects.push(hooks.onInputClear.use(() => {
127
+ effects.push(hooks.onInputClear.use(() => {
124
128
  /*点击clear的时候,应用输入绑定值*/
125
129
  state.inputValue = null;
126
130
  }));
127
131
 
128
- return () => selector.effects.clear();
132
+ return effects.clear;
129
133
  }
@@ -1,6 +1,5 @@
1
1
  import {iSliderPublicParams} from "./slider.utils";
2
- import {createEffects} from "@peryl/utils/createEffects";
3
- import {computed, useModel, useStyles} from "@peryl/react-compose";
2
+ import {createEffectsOfReaction, useModel, useStyles} from "@peryl/react-compose";
4
3
  import {unit} from "@peryl/utils/unit";
5
4
  import {useSliderDotDraggier} from "./useSliderDotDragier";
6
5
 
@@ -14,7 +13,7 @@ export function useSliderRange(
14
13
  utils,
15
14
  }: iSliderPublicParams) {
16
15
 
17
- const { effects } = createEffects();
16
+ const { effects, effectComputed } = createEffectsOfReaction();
18
17
 
19
18
  /**
20
19
  * 创建指示器管理对象
@@ -22,14 +21,16 @@ export function useSliderRange(
22
21
  * @date 2022.12.10 15:43
23
22
  */
24
23
  function createDotManager(type: 'start' | 'end') {
25
- const model = type === "start" ? useModel(() => props.start, event.emit.onUpdateStart, { autoEmit: props.emitImmediate }) :
26
- useModel(() => props.end, event.emit.onUpdateEnd, { autoEmit: props.emitImmediate });
24
+ const model = type === "start" ?
25
+ useModel(() => props.start, event.emit.onUpdateStart, { autoEmit: props.emitImmediate }, effects) :
26
+ useModel(() => props.end, event.emit.onUpdateEnd, { autoEmit: props.emitImmediate }, effects);
27
27
  /**
28
28
  * 当前指示器位置百分比
29
29
  * @author 韦胜健
30
30
  * @date 2022.12.10 15:44
31
31
  */
32
- const percent = computed(() => Number(((model.value == null ? 0 : Number(model.value)) / props.total).toFixed(2)));
32
+ const percent = effectComputed(() => Number(((model.value == null ? 0 : Number(model.value)) / props.total).toFixed(2)));
33
+
33
34
  /**
34
35
  * 指示器行内样式
35
36
  * @author 韦胜健
@@ -51,16 +52,18 @@ export function useSliderRange(
51
52
  } else {
52
53
  styles.transform = `translateY(${length}px)`;
53
54
  }
54
- });
55
+ }, effects);
56
+
55
57
  /**
56
58
  * 指示器tooltip显示文本
57
59
  * @author 韦胜健
58
60
  * @date 2022.12.10 15:44
59
61
  */
60
- const tooltipLabel = computed(() => {
62
+ const tooltipLabel = effectComputed(() => {
61
63
  let ret = model.value;
62
64
  return !!props.tooltipFormatter ? props.tooltipFormatter(ret || 0) : ret;
63
65
  });
66
+
64
67
  /**
65
68
  * 指示器拖拽处理对象
66
69
  * @author 韦胜健
@@ -117,7 +120,7 @@ export function useSliderRange(
117
120
  styles.transform = `translateY(${start.percent.value * totalLength.value}px) scaleY(${percentValue})`;
118
121
  styles.transformOrigin = props.alignEnd ? 'bottom' : 'top';
119
122
  }
120
- });
123
+ }, effects);
121
124
 
122
125
  /**
123
126
  * 拖拽的时候一直显示tooltip
@@ -1,6 +1,5 @@
1
1
  import {iSliderPublicParams} from "./slider.utils";
2
- import {createEffects} from "@peryl/utils/createEffects";
3
- import {computed, useModel, useStyles} from "@peryl/react-compose";
2
+ import {createEffectsOfReaction, useModel, useStyles} from "@peryl/react-compose";
4
3
  import {unit} from "@peryl/utils/unit";
5
4
  import {useSliderDotDraggier} from "./useSliderDotDragier";
6
5
 
@@ -14,16 +13,16 @@ export function useSliderSingle(
14
13
  editComputed,
15
14
  }: iSliderPublicParams) {
16
15
 
17
- const model = useModel(() => props.modelValue, event.emit.onUpdateModelValue, { autoEmit: props.emitImmediate });
16
+ const { effects, effectComputed } = createEffectsOfReaction();
18
17
 
19
- const { effects } = createEffects();
18
+ const model = useModel(() => props.modelValue, event.emit.onUpdateModelValue, { autoEmit: props.emitImmediate }, effects);
20
19
 
21
20
  /**
22
21
  * 当前百分比
23
22
  * @author 韦胜健
24
23
  * @date 2022.12.10 15:42
25
24
  */
26
- const percent = computed(() => Number(((model.value == null ? 0 : Number(model.value)) / props.total).toFixed(2)));
25
+ const percent = effectComputed(() => Number(((model.value == null ? 0 : Number(model.value)) / props.total).toFixed(2)));
27
26
 
28
27
  /**
29
28
  * 进度条行内样式
@@ -44,7 +43,7 @@ export function useSliderSingle(
44
43
  styles.transform = `scaleY(${percentValue})`;
45
44
  styles.transformOrigin = props.alignEnd ? 'bottom' : 'top';
46
45
  }
47
- });
46
+ }, effects);
48
47
 
49
48
  /**
50
49
  * 指示器行内样式
@@ -60,7 +59,7 @@ export function useSliderSingle(
60
59
  } else {
61
60
  styles.transform = `translateY(${length}px)`;
62
61
  }
63
- });
62
+ }, effects);
64
63
 
65
64
  /**
66
65
  * 指示器拖拽行为
@@ -83,7 +82,7 @@ export function useSliderSingle(
83
82
  * @author 韦胜健
84
83
  * @date 2022.12.10 15:43
85
84
  */
86
- const tooltipLabel = computed(() => {
85
+ const tooltipLabel = effectComputed(() => {
87
86
  let ret = model.value;
88
87
  return !!props.tooltipFormatter ? props.tooltipFormatter(ret || 0) : ret;
89
88
  });
@@ -3,8 +3,8 @@ import {iTableCellRenderScope, iTableRowRenderScope} from "../../table/utils/tab
3
3
 
4
4
  export function createPlcCheckHooks() {
5
5
  return {
6
- onRenderNormal: createSyncHooks<(data: { scope: iTableCellRenderScope, content: RenderNode }) => void>(),
7
- onRenderHead: createSyncHooks<(renderNode: RenderNode) => void>(),
6
+ onRenderNormal: createSyncHooks<(data: { scope: iTableCellRenderScope, content: RenderNode }) => void>(true),
7
+ onRenderHead: createSyncHooks<(renderNode: RenderNode) => void>(true),
8
8
  onClickRow: createHooks<(data: { rowRenderScope: iTableRowRenderScope }) => void>(),
9
9
 
10
10
  onTriggerCheckAll: createHooks(),
@@ -1,12 +1,11 @@
1
1
  import {iPlcCheckEventType, iPlcCheckPropsType} from "./PlcCheck.utils";
2
- import {computed, reactive, toRaw, useModel} from "@peryl/react-compose";
2
+ import {createEffectsOfReaction, reactive, toRaw, useModel} from "@peryl/react-compose";
3
3
  import {toArray} from "@peryl/utils/toArray";
4
4
  import {PlainObject} from "@peryl/utils/event";
5
5
  import {iTableRowRenderScope} from "../../table/utils/table.utils";
6
6
  import {CheckboxStatus} from "../../../../utils/constant";
7
7
  import {Checkbox} from "../../../Checkbox";
8
8
  import {iPlcCheckHooks} from "./PlcCheck.hooks";
9
- import {createEffects} from "@peryl/utils/createEffects";
10
9
  import {iTableRefer} from "../../table/Table";
11
10
  import {Badge} from "../../../Badge";
12
11
  import {Dropdown} from "../../../Dropdown";
@@ -37,21 +36,21 @@ export function usePlcCheckMultiple(
37
36
  }
38
37
  ) {
39
38
 
40
- const { effects } = createEffects();
39
+ const { effects, effectComputed } = createEffectsOfReaction();
41
40
 
42
41
  /**
43
42
  * 双向绑定值
44
43
  * @author 韦胜健
45
44
  * @date 2022.11.27 16:36
46
45
  */
47
- const model = useModel(() => props.modelValue as PlainObject[] | null | undefined, event.emit.onUpdateModelValue as any);
46
+ const model = useModel(() => props.modelValue as PlainObject[] | null | undefined, event.emit.onUpdateModelValue as any, undefined, effects);
48
47
 
49
48
  /**
50
49
  * 已经选中的keys
51
50
  * @author 韦胜健
52
51
  * @date 2022.11.27 16:36
53
52
  */
54
- const checkKeys = computed(() => {
53
+ const checkKeys = effectComputed(() => {
55
54
  if (!model.value) {return {};}
56
55
  return toArray(model.value).reduce((prev, item) => {
57
56
  prev[item[props.field]] = true;
@@ -1,10 +1,9 @@
1
1
  import {iPlcCheckEventType, iPlcCheckPropsType} from "./PlcCheck.utils";
2
- import {useModel} from "@peryl/react-compose";
2
+ import {createEffectsOfReaction, useModel} from "@peryl/react-compose";
3
3
  import {PlainObject} from "@peryl/utils/event";
4
4
  import {iTableRowRenderScope} from "../../table/utils/table.utils";
5
5
  import {Radio} from "../../../Radio";
6
6
  import {CheckboxStatus} from "../../../../utils/constant";
7
- import {createEffects} from "@peryl/utils/createEffects";
8
7
  import {iPlcCheckHooks} from "./PlcCheck.hooks";
9
8
  import {iTableRefer} from "../../table/Table";
10
9
 
@@ -22,14 +21,14 @@ export function usePlcCheckSingle(
22
21
  }
23
22
  ) {
24
23
 
25
- const { effects } = createEffects();
24
+ const { effects } = createEffectsOfReaction();
26
25
 
27
26
  /**
28
27
  * 双向绑定值
29
28
  * @author 韦胜健
30
29
  * @date 2022.11.27 16:36
31
30
  */
32
- const model = useModel(() => props.modelValue as PlainObject | null | undefined, event.emit.onUpdateModelValue as any);
31
+ const model = useModel(() => props.modelValue as PlainObject | null | undefined, event.emit.onUpdateModelValue as any, undefined, effects);
33
32
 
34
33
  const utils = {
35
34
  /**
@@ -1,22 +1,21 @@
1
1
  import {TimePanel} from "./panel/TimePanel";
2
2
  import Input from "../Input";
3
- import {computed, getComponentCls, reactive, useModel, useRefs} from "@peryl/react-compose";
3
+ import {createEffectsOfReaction, getComponentCls, reactive, useModel, useRefs} from "@peryl/react-compose";
4
4
  import {delay} from "@peryl/utils/delay";
5
5
  import {PDate, plainDate} from "../../utils/plainDate";
6
6
  import {limitDatetimeTimePlainData, TimeLayoutToFormat, tTimeCompositionParams} from "./time.utils";
7
7
  import {TimePanelLayout} from "./panel/TimeBasePanel";
8
8
  import {debounce} from "@peryl/utils/debounce";
9
9
  import {useRenderReference} from "../../uses/useRenderReference";
10
- import {createEffects} from "@peryl/utils/createEffects";
11
10
  import {createPopupEditor} from "../usePopupEditor";
12
11
 
13
12
  export function createSingleTimeRender({ emit, props, hooks, displayPattern, today, maxmin, editComputed, slots, getPublicPopperAttrs, getInheritPublicTimeAttrs, formatString }: tTimeCompositionParams) {
14
13
 
15
- const { effects } = createEffects();
14
+ const { effects, effectComputed } = createEffectsOfReaction();
16
15
  const { refs, onRef } = useRefs({ input: Input });
17
16
  const reference = useRenderReference();
18
- const model = useModel(() => props.modelValue, emit.onUpdateModelValue, { onChange: () => delay().then(() => state.input = format.value?.getDisplay()) });
19
- const format = computed((): null | PDate => !model.value ? null : plainDate(model.value, formatString.value));
17
+ const model = useModel(() => props.modelValue, emit.onUpdateModelValue, { onChange: () => delay().then(() => state.input = format.value?.getDisplay()) }, effects);
18
+ const format = effectComputed((): null | PDate => !model.value ? null : plainDate(model.value, formatString.value));
20
19
  const state = reactive({
21
20
  input: format.value?.getDisplay(),
22
21
  hoverColumnType: null as null | TimePanelLayout,
@@ -1,4 +1,4 @@
1
- import {computed, getComponentCls, iHTMLInputElement, reactive, useModel, useRefs} from "@peryl/react-compose";
1
+ import {createEffectsOfReaction, getComponentCls, iHTMLInputElement, reactive, useModel, useRefs} from "@peryl/react-compose";
2
2
  import Input from "../Input";
3
3
  import {delay} from "@peryl/utils/delay";
4
4
  import {useFocusHandler} from "../../uses/useFocusHandler";
@@ -8,16 +8,16 @@ import {TimeRangePanelType} from "./panel/TimeRangePanel";
8
8
  import {limitDatetimeTimePlainData, TimeLayoutToFormat, tTimeCompositionParams} from "./time.utils";
9
9
  import {debounce} from "@peryl/utils/debounce";
10
10
  import {useRenderReference} from "../../uses/useRenderReference";
11
- import {createEffects} from "@peryl/utils/createEffects";
12
11
 
13
12
  export function useRangeTimeRender({ props, emit, onBlur, slots, displayPattern, today, onInputClear, maxmin, formatString }: tTimeCompositionParams & { onBlur: () => void, onInputClear?: (range: TimeRangePanelType) => void, }) {
14
- const { effects } = createEffects();
13
+ const { effects, effectComputed } = createEffectsOfReaction();
15
14
  const { refs, onRef } = useRefs({ input: Input, start: iHTMLInputElement, end: iHTMLInputElement, });
16
15
  const reference = useRenderReference();
17
- const startModel = useModel(() => props.start, emit.onUpdateStart, { onChange: () => delay().then(() => state.input.start = format.value.start?.getDisplay()) });
18
- const endModel = useModel(() => props.end, emit.onUpdateEnd, { onChange: () => delay().then(() => state.input.end = format.value.end?.getDisplay()) });
16
+ const startModel = useModel(() => props.start, emit.onUpdateStart, { onChange: () => delay().then(() => state.input.start = format.value.start?.getDisplay()) }, effects);
17
+ const endModel = useModel(() => props.end, emit.onUpdateEnd, { onChange: () => delay().then(() => state.input.end = format.value.end?.getDisplay()) }, effects);
19
18
 
20
19
  const { isFocus } = useFocusHandler({
20
+ effects,
21
21
  getEls: () => [refs.start, refs.end],
22
22
  /**
23
23
  * Input失去焦点事件,将文本框的值重置为display的值,以避免显示输入不正确的值
@@ -33,7 +33,7 @@ export function useRangeTimeRender({ props, emit, onBlur, slots, displayPattern,
33
33
  onFocus: emit.onFocus,
34
34
  });
35
35
 
36
- const format = computed((): { start: null | PDate, end: null | PDate } => ({
36
+ const format = effectComputed((): { start: null | PDate, end: null | PDate } => ({
37
37
  start: !startModel.value ? null : plainDate(startModel.value, formatString.value),
38
38
  end: !endModel.value ? null : plainDate(endModel.value, formatString.value),
39
39
  }));
@@ -322,9 +322,9 @@ export const PopupItem = designComponent({
322
322
  * @author 韦胜健
323
323
  * @date 2023/5/16 17:14
324
324
  */
325
- useWatchAutoClear(() => state.option.reference, () => {
326
- const effects: SimpleFunction[] = [];
325
+ useWatchAutoClear(() => state.option.reference, (): (() => void) => {
327
326
  if (!state.option.reference) {return doNothing;}
327
+ const { effects } = createEffects();
328
328
  const parents = getElementParents(state.option.reference).concat(window as any);
329
329
  const onScroll = () => {
330
330
  if (state.option.hideOnScroll) {
@@ -341,7 +341,7 @@ export const PopupItem = designComponent({
341
341
  parent.addEventListener('scroll', onScroll);
342
342
  effects.push(() => {parent.removeEventListener('scroll', onScroll);});
343
343
  });
344
- return () => {effects.forEach(i => i());};
344
+ return effects.clear;
345
345
  });
346
346
 
347
347
  /**