React第二讲课堂笔记(JSX 语法)
1. 什么是 JSX
类似 xml 的语法,用来描述组件树
1 2 3 4 5 6 7
| var HelloMessage = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; } });
React.render(<HelloMessage name="John" />, mountNode);
|
JSX是可选的,并不强制要求使用。如果不用JSX,用React提供的API写的话,应该是这样的,直接调用React的API来定义组件和DOM元素。
1 2 3 4 5 6 7 8 9
| var HelloMessage = React.createClass({ displayName: "HelloMessage", render: function() { return React.createElement("div", null, "Hello ", this.props.name); } });
React.render(React.createElement(HelloMessage, {name: "John"}), mountNode);
|
2. 为什么要使用 JSX
你不需要为了 React 使用 JSX,可以直接使用纯粹的 JS。但我们更建议使用 JSX , 因为它能定义简洁且我们熟知的包含属性的树状结构语法。
3. 注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import React, { Component } from 'react';
const name = 'yongfeng'; const MyComponent = () => { <Nav> {/* 一般注释, 用 {} 包围 */} <a /* 多 行 注释 */ className={ name ? 'a' : 'b' } // 行尾注释 href="http://guoyongfeng.github.io/idoc" > 注释 </a> </Nav> };
export default MyComponent;
|
4. 命名
1 2 3 4 5 6 7 8 9 10
| import React, { Component } from 'react';
// 1. 组件命名遵循驼峰命名,首字母大写 class ComponentDemo extends Component { render(){ return <div> 你好,兄弟... </div> } }
export default ComponentDemo;
|
5. 根元素个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import React, { Component } from 'react';
class ComponentDemo extends Component { render(){ // 以下写法直接报错 return ( <div> hello </div> <h1> hello h1 </h1> ); } }
export default ComponentDemo;
|
React只有一个限制, 组件只能渲染单个根节点。如果你想要返回多个节点,它们必须被包含在同一个节点里。
6. 嵌入变量
{}花括号内可以写JS逻辑,表达式和方法定义都可以
1
| let person = <Person name={window.isLoggedIn ? window.name : ''} />;
|
7. styles
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import React, { Component } from 'react';
class StyleDemo extends Component { render(){ // 5. 在JS文件里面给组件定义样式 var MyComponentStyles = { color: 'blue', fontSize: '28px' };
return ( <div style={MyComponentStyles}> 可以直接这样写行内样式 </div> ) } }
export default StyleDemo;
|
8. JSX SPREAD
可以通过 {...obj}
来批量设置一个对象的键值对到组件的属性
1 2 3 4 5 6 7 8 9 10 11 12
| import React, { Component } from 'react';
class SpreadDemo extends Component { componentWillMount(){ console.log(this.props); } render(){ return <h1> {this.props.name} is a {this.props.type} </h1>; } }
export default SpreadDemo;
|
9. 属性名不能和 js 关键字冲突
例如:className readOnly htmlfor