@@ -162,8 +162,37 @@ function reactEnvWrapper(func) {
162
162
}
163
163
}
164
164
165
+ /**
166
+ * 小程序的组件复用逻辑和React有差异
167
+ *
168
+ * 比如:小程序wxml
169
+ * <view>
170
+ * <block wx:if="{{bool}}">
171
+ * <user/>
172
+ * </block>
173
+ * <block wx:else>
174
+ * <user/>
175
+ * </block>
176
+ * </view>
177
+ *
178
+ * React等效代码:
179
+ *
180
+ * <view>
181
+ * {bool ? <user> : <user>}
182
+ * <view>
183
+ *
184
+ * 当切换bool的值的时候, 小程序的user不会复用, React的user会复用。
185
+ *
186
+ * alita只能保证mini-react的复用逻辑和小程序保持一致(基于组件静态位置??)
187
+ *
188
+ * //TODO 对触发不同复用逻辑的情况,给出友好提示
189
+ *
190
+ * @param vnode
191
+ * @param oldData
192
+ * @returns {* }
193
+ */
165
194
function getDiuuAndShouldReuse ( vnode , oldData ) {
166
- const { key, nodeName , isTempMap } = vnode
195
+ const { key, isTempMap } = vnode
167
196
168
197
const diuuKey = vnode . diuu
169
198
if ( ! oldData ) {
@@ -177,34 +206,20 @@ function getDiuuAndShouldReuse(vnode, oldData) {
177
206
let diuu = null
178
207
let shouldReuse = false
179
208
180
- // 如果是map 返回的最外层元素, 需要判断是否可以复用。
181
- // 由于key的存在, 可能出现diuu获取的实例并非nodeName类型的情况
209
+ // 如果是map 返回的最外层元素, 需要判断是否可以复用。复用基于JSX结构的位置,即tempName的值
182
210
if ( key !== undefined && oldData && isTempMap ) {
183
211
const od = oldData . diuu
184
212
diuu = oldData [ od ]
185
-
186
- const inst = instanceManager . getCompInstByUUID ( diuu )
187
-
188
- if ( ! diuu ) {
189
- // TODO 考虑phblock的情况, 这种情况需要把FlatList等key,赋值给phblock
190
- shouldReuse = false
191
- } else if ( ! inst && ( nodeName === 'view' || nodeName === 'block' || nodeName === 'image' ) ) {
192
- // 前后都是view/image/blcok
193
- shouldReuse = true
194
- } else if ( inst && inst instanceof CPTComponent && typeof nodeName === 'string' && nodeName . endsWith ( 'CPT' ) ) {
195
- // 前后都是cpt
196
- shouldReuse = true
197
- } else if ( inst && typeof nodeName === 'function' && inst instanceof nodeName ) {
198
- shouldReuse = true
199
- }
213
+ shouldReuse = oldData . tempName === vnode . tempName
200
214
}
201
215
202
- // TODO <A/> 是否考虑A是变量的情况, 如果考虑 这里也应该判断类型
203
216
if ( ! isTempMap && oldData ) {
217
+ // 复用基于位置,即diuuKey的值
204
218
diuu = oldData [ diuuKey ]
205
219
shouldReuse = ! ! diuu
206
220
}
207
221
222
+
208
223
return {
209
224
diuu,
210
225
diuuKey,
0 commit comments