使用react来实现图片轮播的功能

在上一篇文章中,我已给出了图片轮播1.0的源码,这次,我打算用以前学过的react来实现这个代码。能实现一种功能的代码不能算作一个好的代码,我认为,在能实现一种功能的基础上还有非常好的维护性,以及扩展性才能进入好的代码的行列。但是,奈何本人才初涉前端,react也才开始学,只是学了一些皮毛,所有今天只是谈谈怎样用react实现图片的功能而已,在维护性与复用性上就没多大的考虑,毕竟这种事也是需要我多多练习的嘛。代码实现的功能与上篇文章所介绍的图片轮播功能一样。这里还是给出展示效果与功能吧。

展示效果如下:


功能:

点击开始就开始播放图片,点击+0.5s或者-0.5s可调节播放速度。点击左右箭头切换上一张或者下一张图片,鼠标移至图片位置暂停播放,移出则继续播放。下面原点有颜色处代表当前第几张图片,鼠标移至任意圆点都可使图片切换到对应的图片。

为什么要用react来写:

在react中有一切皆组件的概念,这就使得代码的复用性大大的加强了,而且,每个组件都有自己的状态state,与父组件传进来的数据props,这就使得代码中存在变量污染问题就大大减小了。每个组件通过改变自己的state来自动重新渲染页面,减少了我们的代码量。其JSX的特点也使得代码写起来感觉比写HTML好得多。当然,以上也只是我个人的感觉,如有问题还请多多包含。

写代码中也到的问题:

首先,是设计问题,怎样来设计react的组件关系,哪些是父组件,哪些是该父组件的子组件。然后是state和props,组件中哪些数据应该是自己的state,哪些应该是从父组件中传进来的数据props。

引进图片的问题,在HTML中写一个img标签是这样:

而在react中JSX中却不行,要这样:

这相当于将图片的src的路径取了一个别名为image3,在img标签中这样使用便行了:

然后第二个,就是改变样式的问题,在图片轮播这个项目中我需要改变的是下面的圆点的颜色,我使用的方法是这样:先定义一个style变量:

在使用该变量:比如在span标签中:<span style={style}>●</span>

最后便是理解问题了,比如this指针傻傻分不清,以至于自己写的代码中,为什么这个地方要使用this,为什么要bing(this),以及为什么这里要用箭头函数,我都是不一定说得出来。如果有哪位能为我解读一二我是非常高兴的。

源码:

PlayImgApp:

import React,{Component} from 'react'

import PlayImgBut from './PlayImgbut'

import PlayImage from './PlayImage'

import PlayPoints from './PlayImgPoints'

import StartBut from './startBut'

class PlayImgApp extends Component{

    constructor(){

        super();

        this.state = {

            nowImgNumber:0,

            isStart:false,

            playTime:2000,

        }

    }

    componentDidMount(){

        this.change = setInterval(()=>this.changeNum(),this.state.playTime);

    }

    handleStart(){

        if(this.state.isStart){

            this.change = setInterval(()=>this.changeNum(),this.state.playTime);

        }else{

            clearInterval(this.change);

        }

        this.setState({

            isStart:!this.state.isStart,

        })

    }

    changeNum(){

        if(this.state.nowImgNumber == 5){

            this.setState({

                nowImgNumber:0,

            })

        }else{

            this.setState({

                nowImgNumber:this.state.nowImgNumber+1,

            })

        }

    }

    handleSubmit = (flag)=>{

        clearInterval(this.change);

        if(flag == 1) {

            if (this.state.nowImgNumber == 5) {

                this.setState({

                    nowImgNumber: 0,

                    isStart:false,

                })

            } else {

                this.setState({

                    nowImgNumber: this.state.nowImgNumber + 1,

                    isStart:false,

                })

            }

        }else{

            if (this.state.nowImgNumber == 0) {

                this.setState({

                    nowImgNumber: 5,

                    isStart:false,

                })

            } else {

                this.setState({

                    nowImgNumber: this.state.nowImgNumber - 1,

                    isStart:false,

                })

            }

        }

        this.change = setInterval(()=>this.changeNum(),this.state.playTime);

    }

    handlePoint = (idNum)=>{

        clearInterval(this.change);

        this.setState({

            nowImgNumber:idNum,

            isStart:false,

        })

    }

    handlePointStart = ()=>{

        this.change = setInterval(()=>this.changeNum(),this.state.playTime);

    }

    componentWillUnmount(){

        clearInterval(this.change);

    }

    reviseTime = (time)=>{

        clearInterval(this.change);

        this.setState({

            playTime:this.state.playTime+time,

        })

        this.change = setInterval(()=>this.changeNum(),this.state.playTime + time);

    }

    render(){

        return(

            <div id='ImgApp'>

                <PlayImage num={this.state.nowImgNumber}/>

                <PlayImgBut id='leftB' value='<' onSubmit={this.handleSubmit}/>

                <PlayImgBut id='rightB' value='>' onSubmit={this.handleSubmit}/>

                <PlayPoints num={this.state.nowImgNumber} onPoint={this.handlePoint} start={this.handlePointStart}/>

                <StartBut onStart={this.handleStart.bind(this)} isStart={this.state.isStart} reviseTime={this.reviseTime} nowTime={this.state.playTime}/>

            </div>

        )

    }

}

export default PlayImgApp;

PlayImgBut:

import React,{Component} from 'react'

class PlayImgBut extends Component{

