# React 中的 hook
# 快速导航
# 前言
# Hook 是什么
- 增强了函数组件的功能
- 状态
- 生命周期
- hook 并不能提供全部的生命周期
- 引用
普通的函数组件没有状态
所有的 Hook 都是用 use 开头,自定义的 use 也得 hook 开头
useState 就是一个 Hook
import React, { useState } from 'react';
function App() {
const [a, setA] = useState(0);
return (
<div>
<button type="button" onClick={(ev) => setA(a + 1)}>
+1
</button>
React {a}
</div>
);
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# Hook 使用
class 组件
- 功能齐全,但是用麻烦
函数组件+hook
功能也齐全,而且使用方便
- 状态
- 生命周期
- 引用
- 其他
useState,useRef
# 支持情况
- 主流的 React 版本均支持
# React Hooks
# 基本用法
- useState
- useEffect
UI = render(data)
如何理解:函数 f 将数据(data)映射到用户界面(UI) 例如:商品 1,商品 2...商品列表
状态是数据?
状态有一个隐含,就是存在改变状态的行为
例如:点赞数(likes-状态)隐含了增加一个赞(addLike-行为),而这个行为(点赞)只有在某中上下文(context)中才会存在
React16.8 的新增特性,可以让你在不写 class 的情况下使用 state 等 react 特性
hooks 是对函数式组件的极大加强
看上去 UI = f(data)
点赞数 --> 点赞数展示
看上去只需要有足够多的切图经验+足够好的数据分类就可以做好 UI
# 实际上
- setTimeout
- console.log
- window.location.href
重新定义 UI 界面是什么,有哪些要素
- state hook
- effect hook
- context hook
- 函数 v = f(props,state), UI = V usehook1() usehooks2()
状态
在某个上下文中(用户界面)数据和改变数据的行为
// 计数器例子 const [count, setCount] = useState(0); React hooks 帮助大家将数据和行为绑定
function useCount() {
const [count, setCount] = useState(initialValue);
return [
count,
() => {
setCount(count + 1);
},
];
}
export default () => {
const [count, addCount] = useCount(0);
return (
<div>
Your count: {count}
<button onClick={() => addCount()}>Add</button>
</div>
);
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
状态与行为封装在一起
# 作用
UI 如果这样实现,它不仅仅是一个将数据映射到视图的函数
客观世界存在输入和输出之外的东西(改变 URL,改变坏境)
# React Hooks 如何描述作用(Effect)
- 客观世界有 url,计时器,logger...我们做不到完美而纯净(pure functional)的视图渲染
- 相同(或类似)的作用如何进行复用,React 团队提出了这个方案
# React Hooks 解决方案
- UI 产生的过程中,能够从 context 中获取信息(知识)
- UI 更像是一个人而不是机械的结构
UI => () => {
const {} = useContext(UserTypeContext);
switch(userType) {
// 不同的渲染逻辑
}
}
1
2
3
4
5
6
2
3
4
5
6
createContext
# reducer
- 设计模式:提供一种抽象状态行为的通用封装(action),以及计算过程的抽象方案(reducer) useReducer
# 引用行为ref(erence)
- 引用React管理以外的对象
- 需要在React之外做一些事情,例如:focus,媒体对象操作等
- 通常搭配useEffect
- 附带作用:方便得保存值
# 缓存
- 为什么要缓存?
- v=f(state,props) useHooks
- 想在f中new Object()只创建一次
- 一些复杂的计算只有在状态改变后才做
- 缓存一个函数(useCallback)
- 缓存一个值(useMemo)
使用React.memo减少重绘次数
hooks同步问题