reactjs 使用display none代替条件状态呈现

cgh8pdjw  于 2023-01-12  发布在  React
关注(0)|答案(3)|浏览(131)

我正在尝试使用条件渲染(在这个特定的例子中),这将允许我做出如下的东西:

<Image
    source={{ uri: "https://images4.alphacoders.com/221/221716.jpg" }}
    style={this.state.isLoaded ? styles.loaded : { display: "none" }}
    onLoadEnd={() => {
    console.log("test"), this.setState({ isLoaded: true });
    }}
/>

主要问题是,当使用display: none样式时,React Native似乎无法使用其内部生命周期函数,因此不会调用onLoadEnd,也不会记录任何内容。
我不知道在使用display风格的 prop 时如何遇到这个问题

pftdvrlh

pftdvrlh1#

TL;TR

**{ transform: [{ scale: 0 }] }**是一个很好的解决方案

恕我直言

你关于生命周期/渲染的问题似乎是合理的。
既然我不能给予你答案...
我最近在尝试使用{ display: 'none' }时遇到了一些奇怪的bug(当将显示恢复为'flex'时,一些子组件仍然没有呈现)。
{ width: 0, height: 0 }(当返回到'flex'时,布局未恢复)。
不用说,通过一些常见的技巧(return enabled && <MyComponent {...}/>)避免渲染并不是解决方案(安装和卸载组件需要大量的计算,这会破坏动画的帧率)。
当我希望在动画期间隐藏组件而不中断帧率时,我发现{ transform: [{ scale: 0 }] }是最好的解决方案:

  • 布局未更改(alignSelf: 'center'仍然有效)
  • 隐藏的组件不会捕捉任何触摸事件,并允许底层组件对触摸作出React

我的实现类似于:

view.setNativeProps({ transform: [{ scale: 0 }]
5vf7fwbs

5vf7fwbs2#

下一次,如果你设置一个小吃来演示你的问题,那将是超级酷的。
这个模式对你有用...

<Image
  source={{ uri: "https://images4.alphacoders.com/221/221716.jpg" }}
  style={[{width: 0, height: 0,},
  this.state.isLoaded && {width: 400, height: 400,}]}
  resizeMode="contain"
  onLoadEnd={() => {
    this.setState({ isLoaded: true });
  }}
/>

我创建了一个demo on snack for you

使用display: none更新

<Image
  source={{ uri: "https://images4.alphacoders.com/221/221716.jpg" }}
  style={[{width: 400, height: 400,},
  !this.state.isLoaded && {display: 'none'}]}
  resizeMode="contain"
  onLoadEnd={() => {
    this.setState({ isLoaded: true });
  }}
/>
kokeuurv

kokeuurv3#

我尝试了各种方法,但最后style: {height: 0, width: 0, opacity: 0}对我起作用了。

相关问题