@neatui/nuxt 0.1.0 → 1.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 (84) hide show
  1. package/BUILD.md +128 -0
  2. package/README.md +98 -1
  3. package/SSR_COMPATIBILITY.md +201 -0
  4. package/USAGE.md +260 -0
  5. package/nuxt.config.example.ts +37 -0
  6. package/package.json +29 -11
  7. package/src/components/basic/IDraggable.vue +87 -65
  8. package/src/components/basic/IFollowView.vue +32 -23
  9. package/src/components/basic/IRouterView.vue +38 -23
  10. package/src/components/basic/IScrollView.vue +11 -7
  11. package/src/components/basic/Icon.vue +17 -17
  12. package/src/components/basic/LayerView/Layer.vue +33 -106
  13. package/src/components/basic/follow.ts +133 -0
  14. package/src/components/display/Calendar.vue +14 -14
  15. package/src/components/display/CalendarReg.vue +14 -14
  16. package/src/components/display/Image.vue +8 -8
  17. package/src/components/display/PhotoEditor.vue +36 -36
  18. package/src/components/display/PhotoViewer.vue +8 -8
  19. package/src/components/display/Tree.vue +6 -6
  20. package/src/components/display/TreeView.vue +4 -4
  21. package/src/components/display/index.ts +2 -2
  22. package/src/components/form/Cascader.vue +19 -19
  23. package/src/components/form/Checkbox.vue +64 -0
  24. package/src/components/form/DatePicker.vue +6 -7
  25. package/src/components/form/DateRangePicker@v3.vue +4 -4
  26. package/src/components/form/DateRangeView@v3.vue +18 -19
  27. package/src/components/form/DateView.vue +14 -14
  28. package/src/components/form/DateView@v2.vue +14 -14
  29. package/src/components/form/DateView@v3.vue +331 -318
  30. package/src/components/form/ImgUpload.vue +7 -7
  31. package/src/components/form/Input@v3.vue +11 -11
  32. package/src/components/form/MoreSelect@v3.vue +87 -17
  33. package/src/components/form/MoreSelectList.vue +8 -8
  34. package/src/components/form/MoreSelectPanel@v3.vue +3 -3
  35. package/src/components/form/MoreSelectPicker.vue +7 -7
  36. package/src/components/form/MoreSelectTags.vue +8 -8
  37. package/src/components/form/PageMoreSelect.vue +14 -14
  38. package/src/components/form/PageSelect.vue +16 -16
  39. package/src/components/form/SearchMoreSelect.vue +12 -12
  40. package/src/components/form/SearchSelect@v3.vue +3 -3
  41. package/src/components/form/Select@v3.vue +229 -23
  42. package/src/components/form/SelectList.vue +8 -8
  43. package/src/components/form/SelectPicker.vue +6 -6
  44. package/src/components/form/SelectTags.vue +7 -7
  45. package/src/components/form/SelectTree/SelectTree@v1.vue +5 -5
  46. package/src/components/form/Switch.vue +38 -103
  47. package/src/components/form/TextArea.vue +18 -18
  48. package/src/components/form/Textarea@v2.vue +275 -0
  49. package/src/components/form/TimeView.vue +14 -14
  50. package/src/components/form/Upload.vue +806 -297
  51. package/src/components/form/date.ts +321 -0
  52. package/src/components/form/index.ts +7 -5
  53. package/src/components/form/number.ts +3 -0
  54. package/src/components/form/type.ts +224 -0
  55. package/src/components/icon/OrderIcon.vue +113 -0
  56. package/src/components/loader/FormLoader/FormLoader@v2.vue +193 -195
  57. package/src/components/loader/FormLoader/FormLoader@v3.vue.backup +372 -291
  58. package/src/components/loader/FormLoader/FormRender@v3.vue.backup +4 -0
  59. package/src/components/loader/FormLoader/NodeLoader.vue +85 -0
  60. package/src/components/loader/FormLoader@v1/FormLoader.vue +1 -1
  61. package/src/components/loader/FormLoader@v1/FormRender.vue +49 -24
  62. package/src/components/loader/LayerLoader/LayerLoader.vue +318 -0
  63. package/src/components/loader/LayerLoader/index.ts +2 -0
  64. package/src/components/loader/LayerLoader/style.scss +77 -0
  65. package/src/components/loader/LimitLoader/LimitLoader@v3.vue +39 -28
  66. package/src/components/loader/MoveLoader/MoveLoader.vue +628 -0
  67. package/src/components/loader/MoveLoader/index.ts +2 -0
  68. package/src/components/loader/MoveLoader/style.scss +77 -0
  69. package/src/components/loader/TableLoader/TableLoader.vue +227 -195
  70. package/src/components/loader/TableLoader/TableRender.vue +141 -0
  71. package/src/components/loader/TableLoader/index.ts +47 -0
  72. package/src/components/loader/index.ts +3 -2
  73. package/src/components/tools/Pagination@a.vue +17 -18
  74. package/src/components/tools/Pagination@b.vue +16 -16
  75. package/src/index.ts +2 -1
  76. package/src/module.ts +169 -0
  77. package/src/runtime/types.d.ts +36 -0
  78. package/src/store/{myui.ts → frame.ts} +4 -4
  79. package/src/utils/theme.ts +14 -0
  80. package/tsconfig.json +1 -1
  81. package/src/components/loader/FormLoader/index.ts +0 -2
  82. package/src/components/loader/LimitLoader/LimitLoader.vue.backup +0 -131
  83. package/src/components/loader/LimitLoader/LimitLoader@v2.vue.backup +0 -174
  84. package/src/components/loader/TableLoader/TableColView.vue +0 -115
