Skip to content

react笔记(四):image图片组件

图片

img标签

封装img组件,在原有基础增加默认图片占位图和加载出错时error替代图片

图片

image.tsx

js
import React from 'react'

import './image.css'


interface ImageProps {
    src?:    string,//图片路径
    load?:   string,//默认占位图路径
    error?:  string,//加载错误时图片占位图路径
    width?:  number,//图片宽度
    height?: number,//图片高度
    className?:any,//父组件自定义图片class
}

class Image extends React.Component <any,ImageProps> {

    constructor(props:ImageProps) {
        super(props);
        this.state = {
            // 设置默认值
            load:   this.props.load  || require('../../assets/img/logo512.png'),//占位图片设置默认图片
            error:  this.props.error || require('../../assets/img/logo512.png'),//加载错误图片设置默认图片
        }
    }
    // 图片错误时加载error占位图
    imgError(e:any) {
        e.onError = null;
        e.target.src = this.state.error;
    }

    render () {
        // 图片父元素默认class 和 父组件自定义class
        let className = 'image ' + this.props.className;
        let img;
        // 当父组件调用时参数有图片src时,渲染传参图片
        if(this.props.src){
            //img的样式,宽,高,圆角基本继承外部div的样式
            img = <img src="{this.props.img}" className="image-item" onError={(e)=> this.imgError(e)} alt=""/>
        }else{
             // 当父组件调用时参数没有图片src时,渲染默认load占位图
            img = <img src={this.state.load} className="image-item" alt=""   />
        }
                //外部div的样式,由父组件传参宽,高,或自定义class配置或者默认的样式配置
        return  <div className={className} style={{height:`${this.props.height}px`,width:`${this.props.width}px`}}>
                    {img}
                </div>
    }

}

export default Image;
import React from 'react'

import './image.css'


interface ImageProps {
    src?:    string,//图片路径
    load?:   string,//默认占位图路径
    error?:  string,//加载错误时图片占位图路径
    width?:  number,//图片宽度
    height?: number,//图片高度
    className?:any,//父组件自定义图片class
}

class Image extends React.Component <any,ImageProps> {

    constructor(props:ImageProps) {
        super(props);
        this.state = {
            // 设置默认值
            load:   this.props.load  || require('../../assets/img/logo512.png'),//占位图片设置默认图片
            error:  this.props.error || require('../../assets/img/logo512.png'),//加载错误图片设置默认图片
        }
    }
    // 图片错误时加载error占位图
    imgError(e:any) {
        e.onError = null;
        e.target.src = this.state.error;
    }

    render () {
        // 图片父元素默认class 和 父组件自定义class
        let className = 'image ' + this.props.className;
        let img;
        // 当父组件调用时参数有图片src时,渲染传参图片
        if(this.props.src){
            //img的样式,宽,高,圆角基本继承外部div的样式
            img = <img src="{this.props.img}" className="image-item" onError={(e)=> this.imgError(e)} alt=""/>
        }else{
             // 当父组件调用时参数没有图片src时,渲染默认load占位图
            img = <img src={this.state.load} className="image-item" alt=""   />
        }
                //外部div的样式,由父组件传参宽,高,或自定义class配置或者默认的样式配置
        return  <div className={className} style={{height:`${this.props.height}px`,width:`${this.props.width}px`}}>
                    {img}
                </div>
    }

}

export default Image;

image.css

css
.image{
    width: 100%;
    height: 100%;
    box-sizing: border-box;
    min-width: 10px;
    min-height: 10px;
}
.image-item{
    width: inherit;
    height: inherit;
    border-radius: inherit;
}
.image{
    width: 100%;
    height: 100%;
    box-sizing: border-box;
    min-width: 10px;
    min-height: 10px;
}
.image-item{
    width: inherit;
    height: inherit;
    border-radius: inherit;
}

调用

js
import Image from './image'
<Image 
className={'new-class'} 
width={200} height={200} 
error={'加载错误时图片占位图的路径'}
>
</OpenImage>
import Image from './image'
<Image 
className={'new-class'} 
width={200} height={200} 
error={'加载错误时图片占位图的路径'}
>
</OpenImage>

本文到此结束。

反馈信息

INFO

邮箱: open_teams@163.com