Skip to content

Commit 1e6d9c1

Browse files
committed
fix(wx-react): 修复复用逻辑的bug
1 parent 93db9e9 commit 1e6d9c1

File tree

2 files changed

+36
-21
lines changed

2 files changed

+36
-21
lines changed

packages/wx-react/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@areslabs/wx-react",
3-
"version": "2.0.3",
3+
"version": "2.0.4",
44
"description": "微信版本的React",
55
"files": [
66
"package.json",
@@ -10,7 +10,7 @@
1010
"scripts": {
1111
"test": "echo \"Error: no test specified\" && exit 1",
1212
"build": "rollup -c",
13-
"pub-beta": "npm run build && npm publish --tag=beta",
13+
"pub-beta": "npm run build && npm publish --tag=beta --registry http://registry.npmjs.org",
1414
"pub": "npm run build && npm publish --registry http://registry.npmjs.org",
1515
"link": "npm run build && sudo npm link"
1616
},

packages/wx-react/src/render.js

+34-19
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,37 @@ function reactEnvWrapper(func) {
162162
}
163163
}
164164

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+
*/
165194
function getDiuuAndShouldReuse(vnode, oldData) {
166-
const { key, nodeName, isTempMap } = vnode
195+
const { key, isTempMap } = vnode
167196

168197
const diuuKey = vnode.diuu
169198
if (!oldData) {
@@ -177,34 +206,20 @@ function getDiuuAndShouldReuse(vnode, oldData) {
177206
let diuu = null
178207
let shouldReuse = false
179208

180-
// 如果是map 返回的最外层元素, 需要判断是否可以复用。
181-
// 由于key的存在, 可能出现diuu获取的实例并非nodeName类型的情况
209+
// 如果是map 返回的最外层元素, 需要判断是否可以复用。复用基于JSX结构的位置,即tempName的值
182210
if (key !== undefined && oldData && isTempMap) {
183211
const od = oldData.diuu
184212
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
200214
}
201215

202-
// TODO <A/> 是否考虑A是变量的情况, 如果考虑 这里也应该判断类型
203216
if (!isTempMap && oldData) {
217+
// 复用基于位置,即diuuKey的值
204218
diuu = oldData[diuuKey]
205219
shouldReuse = !!diuu
206220
}
207221

222+
208223
return {
209224
diuu,
210225
diuuKey,

0 commit comments

Comments
 (0)