@@ -1,186 +1,184 @@
1
1
  <template>
2
- <slot>
3
- <div :ui-row="rows" class="n-sl-sub">
4
- <template v-for="(col, idx) in state.form" :key="idx">
5
- <div v-if="!col.clear" :id="col._fid" :ui-col="col.media" :ui-flex="`${vertical ? 'col xm' : 'row lt'}`">
6
- <template v-if="col.label">
7
- <h6 v-if="vertical" :style="`${col.rules?.some((validator: any) => validator.required) ? 'text-indent: -1em' : ''}`" class="o-ls">
8
- <template v-if="col.label == '*'"></template>
9
- <template v-else>
10
- <b v-if="col.rules?.some((validator: any) => validator.required)" class="co-risk pr" style="left: 0.1em">﹡</b>
11
- <span>{{ col.label ? col.label + ':' : '' }}</span>
12
- </template>
13
- </h6>
14
- <p v-else :class="`${clh({ ...(col.model[1] || {}) })}`" :style="`width:${state._lw + 'em'}; max-width:50%;`" class="ar nr-sm flex-fixed o-ls">
15
- <template v-if="col.label == '*'"></template>
16
- <template v-else>
17
- <b v-if="col.rules?.some((validator: any) => validator.required)" class="co-risk">﹡</b>
18
- <span>{{ col.label ? col.label + ':' : '' }}</span>
19
- </template>
20
- </p>
21
- </template>
22
- <Input v-if="col.model[0] === 'Input'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" class="full-w" v-bind="{ ...(col.model[1] || {}) }" />
23
- <Select
24
- v-else-if="col.model[0] === 'Select'"
25
- v-model="col._data[col.field]"
26
- :interacted="interacted"
27
- :options="col.enums"
28
- :rules="col?.rules"
29
- class="full-w"
30
- v-bind="{ ...(col.model[1] || {}) }"
31
- ></Select>
32
- <SelectList
33
- v-else-if="col.model[0] === 'SelectList'"
34
- v-model="col._data[col.field]"
35
- :interacted="interacted"
36
- :options="col.enums"
37
- :rules="col?.rules"
38
- class="full-w"
39
- v-bind="{ ...(col.model[1] || {}) }"
40
- />
41
- <SelectTags
42
- v-else-if="col.model[0] === 'SelectTags'"
43
- v-model="col._data[col.field]"
44
- :interacted="interacted"
45
- :options="col.enums"
46
- :rules="col?.rules"
47
- class="full-w"
48
- v-bind="{ ...(col.model[1] || {}) }"
49
- />
50
- <SelectPicker
51
- v-else-if="col.model[0] === 'SelectPicker'"
52
- v-model="col._data[col.field]"
53
- :interacted="interacted"
54
- :options="col.enums"
55
- :rules="col?.rules"
56
- class="full-w"
57
- v-bind="{ ...(col.model[1] || {}) }"
58
- />
59
- <SearchSelect
60
- v-else-if="col.model[0] === 'SearchSelect'"
61
- v-model="col._data[col.field]"
62
- :interacted="interacted"
63
- :options="col.enums"
64
- :rules="col.rules"
65
- class="full-w"
66
- v-bind="{ ...(col.model[1] || {}) }"
67
- />
68
- <MoreSelect
69
- v-else-if="col.model[0] === 'MoreSelect'"
70
- v-model="col._data[col.field]"
71
- :interacted="interacted"
72
- :options="col.enums"
73
- :rules="col.rules"
74
- class="full-w"
75
- v-bind="{ ...(col.model[1] || {}) }"
76
- />
77
- <MoreSelectList
78
- v-else-if="col.model[0] === 'MoreSelectList'"
79
- v-model="col._data[col.field]"
80
- :interacted="interacted"
81
- :options="col.enums"
82
- :rules="col.rules"
83
- class="full-w"
84
- v-bind="{ ...(col.model[1] || {}) }"
85
- />
86
- <MoreSelectTags
87
- v-else-if="col.model[0] === 'MoreSelectTags'"
88
- v-model="col._data[col.field]"
89
- :interacted="interacted"
90
- :options="col.enums"
91
- :rules="col.rules"
92
- class="full-w"
93
- v-bind="{ ...(col.model[1] || {}) }"
94
- />
95
- <MoreSelectPicker
96
- v-else-if="col.model[0] === 'MoreSelectPicker'"
97
- v-model="col._data[col.field]"
98
- :interacted="interacted"
99
- :options="col.enums"
100
- :rules="col.rules"
101
- class="full-w"
102
- v-bind="{ ...(col.model[1] || {}) }"
103
- />
104
- <SearchMoreSelect
105
- v-else-if="col.model[0] === 'SearchMoreSelect'"
106
- v-model="col._data[col.field]"
107
- :interacted="interacted"
108
- :options="col.enums"
109
- :rules="col.rules"
110
- class="full-w"
111
- v-bind="{ ...(col.model[1] || {}) }"
112
- />
113
- <PageSelect
114
- v-else-if="col.model[0] === 'PageSelect'"
115
- v-model="col._data[col.field]"
116
- :interacted="interacted"
117
- :options="col.enums"
118
- :rules="col.rules"
119
- class="full-w"
120
- v-bind="{ ...(col.model[1] || {}) }"
121
- />
122
- <SelectTree
123
- v-else-if="col.model[0] === 'SelectTree'"
124
- v-model="col._data[col.field]"
125
- :interacted="interacted"
126
- :options="col.enums"
127
- :rules="col.rules"
128
- class="full-w"
129
- v-bind="{ ...(col.model[1] || {}) }"
130
- />
131
- <DatePicker
132
- v-else-if="col.model[0] === 'DatePicker'"
133
- v-model="col._data[col.field]"
134
- :interacted="interacted"
135
- :rules="col.rules"
136
- class="full-w"
137
- v-bind="{ ...(col.model[1] || {}) }"
138
- />
139
- <DateRangePicker
140
- v-else-if="col.model[0] === 'DateRangePicker'"
141
- v-model="col._data[col.field]"
142
- :interacted="interacted"
143
- :rules="col.rules"
144
- class="full-w"
145
- v-bind="{ ...(col.model[1] || {}) }"
146
- />
147
- <ImgUpload v-else-if="col.model[0] === 'ImgUpload'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
148
- <Upload v-else-if="col.model[0] === 'Upload'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
149
- <TextArea
150
- v-else-if="col.model[0] === 'TextArea'"
151
- v-model="col._data[col.field]"
152
- :interacted="interacted"
153
- :rules="col.rules"
154
- v-bind="{ ...(col.model[1] || {}) }"
155
- ></TextArea>
156
- <Switch v-else-if="col.model[0] === 'Switch'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
157
- <Tree v-else-if="col.model[0] === 'Tree'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" class="mt-sm" v-bind="{ ...(col.model[1] || {}) }" />
158
- <Cascader
159
- v-else-if="col.model[0] === 'Cascader'"
160
- v-model="col._data[col.field]"
161
- :interacted="interacted"
162
- :options="col.enums"
163
- :rules="col.rules"
164
- class="full-w"
165
- v-bind="{ ...(col.model[1] || {}) }"
166
- />
167
- <template v-else>
168
- <slot v-if="col.slot" :name="col.slot" :col="col"></slot>
169
- <slot v-else-if="col.model[0]" :name="col.model[0]" :col="col"></slot>
170
- <slot v-else :name="col.field" :col="col"></slot>
171
- </template>
172
- </div>
173
- </template>
174
- <div :ui-flex="`${vertical ? 'col xm' : 'row xt'}`">
175
- <div v-if="vertical">
176
- <slot name="submit"></slot>
177
- </div>
178
- <div v-else :style="`padding-left:${state._lw + 'em'};`">
179
- <slot name="submit"></slot>
180
- </div>
2
+ <div :ui-row="rows" class="n-sl-sub">
3
+ <template v-for="(col, idx) in state.form" :key="idx">
4
+ <div v-if="!col.clear" :id="col._fid" :ui-col="col.media" :ui-flex="`${vertical ? 'col xm' : 'row lt'}`">
5
+ <template v-if="col.label">
6
+ <h6 v-if="vertical" :style="`${col.rules?.some((validator: any) => validator.required) ? 'text-indent: -1em' : ''}`" class="o-ls">
7
+ <template v-if="col.label == '*'"></template>
8
+ <template v-else>
9
+ <b v-if="col.rules?.some((validator: any) => validator.required)" class="co-risk pr" style="left: 0.1em">﹡</b>
10
+ <span>{{ col.label ? col.label + ':' : '' }}</span>
11
+ </template>
12
+ </h6>
13
+ <p v-else :class="`${clh({ ...(col.model[1] || {}) })}`" :style="`width:${state._lw + 'em'}; max-width:50%;`" class="ar nr-sm flex-fixed o-ls">
14
+ <template v-if="col.label == '*'"></template>
15
+ <template v-else>
16
+ <b v-if="col.rules?.some((validator: any) => validator.required)" class="co-risk">﹡</b>
17
+ <span>{{ col.label ? col.label + ':' : '' }}</span>
18
+ </template>
19
+ </p>
20
+ </template>
21
+ <Input v-if="col.model[0] === 'Input'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" class="w-full" v-bind="{ ...(col.model[1] || {}) }" />
22
+ <Select
23
+ v-else-if="col.model[0] === 'Select'"
24
+ v-model="col._data[col.field]"
25
+ :interacted="interacted"
26
+ :options="col.enums"
27
+ :rules="col?.rules"
28
+ class="w-full"
29
+ v-bind="{ ...(col.model[1] || {}) }"
30
+ ></Select>
31
+ <SelectList
32
+ v-else-if="col.model[0] === 'SelectList'"
33
+ v-model="col._data[col.field]"
34
+ :interacted="interacted"
35
+ :options="col.enums"
36
+ :rules="col?.rules"
37
+ class="w-full"
38
+ v-bind="{ ...(col.model[1] || {}) }"
39
+ />
40
+ <SelectTags
41
+ v-else-if="col.model[0] === 'SelectTags'"
42
+ v-model="col._data[col.field]"
43
+ :interacted="interacted"
44
+ :options="col.enums"
45
+ :rules="col?.rules"
46
+ class="w-full"
47
+ v-bind="{ ...(col.model[1] || {}) }"
48
+ />
49
+ <SelectPicker
50
+ v-else-if="col.model[0] === 'SelectPicker'"
51
+ v-model="col._data[col.field]"
52
+ :interacted="interacted"
53
+ :options="col.enums"
54
+ :rules="col?.rules"
55
+ class="w-full"
56
+ v-bind="{ ...(col.model[1] || {}) }"
57
+ />
58
+ <SearchSelect
59
+ v-else-if="col.model[0] === 'SearchSelect'"
60
+ v-model="col._data[col.field]"
61
+ :interacted="interacted"
62
+ :options="col.enums"
63
+ :rules="col.rules"
64
+ class="w-full"
65
+ v-bind="{ ...(col.model[1] || {}) }"
66
+ />
67
+ <MoreSelect
68
+ v-else-if="col.model[0] === 'MoreSelect'"
69
+ v-model="col._data[col.field]"
70
+ :interacted="interacted"
71
+ :options="col.enums"
72
+ :rules="col.rules"
73
+ class="w-full"
74
+ v-bind="{ ...(col.model[1] || {}) }"
75
+ />
76
+ <MoreSelectList
77
+ v-else-if="col.model[0] === 'MoreSelectList'"
78
+ v-model="col._data[col.field]"
79
+ :interacted="interacted"
80
+ :options="col.enums"
81
+ :rules="col.rules"
82
+ class="w-full"
83
+ v-bind="{ ...(col.model[1] || {}) }"
84
+ />
85
+ <MoreSelectTags
86
+ v-else-if="col.model[0] === 'MoreSelectTags'"
87
+ v-model="col._data[col.field]"
88
+ :interacted="interacted"
89
+ :options="col.enums"
90
+ :rules="col.rules"
91
+ class="w-full"
92
+ v-bind="{ ...(col.model[1] || {}) }"
93
+ />
94
+ <MoreSelectPicker
95
+ v-else-if="col.model[0] === 'MoreSelectPicker'"
96
+ v-model="col._data[col.field]"
97
+ :interacted="interacted"
98
+ :options="col.enums"
99
+ :rules="col.rules"
100
+ class="w-full"
101
+ v-bind="{ ...(col.model[1] || {}) }"
102
+ />
103
+ <SearchMoreSelect
104
+ v-else-if="col.model[0] === 'SearchMoreSelect'"
105
+ v-model="col._data[col.field]"
106
+ :interacted="interacted"
107
+ :options="col.enums"
108
+ :rules="col.rules"
109
+ class="w-full"
110
+ v-bind="{ ...(col.model[1] || {}) }"
111
+ />
112
+ <PageSelect
113
+ v-else-if="col.model[0] === 'PageSelect'"
114
+ v-model="col._data[col.field]"
115
+ :interacted="interacted"
116
+ :options="col.enums"
117
+ :rules="col.rules"
118
+ class="w-full"
119
+ v-bind="{ ...(col.model[1] || {}) }"
120
+ />
121
+ <SelectTree
122
+ v-else-if="col.model[0] === 'SelectTree'"
123
+ v-model="col._data[col.field]"
124
+ :interacted="interacted"
125
+ :options="col.enums"
126
+ :rules="col.rules"
127
+ class="w-full"
128
+ v-bind="{ ...(col.model[1] || {}) }"
129
+ />
130
+ <DatePicker
131
+ v-else-if="col.model[0] === 'DatePicker'"
132
+ v-model="col._data[col.field]"
133
+ :interacted="interacted"
134
+ :rules="col.rules"
135
+ class="w-full"
136
+ v-bind="{ ...(col.model[1] || {}) }"
137
+ />
138
+ <DateRangePicker
139
+ v-else-if="col.model[0] === 'DateRangePicker'"
140
+ v-model="col._data[col.field]"
141
+ :interacted="interacted"
142
+ :rules="col.rules"
143
+ class="w-full"
144
+ v-bind="{ ...(col.model[1] || {}) }"
145
+ />
146
+ <ImgUpload v-else-if="col.model[0] === 'ImgUpload'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
147
+ <Upload v-else-if="col.model[0] === 'Upload'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
148
+ <Textarea
149
+ v-else-if="col.model[0] === 'Textarea'"
150
+ v-model="col._data[col.field]"
151
+ :interacted="interacted"
152
+ :rules="col.rules"
153
+ v-bind="{ ...(col.model[1] || {}) }"
154
+ ></Textarea>
155
+ <Switch v-else-if="col.model[0] === 'Switch'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" v-bind="{ ...(col.model[1] || {}) }" />
156
+ <Tree v-else-if="col.model[0] === 'Tree'" v-model="col._data[col.field]" :interacted="interacted" :rules="col.rules" class="mt-sm" v-bind="{ ...(col.model[1] || {}) }" />
157
+ <Cascader
158
+ v-else-if="col.model[0] === 'Cascader'"
159
+ v-model="col._data[col.field]"
160
+ :interacted="interacted"
161
+ :options="col.enums"
162
+ :rules="col.rules"
163
+ class="w-full"
164
+ v-bind="{ ...(col.model[1] || {}) }"
165
+ />
166
+ <template v-else>
167
+ <slot v-if="col.slot" :name="col.slot" :col="col"></slot>
168
+ <slot v-else-if="col.model[0]" :name="col.model[0]" :col="col"></slot>
169
+ <slot v-else :name="col.field" :col="col"></slot>
170
+ </template>
171
+ </div>
172
+ </template>
173
+ <div :ui-flex="`${vertical ? 'col xm' : 'row xt'}`">
174
+ <div v-if="vertical">
175
+ <slot name="submit"></slot>
176
+ </div>
177
+ <div v-else :style="`padding-left:${state._lw + 'em'};`">
178
+ <slot name="submit"></slot>
181
179
  </div>
