React 概要
React 简介
React 是一个开源的javascript库,用来构建用户接口(UI)。下图是React的一些基本信息:
React 的特点
- 单向数据流
- 数据自上而下
- Props 不可变
- States可变
- 任何数据、函数都可以作为属性(props)传 递给子组件(Props, States, Handlers, Styles)
- 事件冒泡
- 子组件触发的事件会传递到父组件
- 数据自上而下
- 虚拟DOM
- Javascript内存中的DOM数据缓存
- 组件发生变化时渲染虚拟DOM
- React将虚拟DOM与DOM的差异转化为一系列的DOM操作
- 将这些操作同步应用到真实的DOM中
- JSX
- 可以使用HTML语法创建Javascript 对象
- 代码更少
- 会被转化为Javascript执行
- Offline - react-tools
- In-Browser - JSXTransformer
- 不改变Javascript语义
- 其他特点
- 元素嵌套: 每个组件只允许有一个顶层元素(div, table …)
- 自定义属性: 除了HTML标签自带属性之外,React也支持自定义属性,自定义属性需要加上data- 前缀
- JavaScript表达式: 可以通过{}在JSX中使用Javascript表达式
- 三目运算符: JSX中不能使用if-else但可以使用三目运算
React元素
const element = <h1>Hello, world</h1>;
- React 元素 != DOM 元素
- 将元素渲染到 DOM 中 ReactDOM.render(element, document.getElementById(‘root’));
- 更新元素 - 重新 Render
- 更新元素只会更新变化的部分
1 | function tick() { |
React组件
组件可以将UI切分成一些的独立的、可复用的部件,这样你就只需专注于构建每一个单独的部件。
- 如何定义一个组件
- 函数
1 | function Welcome(props) { |
* class
1 | class Welcome extends React.Component { |
function App() {
return (
);
}
1 |
|
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date()
});
}
render() {
return (
Hello, world!
It is {this.state.date.toLocaleTimeString()}.
);
}
}
ReactDOM.render(
document.getElementById(‘root’)
);
1 | 事件处理 |
function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
if (isLoggedIn) {
return <UserGreeting />;
}
return <GuestGreeting />;
}
ReactDOM.render(
// Try changing to isLoggedIn={true}:
<Greeting isLoggedIn={false} />,
document.getElementById('root')
);
1 | * &&运算符 |
- 三目运算符function ListItem(props) {
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16render() {
const isLoggedIn = this.state.isLoggedIn;
return (
<div>
The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in.
</div>
);
}
```
列表渲染
====
* React 可以直接渲染列表
* Keys可以在DOM中的某些元素被增加或删除的时候帮助React识别哪些元素发生了变化。因此应当给数组中的每一个元素赋予一个确定的标识。
* 元素的key只有在它和它的兄弟节点对比时才有意义
* jsx中可以使用map
return - {props.value} ;
}
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
<ListItem key={number.toString()}
value={number} />
);
return (
<ul>
{listItems}
</ul>
);
}1 | 表单 |
constructor(props) {
super(props);
this.state = {
isGoing: true,
numberOfGuests: 2
};
this.handleInputChange = this.handleInputChange.bind(this);
}
handleInputChange(event) {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
this.setState({
[name]: value
});
}
render() {
return (
<form>
<label>
Is going:
<input
name="isGoing"
type="checkbox"
checked={this.state.isGoing}
onChange={this.handleInputChange} />
</label>
<br />
<label>
Number of guests:
<input
name="numberOfGuests"
type="number"
value={this.state.numberOfGuests}
onChange={this.handleInputChange} />
</label>
</form>
);
}
}```
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 三木的技术博客!
评论