-
Notifications
You must be signed in to change notification settings - Fork 4.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【微信小程序】子组件里 map 生成的第2层子组件,在数据更新时无法正确获取props并更新 #4497
Comments
@ignous CLI 和依赖版本保持一致。 |
CC @Chen-jj |
@ignous components/info-list 中的 View 组件不要加 key。taro 的 props 系统在这种情况下会和微信的 diff 算法有冲突。 |
Hello~ 您的问题楼上已经有了确切的回答,如果没有更多的问题这个 issue 将在 15 天后被自动关闭。 如果您在这 15 天中更新更多信息自动关闭的流程会自动取消,如有其他问题也可以发起新的 Issue。 Good luck and happy coding~ |
anonIdx换成 key就正常了, 可能需要转换的时候做更多的判断吧 |
@ignous 这么说吧,这是歪打正着的结果。 初次渲染genCompid 为自定义组件生成组件 id,假设 1,2。然后把 props 放进 propsManager。 propsManager: {
'1': {
key: 'id-1'
},
'2': {
key: 'id-2'
}
} 点击按钮点击按钮后会跑父组件的 render 逻辑,重新 genCompid 生成组件 id,还是 1 和 2。然后把 props 放进 propsManager。 propsManager: {
'1': {
key: 'id-3'
},
'2': {
key: 'id-4'
}
} 因为加了 key,会先卸载两个 info 组件,再加入两个。 错误原因:info 组件 unmount 时会把 propsManager 中对应的 props 对象销毁。 propsManager: {} 新创建的两个 info 组件再到 propsManager 中取 props 时,对应的 props 已经被销毁,所以props 为空。 不加 key不加key,diff 算法不会销毁 info,走组件更新逻辑,因此没有问题。 anonIdx 换成 key在点击按钮时,key 是用户逻辑,会自增,genCompid 会生成 3 和 4。 {
'1': {
key: 'id-1'
},
'2': {
key: 'id-2'
},
'3': {
key: 'id-3'
},
'4': {
key: 'id-4'
}
} 然后 propsManager[1]、propsManager[2] 即使被删除,还是不影响获取 props。 但这样会导致内存泄漏。 |
主要是感觉这个问题,使用map得建议不加key了... 这个感觉和之前用react的用法推荐正好相反呀 |
当然不是我上面说明的那个直接index换key的写法哈。。 只是在想compid 的规则调整下,是不是能解决这个问题,如果能愉快的使用key,代码写起来会更舒服哈 |
对于循环,先删除 PropsManager 中旧 compid 对应的 props,再生成新 compid 对应的 props。 目的是绕过微信小程序加 key 后 diff 算法某些情况时会先卸载组件再加入组件,以致卸载组件时把新 props 清理掉。#4497
问题描述
子组件里 map 生成的第2层子组件,在数据更新时无法正确获取props并更新
复现步骤
[复现问题的步骤]
pages/index
components/info-list
components/info
期望行为
refresh 后也能正确显示
报错信息
无
系统信息
👽 Taro v1.3.15
Taro CLI 1.3.15 environment info:
System:
OS: macOS 10.14.6
Shell: 3.2.57 - /bin/bash
Binaries:
Node: 8.9.3 - ~/.nvm/versions/node/v8.9.3/bin/node
Yarn: 1.17.3 - ~/.nvm/versions/node/v8.9.3/bin/yarn
npm: 6.1.0 - ~/.nvm/versions/node/v8.9.3/bin/npm
npmPackages:
@tarojs/components: 1.3.18 => 1.3.18
@tarojs/plugin-babel: 1.3.18 => 1.3.18
@tarojs/plugin-csso: 1.3.18 => 1.3.18
@tarojs/plugin-uglifyjs: 1.3.18 => 1.3.18
@tarojs/router: 1.3.18 => 1.3.18
@tarojs/taro: 1.3.18 => 1.3.18
@tarojs/taro-alipay: 1.3.18 => 1.3.18
@tarojs/taro-h5: 1.3.18 => 1.3.18
@tarojs/taro-qq: 1.3.18 => 1.3.18
@tarojs/taro-quickapp: 1.3.18 => 1.3.18
@tarojs/taro-swan: 1.3.18 => 1.3.18
@tarojs/taro-tt: 1.3.18 => 1.3.18
@tarojs/taro-weapp: 1.3.18 => 1.3.18
@tarojs/webpack-runner: 1.3.18 => 1.3.18
eslint-config-taro: 1.3.18 => 1.3.18
eslint-plugin-taro: 1.3.18 => 1.3.18
nerv-devtools: ^1.4.0 => 1.4.4
nervjs: ^1.4.0 => 1.4.4
stylelint-config-taro-rn: 1.3.18 => 1.3.18
stylelint-taro-rn: 1.3.18 => 1.3.18
补充信息
可以看到更新了4次(数组里有2个元素,所以都更新了2次)
2次init, key变化导致了init的发生
2次 update
根据断点猜测 很可能 update和init 操作到都是不同的组件,导致正确都数据没有更新到新挂载到组件上
The text was updated successfully, but these errors were encountered: