Skip to content
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

百度小程序的父组件条件渲染子组件丢失 props 的问题 #7301

Open
qianzhaoy opened this issue Aug 11, 2020 · 3 comments
Open
Labels
F-react Framework - React T-swan Target - 编译到百度小程序 V-2 Version - 2.x

Comments

@qianzhaoy
Copy link

qianzhaoy commented Aug 11, 2020

相关平台

百度小程序

复现仓库

https://gitee.com/qianzhaoyan/taro-swan-renderbug
小程序基础库: 3.190.15
使用框架: React

复现步骤

直接打开即可.
重要代码: pages/index/index.tsx => render函数 => <LayoutView disableScroll.
描述: 去掉 props 的 disableScroll 可以正常使用.

期望结果

渲染 Radiobox 并正常使用

实际结果

无法渲染 Radiobox.

环境信息

Taro CLI 2.2.12 environment info:
    System:
      OS: macOS 10.14.6
      Shell: 3.2.57 - /bin/bash
    Binaries:
      Node: 12.11.1 - ~/.nvm/versions/node/v12.11.1/bin/node
      npm: 6.11.3 - ~/.nvm/versions/node/v12.11.1/bin/npm
    npmPackages:
      @tarojs/components: 2.2.12 => 2.2.12 
      @tarojs/components-qa: 2.2.12 => 2.2.12 
      @tarojs/mini-runner: 2.2.12 => 2.2.12 
      @tarojs/plugin-terser: 2.2.12 => 2.2.12 
      @tarojs/router: 2.2.12 => 2.2.12 
      @tarojs/taro: 2.2.12 => 2.2.12 
      @tarojs/taro-alipay: 2.2.12 => 2.2.12 
      @tarojs/taro-h5: 2.2.12 => 2.2.12 
      @tarojs/taro-qq: 2.2.12 => 2.2.12 
      @tarojs/taro-quickapp: 2.2.12 => 2.2.12 
      @tarojs/taro-rn: 2.2.12 => 2.2.12 
      @tarojs/taro-swan: 2.2.12 => 2.2.12 
      @tarojs/taro-tt: 2.2.12 => 2.2.12 
      @tarojs/taro-weapp: 2.2.12 => 2.2.12 
      @tarojs/webpack-runner: 2.2.12 => 2.2.12 
      eslint-config-taro: 2.2.12 => 2.2.12 
      eslint-plugin-taro: 2.2.12 => 2.2.12 
      nerv-devtools: ^1.5.5 => 1.5.7 
      nervjs: ^1.5.5 => 1.5.7 
      stylelint-config-taro-rn: 2.2.12 => 2.2.12 
      stylelint-taro-rn: 2.2.12 => 2.2.12 

补充信息

LayoutView 条件渲染 props.children。
LayoutView 首先渲染了 defaultProps 里 disabledScroll = false 的情况的 ScrollView.

由于 swan 的 initComponent 在 compid 变化后才执行,parent 执行 propsManager.set。LayoutView initComponent 后获得 propsManager[compid] 里的 disabledScroll = true。原来 ScrollView 里的 Children 被销毁。执行了 componentWillUnmount。导致propsManage[compid] 里的 observers 和 map 被 delete 了。

此时渲染了 View 里的 Children,但是因为 parent 的调用 propsManager.set 在组件销毁之前。导致 View 里的 children 再次 render 的时候 propsManager 里的 map[comid] 是 undefined

@taro-bot2 taro-bot2 bot added F-react Framework - React T-swan Target - 编译到百度小程序 V-2 Version - 2.x labels Aug 11, 2020
@qianzhaoy
Copy link
Author

希望将 swan createComponent 里的 initComponent 生命周期改成和 微信一样。
好像是 1.3.x 有个版本改了。现在 attached 和 ready 生命周期里什么事情都没干。
导致出现了一种预渲染的情况。默认渲染 defaultProps 的 View, 才会再次 rerender 真正的 props 的 View。

@wangxxxb
Copy link

抖音小程序也有这样的问题,而且不清会影响当前条件渲染的组件,还会影响同一个父组件下面的其他的兄弟组件props的获取,两种情况我都遇到了

@qianzhaoy
Copy link
Author

抖音小程序也有这样的问题,而且不清会影响当前条件渲染的组件,还会影响同一个父组件下面的其他的兄弟组件props的获取,两种情况我都遇到了

字节小程序的问题。可能有点不一样。我发现字节会出现诡异的生命周期问题,比如诡异的自动调用了 detached。导致 props 丢失,可能是字节的问题。可以试一下把有问题的组件外面套一层 view。 改变原来的布局解决。可能是字节的模板引擎还是渲染引擎什么出了问题。

字节小程序还有 attached 的时候 compid 丢失的问题, 暂时还没找到问题原因。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
F-react Framework - React T-swan Target - 编译到百度小程序 V-2 Version - 2.x
Projects
None yet
Development

No branches or pull requests

2 participants