React入门摘要
文章目录
声明: 此文档很不完善,只是简约版本。用于本人学习React
的简要记录,用于加深记忆。建议有相关疑问时,移步官网获取更新详细信息
JMX
语法
类似模板语言 + JavaScript
+ HTML
语法
|
|
注意点:
JMX
有且只有一个根元素,如最没有,可以使用<></>
节点代替- 所有标签必须形成闭合
- 返回多行,用
()
包括起来
元素渲染
将元素
渲染进React
|
|
元素
是构成React
应用的最小砖块元素
是不可变对象,一旦被创建,就无法更改它的子元素以及属性
组件
组件可以将UI
拆分成独立的单元,并任意组合与复用。编写组件最好的方法就是编写javascript
函数
当不需要维护相关状态时,可以用函数组件,简单
2022
年之后社区推荐方法,编写函数
|
|
2022
年之前 官方推荐方法,编写class
|
|
组件的注意事项:
- 组件名必须大写
- 组件的
props
为只读属性,不能被修改 - 组件可以嵌套组件
- 如果在组件中使用到局部变量,需要加关键字
const
- 组件分为有状态组件与无状态组件。建议无状态组件只关注
UI
渲染。有状态组件负责数据处理。单独分开
组件通信
-
Mobx
终级大杀器,独立的一个库。简单好用
-
Context
当多层级传递参数时,此为最优。提供了一个无需为每层组件手动添加
props
,就能在组件树间进行数据传递的方法。方法与步骤:
-
- 在提供
context
的组件内,新增一个getChildContext
方法,返回context
对象即可
- 在提供
-
- 组件的
childContextTypes
定义context
对象的属性信息
- 组件的
1
-
-
父组件向子组件传递数据,直接通过调用子组件时,指定
props
|
|
- 子组件向父组件传递数据,也通过
props
,在父组件中定义好函数,并将函数通过props
传递给子组件,子组件在内部调用该函数
|
|
-
兄弟节点组件通信(
状态提升
)兄弟组件之间不能直接互相通信,需要通过
状态提升
的方式进行通信。也是同子组件同父组件通信一样,在父组件定义好函数,通过props
传递给兄弟组件,在兄弟组件中调用- 兄弟组件内部不维护自己的
state
- 兄弟组件改变的状态其实是父组件的
state
,兄弟组件中将父的state
进行渲染输出 - 父组件将内部组件的值,通过
props
的方式传递给兄弟组件 - 兄弟组件的
onChange
等事件处理函数实际调用的是父中的函数,也通过props
传递给兄弟组件,在它内部的事件处理函数中调用父组件的函数
示例:
下面是人民币同美元的实时转换,这里简单起见,直接假设汇率固定为
7
,输入全部合法,实际中输入要判断是否合法的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
// 定义汇率 const rate = 7; // 1. 定义父组件以及内部的state class Container extends React.Component { constructor(props) { super(props); // curr = y 人民币 // curr = u 美元 this.state = {value: "", curr: "y"} } // 给子组件调用的,转换成RMB changeToY = (newValue) => { this.setState({value: newValue, curr: "y"}); } // 给子组件调用的,转换成美元 changeToU = (newValue) => { this.setState({value: newValue, curr: "u"}) } render() { // 计算一下,再将相关值传入子组件/兄弟组件 const value = this.state.value; const curr = this.state.curr; const rmb = curr === "y" ? value : (value / rate); const dollar = curr === "u" ? value : (value * rate); return ( <div> // 调用子组件 Dollar: <ContainerInput name="y" handle={this.changeY} value={rmb} /> RMB: <ContainerInput name="u" handle={this.changeU} value={dollar} /> </div> ) } } // 子组件 class ContainerInput extends React.Component { constructor(props) { super(props); // 内部不需要保持状态,即不需要state } // 实际调用的是父的函数,通过props传进来 onChange = (e) => { this.props.handle(e.target.value); } render() { return ( // 这里不能直接使用this.props.handle函数,如最直接使用,参数e.target实际上undefined,所以还得用自身的函数再包装一下使用,才能取到e.target <input name={this.props.name} value={this.props.value} onChange={this.onChange}></input> ) } }
- 兄弟组件内部不维护自己的
State
使用步骤:
- 组件定义成
class
- 重写方法
constructor
方法,并在该方法中初始化this.state
构造函数是唯一可以初始化this.state
的地方
|
|
State
用于内部变量,props
用于外部变量,props
为只读,不可变class
内的其他变量为普通属性- 如果在
render
方法中没有用到的属性,建设设置为普通属性,不要加在state
中
生命周期(2022之后不适用了,但了解下还是很有必要
)
以下为主要使用到的方法
-
constructor
构造器,主要用于初始化
this.state
-
componentWillReceiveProps
一般用于
props
有变更进执行,但不常见,一般可以将props
作为参数,同前面的props
进行比较 -
componentDidMount
在组件已经被渲染到
DOM
中后运行,所以,最好在这里设置计时器.- 一般当要实时更新内部的
state
属性时,在这设置计时器。要注意需要用箭头函数
- 请求后端数据时,一般也在这里执行
箭头函数
主要用于实时更新的函数中。如通过定时器更新this.state
的函数 - 一般当要实时更新内部的
-
componentWillUnmount
一般用于生命周期方法中清除计时器
事件处理
e
参数会作以参数隐式的传进来,如果处理函数有多个参数,e
作为最后的参数
- 语法上使用
箭头函数
形式绑定this
|
|
- 向事件函数传递多参数
|
|
- 修改
state
中的数组类型
|
|
- 事件处理函数不能返回
false
,需要通过e.preventDefault()
执行
|
|
条件渲染
JSX
的中括号中"{}"
可以使用任意javascript
的表达式
阻止组件渲染
如果有时想有些组件在条件不满足情况下不渲染,可以直接返回null
即可
|
|
列表
React
中,列表需要指定key
,一般map()
方法中的元素需要设置key
属性key
只有在兄弟中不唯一即可,可以全局不唯一
|
|
表单
如果一个表单元素的值是由React
来管理的,那么它就是一个受控组件
。
input
/textarea
通过onChange
事件与value
结合,在组件初始化时,将state
赋于表单属性名称,后续根据value
来更新state
.
|
|
select
类似Input
,在父元素<select></select>
中定义onChange
属性即可
checkbox/radio
修改对应选项的checked
属性即可
非受控组件(不推荐使用)
通过为表单元素使用特殊ref
可以让非受控组件获取from
的数据,而不用每个标签使用onChange
函数来监听。
高阶组件
高阶组件实际就是装饰者模式
,给组件添加功能。它本身是一个函数,传入的是函数,返回的也是函数。如
|
|
文章作者 UnknowName
上次更新 2022-06-08