三重水的博客

在变化当中不断记录自己,充实自己,浏览自己

React学习笔记

我的理解

React是基于状态驱使的。在整个React开发中,你会体会到,组件的状态贯穿着一切,一切都是基于状态驱使开发的。

为什么使用React

React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript 库。很人多认为 React 是 MVC 中的 V(视图)。

我们创造 React 是为了解决一个问题:构建随着时间数据不断变化的大规模应用程序。为了达到这个目标,React 采用下面两个主要的思想。

简单

仅仅只要表达出你的应用程序在任一个时间点应该长的样子,然后当底层的数据变了,React 会自动处理所有用户界面的更新。

表达能力

当数据变化了,React 概念上是类似点击了更新的按钮,但仅会更新变化的部分。

语法

1
2
3
4
5
6
7
8
//穿件一个组件
var MyComponent = React.createClass({
    render: function(){
        return <h1>hello world!</h1>;
    }
})
//把组件渲染到页面body中
React.render(<MyComponent></MyComponent>,document.body)

可配置的函数

初始化中的函数

  • getDefaultProps //初始化属性,只调用一次,实例之间共享引用
  • getInitialState //初始化每个实例特有的状态
  • componentWillMount //render之前最后一次修改状态的机会
  • render //只能访问this.props和this.state,只有一个顶层组件,不允许修改状态和DOM输出
  • componentDidMount //成功render并渲染完成真实DOM之后触发,可以修改DOM

改变状态时,触发的运行中的函数

  • componentWillReceiveProps //父组件修改属性时触发,可以修改属性、状态
  • shouldComponentUpdate //是否让组件更新渲染到页面当中,返回fasle会阻止render的执行,返回true,则会执行render
  • componentWillUpdate //组件更新之前最后一次要执行的,不能修改属性和状态
  • render //执行渲染
  • componentDidUpdate //组件更新后的操作,可以修改DOM
  • componentWillUnmount //在删除组件之前进行清理操作,比如计数器和事件监听器等

以上函数,会从上到下依次执行。运行中的函数需要执行的条件是:状态改变才会依次执行,状态不断更新时,运行中的函数会不断循环执行。运行中的函数是由状态驱使的。

代码实战

执行React所需要的代码结构如下:

首先引入两个js

1
2
<script src="react.js"></script>
<script src="JSXTransformer.js"></script>

然后在下边即可写入React的组件代码了

1
2
3
4
5
<script src="react.js"></script>
<script src="JSXTransformer.js"></script>
<script type="text/jsx">// 注意这里的type='text/jsx'
    //这里可以写入你的代码
</script>

实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div id="box"></div>
<script src="build/react.js"></script>
<script src="build/JSXTransformer.js"></script>
<script type="text/jsx">
    var style={
        color:"blue",
        border:"1px solid #ddd"
    };
    var rawHTML = {
        __html:"<span>I'm inner HTML</span>"
    };
    //初始化,创建一个组件
    var HelloWorld = React.createClass(
            {
                //初始化中的函数
                getDefaultProps:function() {//只调用一次,实例之间共享引用
                    console.log('getDefaultProps,1');
                },
                getInitialState:function() {// 初始化每个实例特有的状态
                    console.log('getInitialState,2');
                    return null;
                },
                componentWillMount:function() {//render之前最后一次修改状态的机会
                    console.log('componentWillMount,3');
                },
                render: function() {//只能访问this.props和this.state,只有一个顶层组件,不允许修改状态和DOM输出
                    console.log('4');
                    return <p>Hello ,{this.props.name1 + " " + this.props.name2}</p>;
                },
                componentDidMount:function() {//成功render并渲染完成真实DOM之后触发,可以修改DOM
                    console.log('componentDidMount,5');
                },
                //运行中的函数
                componentWillReceiveProps:function(obj) {//父组件修改属性触发,可以修改新属性、修改状态
                    console.log("运行中:1");
                    console.log(obj);//obj为接收到修改了属性的对象,对象包含了修改后的属性在里边
                },
                shouldComponentUpdate: function() {//返回false会阻止render调用
                    console.log("运行中:2");
                    return true;
                },
                componentWillUpdate: function() {//不能修改属性和状态
                    console.log("运行中:3");
                },
                componentDidUpdate:function() {//可以修改DOM
                    console.log("运行中:5");
                    var newNode = document.createElement('span');
                    newNode.innerHTML = 'sups';
                    React.findDOMNode(this).appendChild(newNode);
                },
                //销毁阶段,即把我的这个组件移出后执行的回调函数
                componentWillUnmount: function() {//在删除组件之前进行清理操作,比如计时器和事件监听器
                    alert('销毁,我是子组件');
                }
            }
    );
    var HelloUniverse = React.createClass({
        getInitialState: function() {
            return {
                name1:"wen",
                name2:"yang"
            }
        },
        handleChange: function(event) {
            if(event.target.value === "123"){
                React.unmountComponentAtNode(document.body);//移除body里的所有组件
                return;
            }
            this.setState({
                name:event.target.value
            });
        },
        render: function () {
            return <div><HelloWorld  {...this.state}></HelloWorld>
             <br/>
             <input type="text" onChange={this.handleChange} />
            </div>
        },
        //销毁阶段,即把我的这个组件移出后执行的回调函数
        componentWillUnmount: function() {//在删除组件之前进行清理操作,比如计时器和事件监听器
            alert('销毁,我是父组件');
        }
    });
    //把组件渲染到页面中
    React.render(<div style={style}><HelloUniverse></HelloUniverse></div>, document.body);//把标签渲染到body标签中
</script>
</body>
</html>

更多例子可以到我的github上下载react-test

参考质料

React中文站

极客学院ReactJS视频

评论