React入门

目前对React已初步入门,因此将自己学习的进行了总结,希望能够能够帮到更多的人,也希望大家一起交流学习进步,深入学习React

现在给大家以简单事例代码直接来看如何理解入门React

1.从实现Hello World入门React

任何一门语言入门,都是以Hello World显示来实现,学习React我们也以Hello World来实现。

HTML静态页面实现:

<!DOCTYPE html>

<html>

<head>

<title></title>

</head>

<body>

<div>Hello World</div>

</body>

</html>

如何通过React来实现

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title></title>

<!-- 使用React需先引入对应js

react.js 核心库

react-dom.js 提供与DOM相关的功能

browser.js 将JSX语法转换为Javascript语法

-->

<script src="../build/react.js"></script>

<script src="../build/react-dom.js"></script>

<script src="../build/browser.min.js"></script>

</head>

<body>

<div id="example"></div>

<script type="text/babel">

ReactDOM.render(

<h1>Hello, world!</h1>,

document.getElementById('example')

);

</script>

</body>

</html>

2.了解JSXjavascript xml)语法

可以理解为React自己定义的一种语言,不影响功能,将HTMLjavascript混写

<!DOCTYPE html>

<html>

<head>

<title></title>

<script src="../build/react.js"></script>

<script src="../build/react-dom.js"></script>

<script src="../build/browser.min.js"></script>

</head>

<body>

<div id="container"></div>

<script type="text/babel">

var names = ['Alice', 'Emily', 'Kate'];

 

ReactDOM.render(

<div>

{

names.map(function(name) {

return <div>Hello, {name}!</div>

})

}

</div>,

document.getElementById("container"));

</script>

</body>

</html>

3.认识React的组件component

组件其实很简单,就是类似于将对应的内容封装,然后应用,React的组件创建方法为React.createClass(),以第一步的Hello World为例,提取为组件,然后插入对应的位置

<!DOCTYPE html>

<html>

<head>

<title></title>

<script src="../build/react.js"></script>

<script src="../build/react-dom.js"></script>

<script src="../build/browser.min.js"></script>

</head>

<body>

<div id="container"></div>

<script type="text/babel">

    // 定义一个组件名,注意组件名首字母要大些

    var HelloWorld = React.createClass({

            render: function() {

                    return <h1>Hello Wolrd!</h1>

            }

    });

 

ReactDOM.render(

<HelloWorld />,

document.getElementById("container"));

</script>

</body>

</html>

4.有了组件的认识,我们尝试在组件中添加样式、通过组件模板设置属性,在组件中获取等栗子

<!DOCTYPE html>

<html>

<head>

<title></title>

<script src="../build/react.js"></script>

<script src="../build/react-dom.js"></script>

<script src="../build/browser.min.js"></script>

<style type="text/css">

.clr {

color:  red;

}

</style>

</head>

<body>

<div id="container"></div>

<script type="text/babel">

    var HelloWorld = React.createClass({

            render: function() {

                    return <h1 className="clr">{this.props.name},Hello Wolrd!</h1>

            }

    });

 

    var HelloWorld1 = React.createClass({

            render: function() {

                    return <h1 style={{color: 'red'}}>{this.props.name},Hello Wolrd!</h1>

            }

    });

 

    var clr = {

                    color: 'red'

            }

            var data = 123;

    var HelloWorld2 = React.createClass({

            propTypes: {

                    title: React.PropTypes.string.isRequired,

            },

 

            render: function() {

                    return <h1 style={clr}>{this.props.title},Hello Wolrd!</h1>

            }

    });

 

ReactDOM.render(

<div>

<HelloWorld name="Tom"/> <HelloWorld1 name="Jerry"/> <HelloWorld2 title={data} />

</div>,

document.getElementById("container"));

</script>

</body>

</html>

5.举了些栗子,需要了解下组件的声明周期

React有三个周期,MountUpdateUnmount

React入门

通过下面的执行顺序理解

React入门

代码执行:

<!DOCTYPE html>

