React Native如何在屏幕渲染前执行display:none避免按钮临时闪现
可行解决思路如下
- 思路1:补充未加载状态的兜底隐藏逻辑
你遇到的闪现问题核心是image数据未加载完成时,image?.is_my_good为undefined,条件判断会命中「不隐藏」的分支,等数据返回后才会触发重渲染加display:none,就会出现短暂显示。
直接修改View的样式判断逻辑,只要image未加载、或者已经点过赞,就直接隐藏按钮,改动量最小:
<View style={[(!image || image?.is_my_good) ? styles.hide_good_botton : {}, commonStyles.shadow]} > {goodbotton} </View>
- 思路2:优化State设计,避免存JSX元素
把存在useState里的图片JSX改成存布尔状态,不仅能减少不必要的重渲染,还能避免状态不同步导致的显示异常,改动也非常小:
// 替换原有存储JSX的state const [isGoodAnimating, setIsGoodAnimating] = useState(false) // 渲染时动态生成按钮图片 const renderGoodButton = () => ( <Image source={isGoodAnimating ? require('../../images/good_botton.png') : require('../../images/good_botton_inactive.png')} style={{width: 65, height: 65}} /> ) // 修改onPress逻辑 onPress={() => { if (image.is_my_good) { postGood(image.id, false) } else { setIsGoodAnimating(true) postGood(image.id, true) setTimeout(() => setIsGoodAnimating(false), 500) } }} // 渲染部分沿用思路1的隐藏逻辑 <View style={[(!image || image?.is_my_good) ? styles.hide_good_botton : {}, commonStyles.shadow]} > {renderGoodButton()} </View>
- 思路3:增加加载态占位
如果image数据加载耗时较长,可以在接口返回前,整个点赞区域先渲染空节点或者占位骨架,等数据完全返回后再渲染按钮,完全避免提前渲染的问题。
内容的提问来源于stack exchange,提问作者Hinoarashi
相关产品推荐
相关产品推荐

