React学习总结(一):组件

前言,

好久没学习了,现在正式开始学习React啦~

之前有大概了解过React,了解过React的实现原理,所以我打算直接从 组件 来开始我的React学习之旅

元素与组件

React元素:

1
const div = React.createElement("div",...)

React组件:

1
const Div = () => React.createElement("div",...)

元素和组件的区别就在于 组件必须返回的是一个函数,并且命名首字母要大写!

什么是组件

  • 用生活中的例子就是:能和其他物件组合在一起的物件就是组件,
  • 比如Vue中,一个构造选项就可以表示一个组件。
  • 在React官方中说到,组件的本质就是JavaScript函数

React的俩种组件:函数组件与 class 组件

函数组件

1
2
3
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}

使用方法:

1
<Welcome name="Wangpf"/>

class组件

1
2
3
4
5
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}

使用方法:

1
<Welcome name="Wangpf"/>

上述两个组件在 React 里是等效的。

那么 <Welcome /> 会被翻译为 React.createElement(….)

我用 babel online 来演示一下

div

<Welcome />

<Welcome />

<Welcome />

总结:

  1. 如果传入的是一个字符串:比如 “div”,则会去创建一个div
  2. 如果传入的是一个函数,则会去调用该函数,获取其返回值
  3. 如果传入的是一个,则会在类前面加个 new(这会导致执行constructor),获取一个组件对象,然后调用对象的render方法,获取其返回值

小试牛刀

分别用俩种组件方式来写props(外部数据,传参)、state(内部数据):

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import React from 'react';
import "./style.css";

function App() {
return (
<div className="App">
父组件
<Son messageForSon="我是你的老大" />
</div>
);
}

class Son extends React.Component {
constructor() {
super()
this.state = {
n: 0
}
}

render() {
return (
<div className="Son">
子组件
<span> n: {this.state.n} </span>
<button onClick={() => { this.add() }}> +1</button>
<p>我是子组件,父组件对我说:{this.props.messageForSon}</p>
<Grandson messageForGrandson="我是你的老大,你是我老大的孙子" />
</div>
)
}

add() {
// this.setState({
// n: this.state.n + 1
// })

this.setState(state => {
const n = state.n + 1
// console.log(n);
return { n }
})
}
}

const Grandson = (props) => {
const [n, setN] = React.useState(0)
return (
<div className="Grandson">
孙组件
<span> n : {n} </span>
<button onClick={() => { setN(n + 1) }}> +1</button>
<p>我是孙组件,子组件对我说:{props.messageForGrandson}</p>
</div>
)
}

export default App

俩种组件的书写方式

总结:

使用props(外部数据)

  • 类组件 会直接读取属性 this.props.xxx
  • 函数组件 会直接读取参数 props.xxx

使用state(内部数据)

  • 类组件 用 this.state 读, this.setState 写
  • 函数组件 用 useState 返回数组,第一项是读, 第二项是写
    • const [n, setN] = React.useState(0)