JSX模板
以.jsx为后缀的标记文件,用以书写混合js逻辑的dom模板
example.jsx, jsx文件经Babel编译为js运行1
2
3
4
5
6
7const JSX = (
<div className="myDiv">
<h1>Hello World</h1>
<p>Lets render this to the DOM</p>
</div>
);
ReactDOM.render(JSX,document.getElementById("challenge-node"))
- 用{}包含js代码,包括变量和相应方法
- 用className绑定class样式
注释
use the syntax {/ /}表单
1
2
3
4
5
6
7
8
9
10
11render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
文章:
<textarea value={this.state.value} onChange={this.handleChange} />
</label>
<input type="submit" value="提交" />
</form>
);
}ES6语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26import { Component } from 'react'
class App extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<h1>Here is Entry</h1>
{/* 子组件 */}
<ChildComponent />
</div>
);
}
};
const ChildComponent = () => {
return (
<div>
<p>I am the child</p>
</div>
);
};
ReactDOM.render(<App />, document.getElementById("app"))子组件传参
使用函数表达式不需要this指针而class定义是要的(ES6 ()=>{}不创建this)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24const CurrentDate = (props) => {
return (
<div>
<p>The current date is: {props.date}</p>
</div>
);
};
const Data = ()=>{
return new Date().toLocaleString();
}
class Calendar extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<h3>What date is it?</h3>
<CurrentDate date={Date()}/>
<p>{this.props.name}</p>
</div>
);
}
};
另外设置默认参数:ComponentA.defaultProps = {name:’New Component’}
更多组件通信见React组件交互
参数校验
1 | MyComponent.propTypes = { |
state及组件生命周期
props是父组件传入的只读参数,state是组件自身的动态的状态
为了正确地构建组件,需要找出组件模型所需的 state 的最小表示,其他所有数据根据该state计算出。React哲学
props是传入参数,而state是组件内部表征状态的对象,往往在构造函数中,根据props初始化state
组件状态更新使用setState,函数触发组件的重新渲染1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29class Clock extends React.Component {
constructor(props) {
super(props);
// 初始化date为当前时间
this.state = {date: new Date()};
}
/* 加载 */
componentDidMount() {
// 1s后开始跳
this.timerID = setInterval(
() => this.tick(),
1000
);
}
/* 卸载 */
componentWillUnmount() {
clearInterval(this.timerID);
}
tick=()=>{this.setState((pre)=>({date:new Date()}))}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
bind ‘this’
1 | class MyComponent extends React.Component { |
条件渲染
1 | render() { |
与运算&&1
{flag && <toggleComponent />}
三目运算1
2
3
4
5
6
7
8
9
10render() {
const isLoggedIn = this.state.isLoggedIn;
return (
<div>
<Greeting isLoggedIn={isLoggedIn} />
{isLoggedIn?<LogoutButton onClick={this.handleLogoutClick} />:<LoginButton onClick={this.handleLoginClick} />}
</div>
);
}
继承
没有继承!
在render return中组合子组件提供了清晰而安全地定制组件外观和行为的灵活方式,没有需要使用继承来构建组件层次的情况。React Docs:组合 vs 继承
createRef onRef useRef
子组件实例化回调函数,用以获取子组件对象
useRef 仅能用在 FunctionComponent,createRef 仅能用在 ClassComponent。
组件的对象会随组件的更新而刷新,但useRef返回的对象不会随着组件的更新而重新构建,像引入的全局变量,且随组件的销毁而释放,不需手动销毁
Fragment
相当于Angular的template,插入子组件不生成额外的元素(如div),
ReactDOMServer
1 | class App extends React.Component { |
服务端渲染(SSR),生成dom的html字符串,实现SEO优化
Create React App
这是一个package create-react-app, 如angular-cli,和vue-cli中包含的命令工具(这里封装的命令是react-scripts, 见package.json中的scripts),用以创建基于React的完整应用。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15my-app/
node_modules/
public/
index.html
favicon.ico
src/
App.css
App.js
App.test.js
index.css
index.js
logo.svg
README.md
package.json
关于typescript
1 | yarn add --dev typescript |
在tsconfig.json中配置typescript编译器(略)
使用tsx文件书写包含jsx代码的typescript代码
使用tsc命令编译
添加@types/react, vs code 右下角TypeScript版本选择4..-pnpify