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