react学习资料二

react:
hao123案例,可以通过控制台来获取一些数据填充:
复制网页上的一些内容,
var a = 粘贴的内容.split(/\s+/)
输入 a ,把获得的数组复制;

var Nav = React.createClass({
        //["2017年放假安排:全年放假均赶在周末", "二手房价下跌", "合肥房价开启暴跌模式", "牛!这名诗词才女亮相央视才惊四座", ""穿山甲公子"身份疑曝光", "照片被扒出", "女白领追剧到凌晨3点", "眼中长满结石", "女子春节相亲被纠缠:喜欢我哪我改!", "男子看别人女朋友", "自己女朋友被暴打", "山西一官员因保护小三打老婆被停职", "春节回家,这些都是你不能错过的经典!", ""]

    createLi:function(){
            var liDate = ["2017年放假安排:全年放假均赶在周末","二手房价下跌","合肥房价开启暴跌模式", 
            "牛!这名诗词才女亮相央视才惊四座","穿山甲公子身份疑曝光", 
            "照片被扒出","女白领追剧到凌晨3点","眼中长满结石","女子春节相亲被纠缠:喜欢我哪我改!", 
            "男子看别人女朋友","自己女朋友被暴打","山西一官员因保护小三打老婆被停职", 
            "春节回家,这些都是你不能错过的经典!"];
            //根据数据渲染虚拟dom,将渲染的返回出来 map forEach可以遍历,但是只有map有return
            return liDate.map(function(value,index,arrs){
                return (<li key={index}>{value}</li>)
            })
        },
    render:function(){//对于创建多个虚拟dom我们可以通过方法来渲染
        return (
            <div className="nav-part">
                <ul>
                
                    {this.createLi()}
                </ul>
            </div>
        )
    }
})

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

在cmd进入该文件夹,输入fis3 release -d ../test
cmd进入test文件夹,启动node服务 node app
浏览器输入localhost:3000查看效果

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

上面案例中,创建了一个组件Nav,有两个方法,其中要循环多个li,就可以用到map,注意return和{}的用法;在render中调用是:this.createLi()

注释:
在jsx中的注释可以卸载dom元素块的外面,也可以用{/**/}插值括号来写;

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

props属性

在html中div就是元素一样,我们可以对其添加不同的属性(id,class),或者是值来实现不同的功能不同的显示效果;
一个组件渲染出来样式一致,为了展现不同的样式行为,我们对其添加不同的属性;
但是添加的属性如何获取,组件中有个属性叫props,这个属性可以获取组件上添加的属性;

var Part = React.createClass({
    render:function(){
        // console.log(this.props); 
        //可以得到Object {fontColor: "red"} Object {fontColor: "green"}

        return (<h2 className={this.props.fontColor}>hello</h2>)
    }
})

ReactDOM.render(<Part fontColor="red" />,document.getElementById('app'))
ReactDOM.render(<Part fontColor="green" />,document.getElementById('app2'))

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

getDefaultProps设置默认的属性,如果新插入的组件没有设置title,会报错就用这个:

getDefaultProps:function(){
        return {
            title:['默认标题']
        }
    },

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

整个代码如下:

var Part = React.createClass({
    getDefaultProps:function(){
        return {
            title:['默认标题']
        }
    },
    createTitle:function(){
        return this.props.title.map(function(value,index){
            return (<li key={index}>{value}</li>)
        })
    },
    render:function(){
        console.log(this.props);
        // return (<h2 className={this.props.fontColor}>hello</h2>)

        return (
            <div className="part">
                <ul className="header">
                    {this.createTitle()}
                </ul>
            </div>
            )
    }
})

ReactDOM.render(<Part title={['今日要闻','深圳新闻']} />,document.getElementById('app'))
ReactDOM.render(<Part title={['今日话题']} />,document.getElementById('app2'))
ReactDOM.render(<Part title={['今日热播','影视剧','综艺']} />,document.getElementById('app3'))
ReactDOM.render(<Part />,document.getElementById('app3'))//这个就没有写titile

html部分:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    .part{
        width: 300px;
        color:#0873c0;
        margin: 20px;
        height: 300px;
    }
    ul{
        border-top: 2px solid #ccc;
    }
    ul li{
        margin-top: -2px;
        border-top: 2px solid #ccc;
        font-size: 14px;
        line-height: 30px;
        height: 30px;
        float: left;
        padding:0 20px;
        text-align: center;
    }
    ul li:hover{
        border-top-color: blue;
        cursor: pointer;
    }
    </style>
</head>
<body>
<div id="app"></div>
<div id="app2"></div>
<div id="app3"></div>
<script src="react.js"></script>
<script src="react-dom.js"></script>
<script src="js/07.jsx"></script>
    
</body>
</html>

fis-conf.js的内容:

fis.match('**.jsx',{
    parser:fis.plugin('babel2'),
    rExt:'.js'
})

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

设置样式

