状态、属性、组件API、组件的生命周期

当react的状态改变时,自动执行this.render()方法更新组件
ES6写React的时候,事件里不会自动绑定this,需要自己绑定,或者直接在constructor里写方法

constructor(props) {
    super(props);
    this.state = {
        liked: false
    };
    this.handleClick = (e) => {
        this.setState({liked: !this.state.liked});
    };
}

状态

import React from 'react';

class LikeButton extends React.Component {
    // es6用constructor代替getInitialState
    constructor(props) {
        super(props);
        this.state = {
            liked: false
        }
    }
    handleClick (e) {
        this.setState({liked: !this.state.liked})
    }
    render () {
        let text = this.state.liked ? '喜欢': '不喜欢';

        return (
            <div>
                <p onClick={this.handleClick.bind(this)}>
                    你喜欢红茶吗?{text}
                </p>
            </div>
        )
    }
}

export default LikeButton;

props
HelloMessage.jsx

import React from 'react';

class HelloMessage extends React.Component {
    render () {
        return (
            <div>
                Hello, {this.props.name}
            </div>
        )
    }
}

export default HelloMessage;

main.js

import React from 'react';
import ReactDOM from 'react-dom';

import HelloMessage from './component/HelloMessage';

const app = document.getElementById('app');

ReactDOM.render(<HelloMessage name="Runoob"/>, app);

props验证
可以保证应用组件被正确使用
React.PropTypes提供很多验证器(validator)来验证传入数据是否有效。当props传入无效数据时,JavaScript控制台会抛出错误。

import React from 'react';

class HelloMessage extends React.Component {
    render () {
        return (
            <div>
                Hello, {this.props.name}
            </div>
        )
    }
}

// getDefaultProps要写在外部
HelloMessage.defaultProps = {
    name: 'this is default name'
};

HelloMessage.propTypes = {
    name: React.PropTypes.string.isRequired
};

export default HelloMessage;

更多验证器

React.createClass({
  propTypes: {
    // 可以声明 prop 为指定的 JS 基本数据类型,默认情况,这些数据是可选的
   optionalArray: React.PropTypes.array,
    optionalBool: React.PropTypes.bool,
    optionalFunc: React.PropTypes.func,
    optionalNumber: React.PropTypes.number,
    optionalObject: React.PropTypes.object,
    optionalString: React.PropTypes.string,

    // 可以被渲染的对象 numbers, strings, elements 或 array
    optionalNode: React.PropTypes.node,

    //  React 元素
    optionalElement: React.PropTypes.element,

    // 用 JS 的 instanceof 操作符声明 prop 为类的实例。
    optionalMessage: React.PropTypes.instanceOf(Message),

    // 用 enum 来限制 prop 只接受指定的值。
    optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),

    // 可以是多个对象类型中的一个
    optionalUnion: React.PropTypes.oneOfType([
      React.PropTypes.string,
      React.PropTypes.number,
      React.PropTypes.instanceOf(Message)
    ]),

    // 指定类型组成的数组
    optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),

    // 指定类型的属性构成的对象
    optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),

    // 特定 shape 参数的对象
    optionalObjectWithShape: React.PropTypes.shape({
      color: React.PropTypes.string,
      fontSize: React.PropTypes.number
    }),

    // 任意类型加上 `isRequired` 来使 prop 不可空。
    requiredFunc: React.PropTypes.func.isRequired,

    // 不可空的任意类型
    requiredAny: React.PropTypes.any.isRequired,

    // 自定义验证器。如果验证失败需要返回一个 Error 对象。不要直接使用 `console.warn` 或抛异常,因为这样 `oneOfType` 会失效。
    customProp: function(props, propName, componentName) {
      if (!/matchme/.test(props[propName])) {
        return new Error('Validation failed!');
      }
    }
  },
  /* ... */
});

React组件API
setState 设置状态
replaceState 替换状态
setProps 设置属性
replaceProps 替换属性
forceUpdate 强制更新
findDOMNode 获取DOM节点,查找真实DOM

