react学习资料五

本节主要是类库使用的案例

回顾生命周期三个阶段

我们先来回顾一下创建时期的5阶段

  1. getDefaultProps 设置组件的默认属性,返回一个对象;
  2. getInitialState 设置初始化状态,返回一个对象,保存组件默认状态,可以获取组件的属性,可以用属性设置状态;
  3. componetWillMount 组件即将被创建,属性和状态都已经而已经可以获取;
  4. render 渲染输出虚拟dom,这些元素还不能使用;
  5. componentDinMount 组件构建完成,这个阶段可以使用上一个阶段创建的虚拟dom元素;

this.props
this.state
this.setState

我们再来回顾一下更新时期(成长期)的5个阶段,组件每一次状态或属性的更新都会调用一遍这五个阶段的方法;
1、componentWillReceiveProps:表示组件将要接收新的属性有个参数:nextProps 表示新的属性在这个方法中,我们可以获取到组件更新的属性,这个方法只有当组件更新属性的时候才会被调用;状态更新不会被调用。
2、shouldComponentUpdate:表示判断组件是否应该更新,返回一个布尔值,true表示要对组件更新,false不要对组件更新,后面阶段就不会再执行;接收两个参数,第一个参数nextprops表示下一个属性,第二个参数nextstate表示下一个状态;如果return false,后面三个阶段方法就不再会执行;
3、componentWillUpdate:表示组件将要被更新,接收两个参数,第一个参数nextprops表示下一个新属性,第二个参数nextstate表示下一个新状态;
4、render:表示重新渲染组件,所以创建的五个阶段中render会调用多次的原因就在于这,更新的时候也会调用;输出一个dom树。
5、componentDidUpdate:表示组件已经被更新,接收两个参数,第一个参数表示原来的属性,第二个参数表示原来的状态;

最后我们回顾下组件的销毁时期
componentWillUnmount:组件在dom树中删除时执行;

==================================================================================

类库的使用

1. 我们有一个放大镜的类库,代码如下:

var Imagezoom = function(dom,url,width){
    this.dom = dom;
    this.url = url;
    this.width = width;
    //创建盒子元素和图片元素
    this.imgDom = document.createElement('img')
    this.divDom = document.createElement('div')
    this.init()
}   
Imagezoom.prototype={
    init:function(){
        var me = this;
        this.loadImage(function(){
            //图片加载成功后创建视图
            me.creatView()
            //为img绑定事件
            me.bindEvent(me)
        })
    },
    //图片加载后要创建视图,
    loadImage:function(fn){
        var me = this;
        var img = new Image();
        img.onload = function(){
            me.zoom = img.width / me.width;//倍数
            me.height = me.width * img.height /img.width;
            me.imgWidth = img.width;
            me.imgHeight = img.height;
            fn()
        }
        img.src = this.url;
    },
    //创建放大器的视图
    creatView:function(){

        this.dom.className = 'img-zoom';
        this.dom.style.width = this.width+'px';
        //设置图片和盒子的宽度和高度
        this.imgDom.style.width = this.width + 'px';
        this.imgDom.style.height = this.height + 'px';
        this.divDom.style.width = this.width + 'px';
        this.divDom.style.height = this.height + 'px';
        //设置图片
        this.imgDom.src = this.url;
        this.divDom.style.background ='url('+ this.url +')'
        this.dom.appendChild(this.imgDom);
        this.dom.appendChild(this.divDom);
        
    },
    bindEvent:function(me){
        this.imgDom.onmousemove = function(e){
            // console.log(e.x ,e.y)
            var x = e.offsetX*me.zoom ;
            var y = e.offsetY*me.zoom ;
            // console.log(x ,y)
            //边界,向左移动,大图坐标点x加上盒子的宽度divDom.width 要小于图片的宽度
            if(x + me.width < me.imgWidth){

            me.divDom.style.backgroundPositionX= -x+ 'px';
            };
                // console.log(y,me.height,me.imgHeight)
            if(y + me.height < me.imgHeight){
                me.divDom.style.backgroundPositionY= -y+ 'px';
            }
        }
    }
}

2. 我们HTML上引用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用非react类库</title>
    <style>
    *{
        margin: 0;
        padding: 0;
        list-style: none;
    }
    .img-zoom{
        position: relative;
    }
    .img-zoom div{
        position: absolute;
        top: 0;
        left:100%;
    }
    </style>
</head>
<body>
<div id="app"></div>
<div id="app2"></div>

<script src="js/imagezoom.js"></script>
<script src="react.js"></script>
<script src="react-dom.js"></script>
<script src="js/23.js"></script>
<script >
 // new Imagezoom(document.getElementById('app'),'3d.jpg',400)
 // new Imagezoom(document.getElementById('app2'),'3d.jpg',400)
</script>
    
</body>
</html>

3. jsx代码如下:

//创建一个容器组件
var Main = React.createClass({
    getInitialState:function(){
        return {
            url:'3d.jpg',
            width:200
        }
    },
    render:function(){
        return (
        <div>
            <div className="imgzoom" ref="imgzoom"></div>
        </div>
        )
    },
    componentDidMount:function(){
        //页面已经创建到可以实例化
        new Imagezoom(this.refs.imgzoom,this.state.url,this.state.width)
    }
})

ReactDOM.render(<Main/> ,document.getElementById('app'))

============================================================================

另一个案例

如果要用Jquery库:

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用非react类库</title>
    <style>
    *{
        margin: 0;
        padding: 0;
        list-style: none;
    }
    
    </style>
</head>
<body>
<div id="app"></div>

<script src="js/jquery.js"></script>
<script src="react.js"></script>
<script src="react-dom.js"></script>
<script src="js/24.jsx"></script>

    
</body>
</html>

jsx代码:

var NewsList = React.createClass({
    getInitialState:function(){
        return {
            list:['特朗普新馆商人三把火','被怼了回去','特朗普不是强势政府']
        }
    },
    getNewsList:function(){
        return this.state.list.map(function(value,index){
            return (<li key={index}>{value}</li>)
        })
    },
    render:function(){
        return(
        <div>
            <ul id="news_list">{this.getNewsList()}</ul>
        </div>
        )
    },
    //jq
    componentDidMount:function(){
        $('#news_list li').css('background','green');
        var me = this;
        //5秒后增加新的
        setTimeout(function(){
            me.setState({
                list:me.state.list.concat(['法院起诉特朗普','特朗普却在度假','特朗普推特大骂澳大利亚'])
            })
        },5000)
        
    },
    componentDidUpdate:function(){
            $('#news_list li').css('background','yellowgreen');
    }
})

ReactDOM.render(< NewsList />,document.getElementById('app'))

我们会发现,componentDidMount这个阶段我们用jquery对背景颜色进行了更改,但是延迟5秒执行的新闻并不会有背景颜色,这是因为,创建的5个阶段只会执行一次,所以我们在更新的5个阶段的第五个阶段componentDidUpdate再次执行jquery代码;

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

推荐阅读更多精彩内容

  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,834评论 1 18
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,967评论 6 13
  • react: 组件的生命周期 react设计组件的时候,将组件设计设计成有生命的,因此他就有创建的时候,成长更新的...
    九泰修行阅读 465评论 0 0
  • 钟山之上卧逸仙 俯瞰河山一片天 浮生半日八百步 不止天下人来观
    春水凭栏眺阅读 306评论 0 0
  • 小庄说, “这个世界变了, 我们都不再适合这个江湖, 我们太念旧了!” 念旧的人 在哪个时代都不容易生存, 有多少...
    玛奇朵828阅读 349评论 0 0