react app一步步学习
react app一步步学习
近期打算将公司原有的app转成reactApp模式,开始学习,以下是学习目标:
- 学习reactApp的基本语法,可以调用组件生成模块化控件
- 组件间通信
- 原有的app里调用组件
- 原生app页面调用react组件页面
REACT FOR JSX
<script src="../../build/react-dom.js"></script>
<script src="../../build/browser.min.js"></script>
index.html中的三个引入文件分别的作用:
* react.js
react核心库
* react-dom.js
react的dom解析库
* browser.min.js
jsx语言转化为js语言的转化库,Browser.js
的作用是将JSX
语法转为JavaScript
语法,这一步很消耗时间,实际上线的时候,应该将它放到服务器完成。
疑问?
怎么放到服务器上,浏览器就不需要加载了
react语法
简介
React 使用 JSX 来替代常规的 JavaScript。
JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。
我们不需要一定使用 JSX,但它有以下优点:
* JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。
* 它是类型安全的,在编译过程中就能发现错误。 * 使用 JSX 编写模板更加简单快速。
ReactDOM.render
是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。
render函数有两个参数,第一个参数代表虚拟节点,即你要插入的html节点代码,第二个参数是最基本的html的dom节点对象,可以通过docoment获取.
![paste image][image-1]
jsx语法
* html与js混写
HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写
第三个例子是html与js混写
注
第三个例子中,map方法是react的封装方法,map将会遍历回调function
* JSX 允许直接在模板插入 JavaScript 变量。
JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员
见例子四:
var arr = \[
<h1>Hello world!</h1>,
见例子四 <h2>React is great language</h2>,
];
ReactDOM.render(
<div>{arr}</div>,
document.getElementById('example4')
);
* 我们可以在 JSX 中使用 JavaScript 表达式。表达式写在花括号 {} 中。实例如下:
var a = 3
ReactDOM.render(
<div>
<h1>{1+a}</h1>
</div>
,
document.getElementById('example')
);
* 不能使用if else语句,conditional表达式代替
var i = 1;
ReactDOM.render(
<div>
<h1>{i == 1 ? 'True!' : 'False'}</h1>
</div>
,
document.getElementById('example')
);
* jsx代码可以放在独立文件
index.html:
<body>
<div id="example"></div>
<scri要渲染 React 组件pt type="text/babel" src="helloworld\_react.js"></script>
</body>
helloworld_react.js :
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
* React 推荐使用内联样式,支持样式设置。
示例:
var myStyle = {
fontSize: 100,
color: '#FF0000'
};
ReactDOM.render(
<h1 style = {myStyle}>我是菜鸟</h1>,
document.getElementById('example')
);
## HTML 标签 vs. React 组件
* React 可以渲染 HTML 标签 (strings) 或 React 组件 (classes)。
要渲染 HTML 标签,只需在 JSX 里使用小写字母的标签名。
var myDivElement = <div className="foo" />;
ReactDOM.render(myDivElement, document.getElementById('example'));
要渲染 React 组件,只需创建一个大写字母开头的本地变量。
var MyComponent = React.createClass({/*...*/});
var myElement = <MyComponent someProperty={true} />;
ReactDOM.render(myElement, document.getElementById('example'));
React 的 JSX 使用大、小写的约定来区分本地组件的类和 HTML 标签。
注意:
由于 JSX 就是 JavaScript,一些标识符像 class 和 for 不建议作为 XML 属性名。作为替代,React DOM 使用 className 和 htmlFor 来做对应的属性。
react组件
React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。
React.createClass 方法就用于生成一个组件类,所有组件必须要有render方法,用于输出组件.
注意
组件类的第一个字母必须大写,否则会报错,比如HelloMessage不能写成helloMessage。另外,组件类只能包含一个顶层标签,否则也会报错。
eg:
var HelloMessage = React.createClass({
render: function() {
return <h1>
Hello {this.props.name}
</h1><p>
some text
</p>;
}
});
上面代码会报错,因为HelloMessage组件包含了两个顶层标签:h1和p.
组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 <HelloMessage name=”John”> ,就是 HelloMessage 组件加入一个 name 属性,值为 John。组件的属性可以在组件类的 this.props 对象上获取,比如 name 属性就可以通过 this.props.name 读取。上面代码的运行结果如下。
示例:
<script type="text/babel">
var HelloMessage = React.createClass({
render: function() {
return <h1>Hello {this.props.name} ,className is {this.props.className}</h1>;
}
});
ReactDOM.render(
<HelloMessage name="sam" className="class1"/>,
document.getElementById('example')
);
</script>
注意
添加组件属性,有一个地方需要注意,就是 class 属性需要写成 className ,for 属性需要写成 htmlFor ,这是因为 class 和 for 是 JavaScript 的保留字。
this.props.children
this.props 对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children 属性。它表示组件的所有子节点.
eg:
var NotesList = React.createClass({
render: function() {
return (
<ol>
{
React.Children.map(this.props.children, function (child) {
return <li>{child}</li>;
})
}
</ol>
);
}
});
ReactDOM.render(
<NotesList>
<span>hello</span>
<span>world</span>
</NotesList>,
document.body
);
React 提供一个工具方法 React.Children 来处理 this.props.children 。
我们可以用 React.Children.map 来遍历子节点,而不用担心 this.props.children 的数据类型是 undefined 还是 object。更多的 React.Children 的方法,请参考官方文档(https://facebook.github.io/react/docs/top-level-api.html#react.children)。
PropTypes
this.props.children组件的属性可以接受任意值,字符串、对象、函数等等都可以。有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求。
组件类的PropTypes属性,就是用来验证组件实例的属性是否符合要求.
我们来看一个例子,我们给一个组件的属性加一个必填的校验,并且必须是字符串,我让校验故意不过,看会出现什么:
eg:
var MyTitle = React.createClass({
propTypes: {
title: React.PropTypes.string.isRequired,
},
render: function() {
return <h1> {this.props.title} </h1>;
}
});
var data = 123;
ReactDOM.render(
<MyTitle title={data} />,
document.body
);
这样一来,title属性就通不过验证了。控制台会显示一行错误信息。
Warning: Failed propType: Invalid prop title of type number supplied to MyTitle, expected string.
warning @ react.js:19287
checkPropTypes @ react.js:10366
validatePropTypes @ react.js:10385
createElement @ react.js:10419
(anonymous) @ embedded:51
transform.run @ browser.min.js:3
exec @ browser.min.js:3
runScripts @ browser.min.js:3
如下所示:
![paste image][image-2]
[1]: http://jsx.github.io/ “jsx官方github主页”
[image-1]: http://clockcoder.com/images/vuqdocgjiv4dwnlkvkx8wbkm9l
[image-2]: http://clockcoder.com/images/bwm9os66vkxqsn1zt0ewntn587