182
180
  </div>
183
- </slot>
181
+ </div>
184
182
  </template>
185
183
  <script lang="ts" setup>
186
184
  import { watch, reactive, onBeforeUnmount, nextTick } from 'vue';
@@ -189,7 +187,7 @@
189
187
  import {
190
188
  Input,
191
189
  Switch,
192
- TextArea,
190
+ Textarea,
193
191
  Select,
194
192
  SelectList,
195
193
  SelectTags,
@@ -206,7 +204,7 @@
206
204
  SearchMoreSelect,
207
205
  ImgUpload,
208
206
  Upload,
209
- Cascader
207
+ Cascader,
210
208
  } from '../../form';
211
209
  import { Tree } from '../../display';
212
210
 
@@ -240,39 +238,39 @@
240
238
  // 用户是否交互
241
239
  interacted: {
242
240
  type: Boolean,
243
- default: false
241
+ default: false,
244
242
  },
245
243
  // JSON规则
246
244
  form: {
247
245
  type: Object,
248
- default: () => ({})
246
+ default: () => ({}),
249
247
  },
250
248
  // 表单数据
251
249
  data: {
252
250
  type: Object as any,
253
- default: () => ({})
251
+ default: () => ({}),
254
252
  },
255
253
  // 栅格系统
256
254
  rows: {
257
255
  type: String,
258
- default: 'mob-24 pad-12 dpc-8'
256
+ default: 'mob-24 pad-12 dpc-8',
259
257
  },
260
258
  // 如果表单是数组的话这里传入下标
261
259
  idx: {
262
260
  type: [String, Number],
263
- default: ''
261
+ default: '',
264
262
  },
265
263
  // 是否垂直排列
266
264
  vertical: {
267
265
  type: Boolean,
268
- default: false
269
- }
266
+ default: false,
267
+ },
270
268
  });
271
269
 
272
270
  // 数据
273
271
  const state: any = reactive({
274
272
  form: [],
275
- _lw: 6
273
+ _lw: 6,
276
274
  });
277
275
 
278
276
  // 监听结构
@@ -384,13 +382,13 @@
384
382
  },
385
383
  {
386
384
  deep: true,
387
- immediate: true
388
- }
389
- )
385
+ immediate: true,
386
+ },
387
+ ),
390
388
  );
391
389
  }
392
390
  },
393
- { deep: true, immediate: true }
391
+ { deep: true, immediate: true },
394
392
  );
395
393
 
396
394
  // 处理
@@ -411,7 +409,7 @@
411
409
  }
412
410
  });
413
411
  },
414
- { deep: true }
412
+ { deep: true },
415
413
  );
416
414
 
417
415
  onBeforeUnmount(() => {