<html>

<head>

<title></title>

<script src="../build/react.js"></script>

<script src="../build/react-dom.js"></script>

<script src="../build/browser.min.js"></script>

<style type="text/css">

.clr {

color:  red;

}

</style>

</head>

<body>

<div id="container"></div>

<script type="text/babel">

    var HelloWorld = React.createClass({

            getDefaultProps: function() {

                    console.log("getDefaultProps");

                    return {

                            name: "Jerry"

                    };

            },

 

            getInitialState: function() {

                    console.log("getInitialState");

                    return {

                            opacity: 1.0

                    };

            },

 

            componentWillMount: function() {

                    console.log("componentWillMount");

            },

 

            componentDidMount: function() {

                    console.log("componentDidMount");

                    this.timer = setInterval(function() {

                            var opacity = this.state.opacity;

                            opacity -= 0.5;

                            if(opacity< 0.1) {

                                    opacity = 1.0;

                            }

                            this.setState({

                                    opacity: opacity

                            });

                    }.bind(this), 100);

            },

 

            componentWillUpdate: function(nextProps, nextState) {

                    console.log("componentWillUpdate"+ ":" + nextProps + ":" + nextState);

            },

 

            componentDidUpdate: function(prevProps, prevState) {

                    console.log("componentDidUpdate"+ ":" + prevProps + ":" + prevState);

            },

 

            componentWillUnmount: function() {

                    console.log("componentWillUnmount");

            },

 

            render: function() {

                    console.log("render");

                    return <h1 className="clr" style={{opacity: this.state.opacity}}>{this.props.name},Hello Wolrd!</h1>

            }

    });

 

ReactDOM.render(

<HelloWorld />,

document.getElementById("container"));

</script>

</body>

</html>

执行结果:

此代码在componentDidMount方法通过定时器来调整state变化,执行打印结果:

embedded:5 getDefaultProps

embedded:12 getInitialState

embedded:19 componentWillMount

embedded:49 render

embedded:23 componentDidMount

embedded:37 componentWillUpdate:[object Object]:[object Object]

embedded:49 render

embedded:41 componentDidUpdate:[object Object]:[object Object]

embedded:37 componentWillUpdate:[object Object]:[object Object]

embedded:49 render

embedded:41 componentDidUpdate:[object Object]:[object Object]

embedded:37 componentWillUpdate:[object Object]:[object Object]

embedded:49 render

embedded:41 componentDidUpdate:[object Object]:[object Object]

 

 

发现执行顺序:

getDefaultProps  ---getInitialState  ---componentWillMount  ---render ---componentDidMount ---componentWillUpdate  ---render  ---componentDidUpdate

 

下面三个事件重复执行,由于state的修改,导致在周期Update过程中重复执行。

6.事件监听

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title></title>

<script src="../build/react.js"></script>

<script src="../build/react-dom.js"></script>

<script src="../build/browser.min.js"></script>

<style type="text/css">

.clr {

color:  red;

}

</style>

</head>

<body>

<div id="container"></div>

<script type="text/babel">

    var Input = React.createClass({

getInitialState: function() {

return {value: 'Hello!'};

},

 

handleChange: function(event) {

this.setState({value: event.target.value});

},

 

render: function() {

var value = this.state.value;

return <div>

<input type="text" value={value} onChange={this.handleChange} />

<p>{value}</p>

</div>

}

});

 

var ButtonEvent = React.createClass({

handleClick: function() {

console.log(this.refs.tip.style.display);

if(this.refs.tip.style.display === 'none') {

this.refs.tip.style.display = 'inline';

} else {

this.refs.tip.style.display = 'none';

}

 

event.stopPropagation();

event.preventDefault();

},

 

render: function() {

return <div>

<button onClick={this.handleClick}>显示|隐藏</button><span ref="tip">测试按钮触发事件</span>

</div>

}

});

 

ReactDOM.render(

<div>

<Input /> <ButtonEvent />

</div>,

document.getElementById("container")

);

</script>

</body>

</html>