学习笔记来自阮一峰大神的react教材,对应代码github地址点这里。
React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。
react中一个重要的概念是JSX(JavaScript+XML),JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。因为与JavaScript不兼容,所有使用JSX的script标签都要加上type="text/babel"
.
jsx优点:
- JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。
- 它是类型安全的,在编译过程中就能发现错误。
- 使用 JSX 编写模板更加简单快速。
基本语法规则
- 遇到html标签以<
开头,就用html规则解析
- 遇到代码以{
开头,就用javascript规则解析
var names = ['Alice', 'Emily', 'Kate'];
ReactDOM.render(
<div>
{
names.map(function (name) {
return <div>Hello, {name}!div>
})
}
div>,
document.getElementById('example')
);
var arr=[],
obj={};
//empty不存在,报错
ReactDOM.render(
<div>{empty}div>,
document.getElementById('example')
);
//obj存在,obj.key不存在,当前对象内容为空
ReactDOM.render(
<div>{obj.key}div>,
document.getElementById('example')
);
//对于一个数组不指定某一项会默认按数组顺序输出所有项内容
//arr存在,arr[5]不存在,当前对象内容为空
ReactDOM.render(
<div>{arr[5]}div>,
document.getElementById('example')
);
用于将jsx转化为js标准语法
ReactDOM.render 是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。
- 第一个参数用于指定插入的模板
- 第二个参数用来指定模板插入的位置
比如以下代码的含义就是在id为example的标签中插入一条标签模板。
ReactDOM.render(
<h1>Hello, world!h1>,
document.getElementById('example')
);
var arr = [
<h1>Hello world!h1>,
<h2>React is awesomeh2>,
];
ReactDOM.render(
<div>{arr}div>,
document.getElementById('example')
);
React.createClass 方法就用于生成一个组件类(注:组件类并不是一个真实的DOm节点)。React允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。
- 所有的组件类都必须有自己的render方法用于输出组件
- 组件类的第一个字母必须大写
- 组件类只能有一个顶层标签(出现多个标签需用一个父标签将其余标签包裹起来)
- 组件的属性可以在组件类的 this.props 对象上获取(以下代码中使用this.props.name获取了组件类的name属性)
var HelloMessage = React.createClass({
render: function() {
return <h1>Hello {this.props.name}h1>;
}
});
ReactDOM.render(
// 等价于
"John" />,
document.getElementById('example')
);
添加组件属性时需注意:class要写成className,for要写成htmlFor,因为class与for是html的保留字
this.props对象的属性与组件的属性一一对应
this.props.children表示组建的所有子节点。当子节点不存在,其值为undefined,只有一个子节点时其值为一个对象,当子节点有多个时其值为一个数组。
以下代码为NodesList每一个子节点元素外都套一个li标签
//定义一个NotesList组件类并将这个组件类中的每一项都用li标签包裹起来
var NotesList = React.createClass({
render: function()
return (
{
React.Children.map(this.props.children, function (child)
{
return <li>{child}li>;
})
}
</ol>
);
}
});
//给NotesList组件类中添加两个子标签,将这个组件类展示在页面body中
ReactDOM.render(
hellospan>
<span>worldspan>
NotesList>,
document.body
);
PropTypes是生成组件类时(React.createClass)设定的属性,用于验证属性是否符合要求。默认情况下组件的属性可以接受任意值。
var MyTitle = React.createClass({
propTypes: {
title: React.PropTypes.string.isRequired,
},
render: function() {
return <h1> {this.props.title} h1>;
}
});
以上代码限制了:
1. Mytitle组件有一个title属性
2. title属性值必须
3. title属性的值必须是一个字符串
getDefaultProps是设定当前组件下所有属性的默认验证
var MyTitle = React.createClass({
getDefaultProps : function () {
return {
title : 'Hello World'
};
},
render: function() {
return <h1> {this.props.title} h1>;
}
});