import {FC, useEffect, useState} from "react"; import {Image, ImageProps, View} from "@tarojs/components"; import shard from '@/static/img/shard.png' import styles from './image.module.scss' import Taro from "@tarojs/taro"; import avatar from '@/static/img/avatar.png' interface Props extends ImageProps { width?: number | string height?: number | string fallback?: string errorType?: "acquiesce" | 'avatar' } const Img: FC = ({src, mode = 'aspectFill', width, height, fallback = shard, ...props}) => { const [isError, setIsError] = useState(false) const [loading, setLoading] = useState(true) const [errorUrl, setErrorUrl] = useState(fallback) const imgAnimation = Taro.createAnimation({duration: 0}).opacity(0).step() const [animationData, setAnimationData] = useState(imgAnimation.export()) useEffect(() => { setIsError(!src) setLoading(!!src) }, [src]) useEffect(() => { switch (props.errorType) { case undefined: case "acquiesce": setErrorUrl(fallback) break case "avatar": setErrorUrl(avatar) break } }, [props.errorType]) // 图片加载失败 function onErrorHandler() { setLoading(false) setIsError(true) } function onLoadHandler() { setLoading(false) setIsError(false) imgAnimation.opacity(1).step({duration: 200}) setAnimationData(imgAnimation.export()) } return ( {!isError && } { isError && !loading && } ) } export default Img