先看一段代码:

<script type="text/x-jsx">
    var Title = React.createClass({
        render:function(){
            var style ={
                color:'red',
                border:'1px solid #000',
                borderBottom:'5px solid #000',
                WebkitBoxShadow:'10px 10px 10px red'
            }
            return (<h1 style={style}>这是一个标题</h1>)
        
        }
    })
ReactDOM.render(< Title />,document.getElementById('app'))
</script>

在元素虚拟dom里写样式需要这样:style={{ color : 'red' }},所以我们可以通过定义插值的方式:

var style ={
                color:'red',
                border:'1px solid #000',
                borderBottom:'5px solid #000',
                WebkitBoxShadow:'10px 10px 10px red'
            }
            return (<h1 style={style}>这是一个标题</h1>)

样式名有-的都要用驼峰式的写法,首字母小写;
但是CSS3兼容性的属性名,例如-webkit-box-shadow就要首字母大写写成WebkitBoxShadow;
由此可见,其实是否大写取决于前面是否有-;

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

那么创建虚拟dom的语法中如何设置样式呢?

var h1 = React.createElement('h1',
{
style:{color:'red'}
},'今天天气真好')
ReactDOM.render(h1,document.getElementById('app'))

记住:
ReactDOM.render(h1,document.getElementById('app'))
中对第一个参数使用</>是针对创建组件的类名,这里就不需要;

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

react事件

react中为虚拟dom添加事件和html中为dom添加事件一样:<div onclick=""></div>
通常我们为react添加的dom是一个方法,所以不要写在字符中,因此要用插值符号为虚拟dom添加事件回调函数;

绑定一个click事件,记得驼峰式onClick:

var Demo = React.createClass({
    clickButton:function(){
        console.log(111)
    },
    render:function(){
        return (
            <div>
                <button onClick={this.clickButton} >显示下面的内容</button>
            </div>
            )
    }
})

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

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

state状态

getInitialState 函数返回一个对象{}
setState来修改state的对象

如果一个组件在渲染到页面之后不会变化,那么我们通过props可以实现对组件样式的设置以及行为的渲染;
这些组件不会受到外界的影响,组件是一成不变的,这类组件叫无状态组件;
对于大部分组件来说,通常是要与用户交互的,此时组件要处在不同的状态,组件自身就应该要有状态,有状态组件;

对于组件内部的状态控制,我们可以通过state属性来控制

getInitialState:function(){
        return {
            index:0,
            text:''
        }
    }

可以通过事件来更改状态的值:

clickButton:function(){
        this.setState({
            text:'显示的文案'
        })
    }

完整的代码如下:

var Demo = React.createClass({
    clickButton:function(){
        this.setState({
            text:'显示的文案'
        })
    },
    getInitialState:function(){
        return {
            index:0,
            text:''
        }
    },
    render:function(){
        console.log(this.state)
        return (
            <div>
                <button onClick={this.clickButton} >显示下面的内容</button>
                <p>{this.state.text}</p>
            </div>
            )
    }
})

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

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

来实现一个点击小图换大图背景的小案例

思路:批量创建li然后通过插值放入到大盒子里面,在Li上绑定事件changeBg来修改state状态,实现对大图的更换;

var Skin = React.createClass({
    createLi:function(){
        var arr = [];
        for(var i=1;i<13;i++){
            arr.push((<li onClick={this.changeBg} key={i}><img src={'skin/small_'+ (i >9 ? i :'0'+i )+ '.jpg'} data-id={i} alt=''/> </li>))
        }
        return arr;
    },
    changeBg:function(e){
        var id = e.target.getAttribute('data-id');
        this.setState({
            bg: 'url(skin/big_'+ (id > 9 ? id : '0' + id ) +'.jpg)'
        })
    },
    getInitialState:function(){
        return {
            bg: ''
        }
    },
    render:function(){
        // console.log(this.state.bg)
        var style={
            backgroundImage:this.state.bg
        };
        return (
        <div style={style} className="skin">
            <div className="list">
                <ul>
                    {this.createLi()}
                </ul>
            </div>
        </div>  
        )
    }
})
ReactDOM.render(<Skin />,document.getElementById('app'))

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

推荐阅读更多精彩内容

  • 最近看了一本关于学习方法论的书,强调了记笔记和坚持的重要性。这几天也刚好在学习React,所以我打算每天坚持一篇R...
    gaoer1938阅读 1,666评论 0 5
  • 本笔记基于React官方文档,当前React版本号为15.4.0。 1. 安装 1.1 尝试 开始之前可以先去co...
    Awey阅读 7,641评论 14 128
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,809评论 1 18
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,044评论 0 29
  • 老家隔壁村有个二胖嫂,几乎每次回家都能在路边看到她。她总是一样的两条辫子垂在肩头,一样的面前放着一盆螺蛳或者一篮青...
    朴朴纳蓝阅读 442评论 6 7