React学习笔记
本文主要为react的学习笔记,基于react文档。
React学习笔记
JSX简介
基本用法:使用{}
,在大括号中放入任何有效的JavaScript表达式。
1 | const name = 'a'; |
或者诸如2+2
,user.firstName
,formatName(user)
等表达方法。
JSX本身也是表达式,转为普通的JS函数调用,取值后得到JS对象。可以在if
,for
中使用JSX,当参数传入,以及返回JSX。
1 | function getGreeting(user){ |
和html类似,可以使用属性或者在属性值用大括号插入js表达式(注意,不要引号,引号和大括号只有一个)。
1 | const elem = <img src={user.avatarUrl}></img> |
JSX可以防范XSS注入,会进行转义,所以不用担心。
1 | const title = response.potentiallyMaliciousInput; |
在使用中,Babel会将JSX转译为React.createElement()
函数调用,转化为基本的React元素。
元素渲染
元素是构成React应用的最小砖块,描述了屏幕上看到的内容。开销不大。
将React元素渲染倒根DOM节点,只需要一起传入ReactDOM.render()
中:
1 | const elem = <h1>hello world</h1>; |
React元素为不可变对象,更新UI的唯一的方式是创建全新的元素,并且传入ReactDOM.render()
:
1 | function tick(){ |
但在实践中,只调用以此ReactDOM.render()
,注意这点。
ReactDOM会将元素以及子元素与之前的状态进行比较,只进行最小的更新。
组件与Props
可以用JS函数或者ES6的类来定义组件,接收props
(属性),返回React元素。如下两种方法是等效的:
1 | function Welcome(props){ |
在使用中,组件可以是react元素:
1 | const elem = <Welcome name='2'/> |
当React元素为用户子当以自建时候,JSX所接收的属性以及子组件会转化为单个对象props传递给组件。
组件名字必须大写字母开头,小写字母被认为是原生DOM标签。
props是只读的,这意味着不改变入参,有着纯函数性质。
State与生命周期
state与props类似,但state是私有的,并且完全受控于当前组件。
class组件应当始终使用props参数调用父类的构造函数。在构造函数中,state被赋初值。,使用setState进行更改。
1 | class Clock extends React.Component{ |
当<Clock/>
被传给ReactDOM
后,会调用构造函数,初始化state,之后调用render方法,渲染输出,然后调用ComponentDidMount()
方法向浏览器请求设置计时器,每秒调用tick()
方法,tick()
使用setState()
更新,React便会更新DOM。组件被移除后,调用componentWillUnmount()
方法卸除计时器。
不要直接修改state,这样不会重新渲染组件。只能在构造函数赋值。
state和props可能异步更新,可以用在setState()
中传函数解决,如下所示:
1 | // Correct |
state的更新可能被合并。
state可以作为props向下传递。
事件处理
事件采用小驼峰方法命名,使用JSX的时候传入函数。必须显式采用preventDefault
来阻止默认行为。如下所示:
1 | function ActionLink() { |
e是一个合成事件。
在初始化时候应当绑定this,作为js特性,避免锅。
条件渲染
使用if-else或逻辑运算符来控制渲染。
1 | render() { |
如果不想渲染,可以直接返回null。
1 | function WarningBanner(props) { |
注意,生命周期方法还是会调用。
列表和key
使用map()
方法将数组映射成<li></li>
,记得在映射的时候指定key值,用于辨析元素是否改变,添加,删除。
1 | const numbers = [1, 2, 3, 4, 5]; |
key应当独一无二,用于标识。不建议用索引来当key值,但这是默认做法。
key在兄弟结点中必须唯一,但全局不一定唯一。
表单
可以用onChange
传入函数来控制组件维护的state