React.findDOMNode()只在mounted组件中调用,如果在组件的render()方法中调用React.findDOMNode()就会抛出异常。

React组件的生命周期
组件生命周期的三个状态
Mounting: 已插入真实DOM
Updating: 正在被重新渲染
Unmounting: 已移除真实DOM

生命周期方法
componentWillMount 在渲染前调用,在客户端也在服务端
componentDidMount 在第一次渲染后调用,只在客户端。
之后组件已经生成了对应的DOM结构,可以通过this.getDOMNode()来进行访问。
如果你想和其他JavaScript框架一起使用,可以在这个方法中调用setTimeout, setInterval或者发送AJAX请求等操作(防止异部操作阻塞UI)。
componentWillReceiveProps 在初始化render时不会被调用,当组件接收到一个新的prop时被调用
shouldComponentUpdate 返回一个布尔值。当确认不需要更新组件时使用。在组件接收到新的state或新的props时被调用。在初始化时或使用forceUpdate时不被调用
componentWillUpdate 初始化不会调用。组件接收到新的state或者props但还没有render时被调用
componentDidUpdate 初始化不会调用。组件完成更新后立即调用。
componentWillUnmount 组件从DOM中移除的时候立刻被调用。

用state判断是否已经插入真实DOM

componentWillMount() {
    this.mounted = false;
}
componentDidMount() {
    this.mounted = true;
}

需求:写一个实例,在组件加载以后,通过componentDidMount设置一个定时器,改变组件的透明度并重新渲染
HelloMessage.jsx

import React from 'react';

class HelloMessage extends React.Component {
    constructor (props) {
        super(props);
        this.state = {
            opacity: 1.0
        };
    }
    componentDidMount () {
        this.timer = setInterval(() => {
            let opacity = this.state.opacity;
            opacity -= 0.05;
            if(opacity <= 0.1) {
                opacity = 1.0;
            }
            this.setState({
                opacity: opacity
            });
        }, 100);
    }
    render () {
        let myStyle = {
            fontFamily: 'microsoft yahei',
            width: '100%',
            height: '100px',
            background: 'red',
            opacity: this.state.opacity
        };

        return (
            <div style={myStyle}>
                Hello, {this.props.name}
                <p>{this.state.opacity}</p>
            </div>
        )
    }
}

// getDefaultProps要写在外部
HelloMessage.defaultProps = {
    name: 'this is default name'
};

HelloMessage.propTypes = {
    name: React.PropTypes.string.isRequired
};

export default HelloMessage;

另一个实例,体现react的生命周期

import React from 'react';

class Content extends React.Component {
    componentWillMount () {
        console.log('组件将被插入到真实DOM');
    }
    componentDidMount () {
        console.log('已经插入真实DOM');
    }
    componentWillReceiveProps (newProps) {
        console.log('组件将要接收属性,新属性是:');
        console.log(newProps);
    }
    shouldComponentUpdate (newProps, newState) {
        return true;
    }
    componentWillUpdate (nextProps, nextState) {
        console.log('组件将要更新,下一个属性:' + nextProps + ',下一个状态:' + nextState);
        console.log(nextProps);
    }
    componentDidUpdate (prevProps, prevState) {
        console.log('组件已更新,上一个属性:' + prevProps + ',上一个状态:' + prevState);
        console.log(prevProps);
    }
    componentWillUnmount () {
        console.log('已经移除真实DOM');
    }
    render () {
        return (
            <div>
                次数:{this.props.myNum}
            </div>
        )
    }
}

class Increment extends React.Component {
    constructor (props) {
        super(props);
        this.state = {
            data: 0
        };
    }
    setNewNumber () {
        this.setState({
            data: this.state.data + 1
        });
    }
    render () {
        return (
            <div>
                <button onClick={this.setNewNumber.bind(this)}>Increment</button>
                <Content myNum={this.state.data}/>
            </div>
        )
    }
}

export default Increment;

未完待续 ... ...

