React Native中如何判断FastImage加载的uri对应的图片不存在?
解决方案
方法1:使用FastImage内置的onError回调(最常用,适配组件渲染场景)
FastImage原生支持加载失败回调,只要URI对应的资源不存在、网络异常、图片格式不兼容都会触发该回调,你可以直接在回调中处理兜底逻辑,比如替换占位图、标记无效商品素材等。
代码示例:
<FastImage source={{ uri: photoUri, priority: FastImage.priority.high, }} style={styles.logo} onError={(error) => { // 加载失败触发,可判定当前uri对应的图片不存在/无法正常加载 console.log('图片加载失败,无效URI:', photoUri, error.nativeEvent.error) // 可在此处添加兜底逻辑,比如切换为本地占位图: // this.setState({ invalidUri: true }) // 渲染时判断invalidUri为true,就将source替换为require('./assets/goods_placeholder.png') }} // 可选:加载成功回调用来确认图片有效性 onLoad={() => { console.log('图片加载成功,URI有效') }} />
注意:除了图片不存在的场景,网络超时、跨域限制、服务端5xx错误也会触发onError。如果需要严格区分「图片确实不存在」的情况,可以结合回调返回的状态码判断,一般返回404即可判定为图片不存在。
方法2:预请求判断URI有效性(适配需要提前批量校验图片的场景)
如果你不需要等组件渲染,想提前确认某个URI对应的图片是否存在,可以主动发起HEAD请求,仅获取响应头不下载完整资源,性能消耗极低:
代码示例:
const checkImageExist = async (uri) => { try { const response = await fetch(uri, { method: 'HEAD' }) // 响应状态码在200-299区间,且响应头Content-Type为图片类型,即可判定图片存在 return response.ok && response.headers.get('Content-Type').startsWith('image/') } catch (e) { // 请求失败直接判定为图片不存在 return false } } // 调用示例 const isExist = await checkImageExist(photoUri) if (!isExist) { // 提前执行替换占位图的逻辑 }
内容的提问来源于stack exchange,提问作者yasin demir
相关产品推荐
相关产品推荐