    handleSubmit = ()=>{

        if(this.props.onSubmit){

            if(this.props.value == '>'){

                this.props.onSubmit(1);

            }else{

                this.props.onSubmit(0)

            }

        }

    }

    render(){

        return(

            <a href='#'><div id={this.props.id} onClick={this.handleSubmit}>{this.props.value}</div></a>

        )

    }

}

export default PlayImgBut

PlayImgPoints:

import React,{Component} from 'react'

import PImgPoint from './PImgPoint'

class PlayImgPoints extends Component{

    createLi = ()=>{

        let array = [];

        for(let i = 0;i < 6;i++){

            if(i == this.props.num){

                let style =  {color:'deepskyblue'};

                array.push(<PImgPoint key={i} style={style} id={i} onPoint={this.props.onPoint} start={this.props.start}/>);

            }else{

                let style =  {color:'black'}

                array.push(<PImgPoint key={i} style={style} id={i} onPoint={this.props.onPoint} start={this.props.start}/>);

            }

        }

        return array;

    }

    render(){

        return(

            <div className='points'>

                {this.createLi()}

            </div>

        )

    }

}

export default PlayImgPoints;

PImgPoint:

import React,{Component} from 'react'

class PImgPoint extends Component{

    handlePoint = ()=>{

        if(this.props.onPoint){

            this.props.onPoint(this.props.id);

        }

    }

    reStart = ()=>{

        if(this.props.start){

            this.props.start();

        }

}

    render(){

        return(

            <a href='#' color='blue'><span id={this.props.id} className='point' style={this.props.style} onMouseOver={this.handlePoint} onMouseOut={this.reStart}>●</span></a>

        )

    }

}

export default PImgPoint;

index:

import React from 'react'

import ReactDOM from 'react-dom'

import PlayImgApp from './PlayImgApp'

import {createStore} from 'redux'

import App from './App'

import './PlayImage.css'

ReactDOM.render(

    <PlayImgApp/>,

    document.getElementById('root')

);

PlayImage:

import React,{Component} from 'react'

import image1 from './img/1.jpg'

import image2 from './img/2.jpg'

import image3 from './img/3.jpg'

import image4 from './img/4.jpg'

import image5 from './img/5.jpg'

import image6 from './img/6.jpg'

class PlayImage extends Component{

    render(){

        let images = [image1,image2,image3,image4,image5,image6]

        const src = 'img/'+this.props.num+'.jpg';

        return(

            <div>

                <img className='graph' src={images[this.props.num]}/>

                <img src={image3}/>

            </div>

        )

    }

}

export default PlayImage;

StartBut:

import React,{Component} from 'react'

class StartBut extends Component{

    handleStart=()=>{

        if(this.props.onStart){

            this.props.onStart();

        }

    }

    addPlayTime=(flag)=>{

        if(this.props.reviseTime){

            if(this.props.nowTime != 5000){

                this.props.reviseTime(+500)

            }

        }

    }

    reducePlayTime=()=>{

        if(this.props.reviseTime){

            if(this.props.nowTime != 0){

                this.props.reviseTime(-500)

            }

        }

    }

    render(){

        return(

            <div >

                <div id='isPlay' onClick={this.handleStart}>

                    <a href='#'>{this.props.isStart?'开始':'暂停'}</a>

                </div>

                <div>

                    <span className="controlTime">当前图片切换时间间隔为</span>

                    <span className="controlTime" id="showTime">{this.props.nowTime/1000}</span>

                    <span className="controlTime">秒</span>

                    <a href="#" id="reduce" onClick={this.reducePlayTime}><span className="controlTime" id="controlReduce">-0.5s</span></a>

                    <a href="#" id="add" onClick={this.addPlayTime}><span className="controlTime" id="controlAdd">+0.5s</span></a>

                </div>

            </div>

        )

    }

}

export default StartBut;

PlayImage.css:

body{

    background-color: #e6e6e6;

}

a{

    text-decoration: none;

    color: black;

}

#ImgApp{

    margin: auto;

    margin-top: 50px;

    width: 60%;

    height: 600px;

    background-color: white;

    border: solid 1px black;

    border-radius: 5px/5px;

    text-align: center;

}

.graph{

    margin-top: 30px;

    width: 80%;

    height: 480px;

    border-radius: 8px/8px;

}

#leftB,#rightB{

    font-size: 80px;

    position: absolute;

    top: 35%;

    color: black;

}

#leftB {

}

#rightB{

    right: +20%;

}

#leftB:hover,#rightB:hover{

    background-color: lightgray;

    border-radius:5px/5px;

}

#leftB:active,#rightB:active{

    background-color: darkgray;

    border-radius:5px/5px;

}

.points{

    letter-spacing: 40px;

    margin-top: 20px;

}

#isPlay{

    float:right;

    display: inline-block;

    margin-right: 10px;

    font-size: 20px;

    border: solid 3px deepskyblue;

    border-radius: 3px/3px;

    width: 3em;

    height: 30px;

    line-height: 30px;

}

#isPlay:hover{

    background-color: deepskyblue;

}

#isPlay:active{

    background-color: dodgerblue;

}

.controlTime{

    word-spacing: 10px;

    font-size: 30px;

    margin-bottom: 5px;

}

#controlAdd,#controlReduce{

    display: inline-block;

    border: solid 2px black;

    border-radius: 5px/5px;

    width: 90px;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容