Reactjs中如何在数据库查询后根据选择值渲染输入字段并避免渲染闪烁
问题原因
componentDidMount生命周期执行时机是首次渲染完成、DOM已经挂载到页面之后,你在这个阶段发起接口请求,必然会先渲染初始状态的页面,等接口返回后setState触发二次渲染才会更新UI,所以会出现按钮先正常显示再变禁用的闪烁问题。- 你手动操作DOM修改
disabled属性、移除类名的写法不符合React的设计逻辑,UI状态应该完全由state驱动,不需要手动操作DOM。
解决方案
核心是新增加载状态,避免接口请求过程中显示不符合预期的中间UI,同时把所有按钮状态绑定到state。
1. 调整state定义,新增加载标识
this.state = { verificationStatus: '', isLoading: true // 加载状态标识,初始为true }
2. 调整getStatus方法,请求结束后更新加载状态
async getStatus() { try { const response = await Http.post({ url: '/api/id-status-check', headers: {'user': localStorage.getItem('userId')} }) this.setState({ verificationStatus: response.identificationStatus, isLoading: false // 请求完成,关闭加载状态 }) } catch (err) { // 按需添加请求异常处理逻辑 this.setState({ isLoading: false }) } }
3. render方法内通过state控制按钮状态,不要手动操作DOM
render() { const { isLoading, verificationStatus } = this.state // 提前计算按钮禁用状态 const btnDisabled = isLoading || verificationStatus?.toLowerCase() !== 'failed' // 加载阶段可以显示骨架屏、加载态按钮,避免出现中间状态 if (isLoading) { return <button disabled>加载中</button> } return ( <button disabled={btnDisabled} // 类名通过状态动态绑定 className={btnDisabled ? '' : 'btn-primary2'} > 按钮文本 </button> ) }
可选优化
如果这个校验状态是页面渲染的前置必要条件,不想显示加载态,可以把接口请求提前到路由守卫阶段执行,等接口返回状态后再进入当前页面,完全避免中间状态的出现,缺点是会增加首屏白屏时间,可根据业务场景选择。
内容的提问来源于stack exchange,提问作者dcampbell-1905
相关产品推荐
相关产品推荐

