标签:
在github上找到react入门学习比较好的demo,下面是那个链接:
https://github.com/ruanyf/react-demos
然后接下来是每个demo的学习笔记:
demo1:
<body>
<div id="example"></div>
<script type="text/jsx"> //jsx类型可html和javasript一起写,遇到 HTML 标签,就用 HTML 规则解析;遇到代码块,就用 JavaScript 规则解析。
React.render( //React.render 是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点
<h1>HelloWorld! My name is BlackBirch. So happy to see you.</h1>,
document.getElementById(‘example‘)//将一个 h1 标题,插入exmaple节点
);
</script>
</body>
demo2:
//js: array.map(callback[,thisArg])对数组的每个元素调用定义的回调函数并返回包含结果的数组。返回值:一个新数组,其中的每个元素均为关联的原始数组元素的回调函数返回值。
<body>
<div id="example"></div>
<script type="text/jsx">//jsx类型可html和javasript一起写,遇到 HTML 标签,就用 HTML 规则解析;遇到代码块,就用 JavaScript 规则解析。
var names = [‘Alice‘, ‘Emily‘, ‘Kate‘];
React.render(
<div>
{
names.map(function (name) {
return <div>Hello, {name}!</div>
})
}
</div>,
document.getElementById(‘example‘) //将<div>里面的内容插入example节点
);
</script>
</body>
demo3:
<body>
<div id="example"></div>
<script type="text/jsx">
var arr = [
<h1>Hello world!</h1>,
<h2>React is awesome</h2>,
];
React.render(
<div>{arr}</div>, //arr会全部遍历出现。
document.getElementById(‘example‘)
);
</script>
</body>
demo4:
<body>
<div id="example"></div>
<script type="text/jsx">
var HelloMessage = React.createClass({//创建React组件对应的类HelloMessage
render: function() { ////当组件被渲染(使用到)时需要输出的内容的render接口是必须实现的
return <h1>Hello {this.props.name}</h1>;//.props是通过组件的属性来传递数据,name是属性。
}
});
React.render(
<HelloMessage name="John" />,
document.getElementById(‘example‘)//HelloMessage 的实例插入到example节点。
);
</script>
</body>
1.React.createClass() 创建React组件对应的类,描述你将要创建组件的各种行为,其中只有当组件被渲染时需要输出的内容的render接口是必须实现的.
2.变量 HelloMessage 就是一个组件类。模板插入 <HelloMessage /> 时,会自动生成 HelloMessage 的一个实例(下文的"组件"都指组件类的实例)。
??重点:所有组件类都必须有自己的 render 方法,用于输出组件。
3.组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 <HelloMessage name="John" /> ,就是 HelloMessage 组件加入一个 name 属性,值为 John。组件的属性可以在组件类的 this.props 对象上获取,比如 name 属性就可以通过 this.props.name 读取。
demo5:
<script type="text/jsx">
var NotesList = React.createClass({//创建React组件对应的类NotesList
render: function() {//当组件被渲染(使用到)时需要输出的内容的render接口是必须实现的
return (
<ol>
{
this.props.children.map(function (child) {//.props.children取到组件的所有子节点
return <li>{child}</li>
})
}
</ol>
);
}
});
React.render(
<NotesList>
<span>hello</span>
<span>world</span>
</NotesList>,
document.body //将<NotesList>的事例插入到body里。
);
</script>
注意??:只有当子节点多余1个时,this.props.children 才是一个数组,否则是不能用 map 方法的, 会报错。
demo6:
<body>
<div id="example"></div>
<script type="text/jsx">
var MyComponent = React.createClass({
handleClick: function() {//事件点击后处理函数
React.findDOMNode(this.refs.myTextInput).focus();//findDOMNode获取真实的DOM,this.refs.myTextInput就指向这个虚拟 DOM 的子节点myTextInput
},
render: function() {
return (
<div>
<input type="text" ref="myTextInput" />//ref属性
<input type="button" value="Focus the text input" onClick={this.handleClick} />//onClick单击事件。调用handleClick方法
</div>
);
}
});
React.render(
<MyComponent />,
document.getElementById(‘example‘)//将MyComponent实例化插入example中。
);
</script>
</body>
html DOM:focus() 方法用于设置焦点。
1.组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做DOM diff,它可以极大提高网页的性能表现。
2.组件 MyComponent 的子节点有一个文本输入框,用于获取用户的输入。这时就必须获取真实的 DOM 节点,虚拟 DOM 是拿不到用户输入的。为了做到这一点,文本输入框必须有一个 ref 属性,然后 this.refs.[refName] 就指向这个虚拟 DOM 的子节点,最后通过 React.findDOMNode 方法获取真实 DOM 的节点。
注意?:由于 React.findDOMNode 方法获取的是真实 DOM ,所以必须等到虚拟 DOM 插入文档以后,才能使用这个方法,否则会返回 null 。上面代码中,通过为组件指定 Click 事件的回调函数,确保了只有等到真实 DOM 发生 Click 事件之后,才会调用 React.findDOMNode 方法。
3.React 组件支持很多事件,除了 Click 事件以外,还有 KeyDown 、Copy、Scroll、change 等
demo7:
将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI
this.state状态机
<body>
<div id="example"></div>
<script type="text/jsx">
var LikeButton = React.createClass({//创建组件的类 LikeButton
getInitialState: function(){ //getInitialState定义初始状态state
return {liked: false};
},
handleClick: function(event) { //点击事件
this.setState({liked: !this.state.liked}); //设置状态 this.setState 方法就修改状态值,每次修改以后,自动调用 this.render 方法,再次渲染组件
},
render: function() {
var text = this.state.liked ? ‘like‘ : ‘haven\‘t liked‘;////this.state对象提取state会随着用户互动而改变。props不会。
return (
<p onClick={this.handleClick}>
You {text} this. Click to toggle.
</p>
);
}
});
React.render(
<LikeButton />,
document.getElementById(‘example‘)
);
</script>
</body>
demo8:
用户在表单填入的内容,属于用户跟组件的互动,所以不能用 this.props 读取
<body>
<script type="text/jsx">
var Input = React.createClass({
getInitialState: function() {//定义初始化
return {value: ‘Hello!‘};
},
handleChange: function(event) {//改变事件调用的方法
this.setState({value: event.target.value});//event.target.value获取用户输入的值
},
render: function () {
var value = this.state.value;
return (
<div>
<input type="text" value={value} onChange={this.handleChange} /> //onChange 事件会在域的内容改变时发生。
<p>{value}</p>
</div>
);
}
});
React.render(<Input/>, document.body);
</script>
</body>
上面代码中,文本输入框的值,不能用 this.props.value 读取,而要定义一个 onChange 事件的回调函数,通过 event.target.value 读取用户输入的值。textarea 元素、select元素、radio元素都属于这种情况。
demo9:
组件的生命周期分成三个状态:
React 为每个状态都提供了两种处理函数,will 函数在进入状态之前调用,did 函数在进入状态之后调用,三种状态共计五种处理函数。
此外,React 还提供两种特殊状态的处理函数。
<body>
<script type="text/jsx">
var Hello = React.createClass({
getInitialState: function () {
return {
opacity: 1.0
};
},
componentDidMount: function () {//组件被插入DOM后执行
this.timer = setInterval(function () {//timer定时器,setInterval()方法可以使一段代码每过指定时间就运行一次
var opacity = this.state.opacity;
opacity -= .05; //.05我不懂是什么意思,难道是0.05?
if (opacity < 0.1) {
opacity = 1.0;
}
this.setState({ //this.setState 方法就修改状态值,每次修改以后,自动调用 this.render 方法,再次渲染组件
opacity: opacity
});
}.bind(this), 100);//.bind 改变函数内部的this指向,详情见下面:
},
render: function () {
return (
<div style={{opacity: this.state.opacity}}> //{{opacity: this.state.opacity}}因为React组建样式是一个对象,所以第一重大括号表示这是 JavaScript 语法,第二重大括号表示样式对象。
Hello {this.props.name}
</div>
);
}
});
React.render(
<Hello name="world"/>,
document.body
);
</script>
</body>
1.bind方法会创建一个新函数,称为绑定函数.当调用这个绑定函数时,绑定函数会以创建它时传入bind方法的第一个参数作为this,传入bind方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数.
demo10:
Ajax
组件的数据来源,通常是通过 Ajax 请求从服务器获取,可以使用 componentDidMount 方法设置 Ajax 请求,等到请求成功,再用 this.setState 方法重新渲染 UI
<body>
<script type="text/jsx">
var UserGist = React.createClass({
getInitialState: function() {
return {
username: ‘‘,
lastGistUrl: ‘‘
};
},
componentDidMount: function() {
$.get(this.props.source, function(result) { //$.get()jquery里的get请求。第一个参数是链接,result是请求返回的值
var lastGist = result[0];
if (this.isMounted()) { //isMounted判断组件是否存在。
this.setState({
username: lastGist.owner.login,
lastGistUrl: lastGist.html_url
})
}
}.bind(this));
},
render: function() {
return (
<div>
{this.state.username}‘s last gist is
<a href={this.state.lastGistUrl}>here</a>.
</div>
);
}
});
React.render(
<UserGist source="https://api.github.com/users/octocat/gists" />,
document.body
);
</script>
</body>
参考教程:http://www.ruanyifeng.com/blog/2015/03/react.html
谢谢各位大神带路。
标签:
原文地址:http://www.cnblogs.com/BlackBirch/p/4690608.html