React核心内容归纳总结的更多相关文章

  1. let import export React入门实例教程 connect provider combineReducers 箭头函数 30分钟掌握ES6/ES2015核心内容 Rest babel

    let与var的区别 http://www.cnblogs.com/snandy/archive/2015/05/10/4485832.html es6 导入导出 http://www.csdn.ne ...

  2. ES6/ES2015核心内容

    ECMAScript定义了: JS语言语法 – 语法解析规则.关键字.语句.声明.运算符等. 类型 – 布尔型.数字.字符串.对象等. 原型和继承 内建对象和函数的标准库 – JSON.Math.数组 ...

  3. 30分钟掌握ES6/ES2015核心内容

    30分钟掌握ES6/ES2015核心内容   ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript ...

  4. 30分钟掌握ES6/ES2015核心内容(下)

    在 30分钟掌握ES6/ES2015核心内容(上)我们讲解了es6最常用的一些语法:let, const, class, extends, super, arrow functions, templa ...

  5. React 核心思想之声明式渲染

    React 发展很快,概念也多,本文目的在于帮助初学者理清 React 核心概念. React 及 React 生态 React 的核心概念只有 2 点: 声明式渲染(Declarative) 基于组 ...

  6. struts2框架的核心内容

     Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Ac ...

  7. Python编程核心内容之一——Function(函数)

    Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ 截至上篇随笔<Python数据结构之四--set(集合)>,Python基础知识也介绍好了.接下来准备干 ...

  8. Python编程核心内容 ---- Function(函数)

    Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ 截至上篇随笔<Python数据结构之四——set(集合)>,Python基础知识也介绍好了.接下来准备干 ...

  9. web手工项目04-测试报告的核心内容-HTTP请求和响应-fiddler工具进行抓包

    回顾 登录功能测试(需求分析(输入分析,处理分析,输出分析),数据构造,编写用例) 测试点设计思路--扩展(相关业务,特殊角度-分支,异常,逆向) 流程图元素与画法(开始/结束,路径,数据,判定,步骤 ...

随机推荐

  1. HUST 1605 Gene recombination

    简单广搜.4进制对应的10进制数来表示这些状态,总共只有(4^12)种状态. #include<cstdio> #include<cstring> #include<cm ...

  2. linux命令学习5-pssh命令

    pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问. 1. ...

  3. leetcode--009 Linked List Cycle I

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZgAAACACAIAAAC5q+hAAAAJ+UlEQVR4nO2dwbXrKBJAOyelRShEQw

  4. iOS开发网络数据之AFNetworking使用 分类: ios技术 2015-04-03 16:35 105人阅读 评论(0) 收藏

    http网络库是集XML解析,Json解析,网络图片下载,plist解析,数据流请求操作,上传,下载,缓存等网络众多功能于一身的强大的类库.最新版本支持session,xctool单元测试.网络获取数 ...

  5. 虚拟机联网及远程连接-Linux基础环境命令学习笔记

    1.ifconfig命令=ip a命令,查看IP地址 网卡默认名称eth0. Bcast 广播地址2.xshell or secureCRT远程连接 ssh root@地址 xmanager 远程桌面 ...

  6. 获取url参数和时间格式化

    1. 获取url参数: var url = request("url"); //获取url参数 function request(paras) { //decodeURI() 函数 ...

  7. Hooking Android System Calls for Pleasure and Benefit

    The Android kernel is a powerful ally to the reverse engineer. While regular Android apps are hopele ...

  8. UVa 524 - Prime Ring Problem

    题目大意:输入正整数n,把整数1,2...,n组成一个环,使得相邻两个整数之和均为素数.输出时从整数1开始逆时针(题目中说的不是很明白??)排列.同一个环应恰好输出一次. 枚举,并在枚举每一个数是进行 ...

  9. Hibernate详细教程

    一.搭建Hibernate环境 1.在src目录下创建hibernate.cfg.xml配置文件 PS:文件的名字不能改! <?xml version="1.0" encod ...

  10. //@sourceURL=filename.js

    在 console 中输入代码的最后一行加上 //@ sourceURL=filename.js, 会在 Scripts 面板中有个叫 filename.js 的文件, 然后他就和外部 js 文件一样 ...