Part4-React Hooks

预习视频

【最新】零基础快速入门React 17.xarrow-up-right

视频P56-P73

今日学习目标

1、掌握函数式组件

2、掌握Hooks的写法

3、掌握Fragment

4、了解错误边界

5、掌握PureComponent

6、了解HOC高阶组件

7、掌握LazyLoad与Suspense、fallback

一、React Hooks介绍【了解】

官网地址:https://react.docschina.org/docs/hooks-intro.htmlarrow-up-right

image-20210420155440826arrow-up-right

二、函数式组件【掌握】

纯函数组件有以下特点:

  • 没有状态

  • 没有生命周期

  • 没有 this

因存在如上特点,使得纯函数组件只能做UI展示的功能, 涉及到状态的管理与切换就不得不用到类组件或者redux。 但因为简单的页面也是用类组件,同时要继承一个React实例,使得代码会显得很重。

以前我们可以使用class来声明一个组件,其实使用function也可以定义一个组件:

创建 App1.js

备注:

在vscode中,如果安装过 ES7 React/Redux/GraphQL/React-Native snippets 这个插件,即可直接使用 rfc 快捷键敲出以下模板:

index.js 中调用:

效果如下:

arrow-up-right

三、常用Hooks【掌握】

按照我们之前的类声明编程,写一个累加器如下:

效果如下:

Jietu20210420-160027-HDarrow-up-right

1、useState

现在我们改成函数式编程:

累加效果一样可以实现。

2、Hooks开发注意点【注意】

Hooks的定义不能放在条件判断的语句中,如:

这种写法会报错:

image-20210420162411335arrow-up-right

这里注意:

Hooks的API只能在函数内的最外层声明。

3、useEffect

React函数式编程没有生命周期,因此需要借助useEffect来实现。

* componentDidMount与componentDidUpdate

如果使用class编程,我们检测数据变化就需要这么做:

结合componentDidMount与componentDidUpdate两个生命周期函数来检测。

1arrow-up-right

我们来看看function编程与Hooks怎么解决这一问题:

一个useEffect就可以替代两个生命周期函数:

2arrow-up-right

这里注意:

useEffect是异步的,不会阻断试图更新。

如果有两个字段都在页面中有更新,但只想指定其中某个来检测,那么可以给 useEffect 添加第二个参数,第二个参数是个数组,数组为空时,表示不检测,数组项为某个字段名称时,表示只检测指定字段的更新:

* componentWillUnmount

当我们需要在组件销毁时做一些清除工作,就需要使用componentWillUnmount。但函数式编程没有这个生命周期,因此也同样需要借助useEffect实现。

由于这里需要做页面的销毁,在 index.js 中最后添加:

创建 App2.js :

⚠️ 这里注意:

同个useEffect下,在检测销毁和检测字段更新之间,只能二选一。留下空数组,可以检测到return中的销毁。数组非空时,视图更新会带动return返回值,因此如果要检测字段更新,就无法检测销毁。

4、useContext

函数式的组件,如果需要父传子,那么就需要使用useContext。

* 用法一:

useContext有两种用法,第一种是使用useContext来调用上下文内容。代码如下:

* 用法二:

使用 Consumer 来接收数据,这种方法还可以使用 Chrome 扩展 react-context-devtool3.2.crx 来观测数据。

首先,将 react-context-devtool3.2.crx 直接拽入 Chrome 的扩展中。

扩展下载链接: https://pan.baidu.com/s/1ejGlj6_Sierd6w6GQ74mYwarrow-up-right 提取码: 1wv6

其次,安装 react-context-devtool

然后在项目入口文件 src>index.js 中:

这里注意:

debugContextDevtool方法有第二个参数,是用来传入配置项的。主要配置项有:

Name
Type
Default
Description

debugReducer

boolean

true

enable/disable useReducer debug

debugContext

boolean

true

enable/disable context debug

disable

boolean

false

disable react-context-devtool including manual mode

disableAutoMode

boolean

false

disable auto mode only

但我们直接忽略不填就行了。具体参考网址:

Debug ReactJS Context and useReducer hook with React Context Devtoolarrow-up-right

引入组件并在Provider使用:

然后在子组件中修改:

* 最终代码:

重新修改 App3.jsx

5、useReducer

useReducer与useContext不太一样,有点类似于Redux。

6、useContext结合useReducer实现redux

* 第一步

将以上 1、定义一个reducer 这一步的函数抽离到 store>reducer.js 中:

* 第二步

引入reducer,并引入useContext与createContext

* 第三步

定义Sub1和Sub2子组件,Sub1用于累加,Sub2用于减少。

* 第四步

在App4组件中调用Sub1和Sub2,并使用Provider:

* 完整代码

* 提升:

如果还想把h2标签抽离成组件,那么代码要改为:

这里再提供Consumer写法:

可以把子组件的useContext改为:

7、useRef

ref就是类似于id的属性,用于获取dom元素,比较简单:

除此之外还有useMemo等多个Hooks,但我们没必要全部掌握,了解常用的即可。

四、Fragment与空标签【掌握】

组件中每个return都必须包含一个根标签,通常我们会使用 <div></div> ,但这也比较麻烦,毕竟有时真的不想套一个div,那我们可以这样:

或者是:

* 注意:

<></> 语法不能接受键值或属性,而 <Fragment> 可以。keychildren 是唯一可以传递给 Fragment 的属性,主要用在做for循环时可以拿key来做唯一标识。未来可能会添加对其他属性的支持,例如事件。

五、错误边界【了解】

官网地址:https://react.docschina.org/docs/error-boundaries.htmlarrow-up-right

错误边界是一种 React 组件,可以捕获并打印发生在其子组件树任何位置的 JavaScript 错误,并且渲染出备用 UI。错误边界在渲染期间、生命周期和整个组件树的构造函数中捕获错误。

它无法在以下场景捕获错误:

  • 事件处理(了解更多)

  • 异步代码(例如 setTimeout 或 requestAnimationFrame 回调函数)

  • 服务端渲染

  • 它自身抛出来的错误(并非它的子组件)

错误边界有两种,一种是componentDidCatch(),另一种是 static getDerivedStateFromError 。这是两种生命周期方法,只要class组件用了任意一种,那它就变成一个错误边界组件。

1、componentDidCatch()

声明一个错误边界组件 ErrorBoundary.jsx,这个组件可以直接应用到全局

声明一个测试组件 Test.jsx,只要输入的是非字母就会报错:

在整个App中的组件最外层,套上这个错误边界组件:

如上,可以测试到,只要输入的是非字母,就会报错:

arrow-up-right

2、static getDerivedStateFromError()

将错误边界组件中的 componentDidCatch() 改为:

六、PureComponent【熟悉】

我们在学习生命周期的时候,了解过 shouldComponentUpdate ,它是用来判断字段修改前后值是否相等的,而且必须返回true或false,我们来看:

我们有个替代的方案,那就是 PureComponent 。它其实就是在帮我们做这样一件事:自动的帮我们编写shouldComponentUpdate方法, 避免我们为每个组件都编写一次的麻烦。我们只需要这样, 就可以一步到位:

七、高阶组件HOC【掌握】

官网地址:https://react.docschina.org/docs/higher-order-components.htmlarrow-up-right

**高阶组件(HOC)**是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。

可以简单将其理解成 “类工厂”,一般在class组件时使用。我们先来写个简单的案例:

上面的Sub1和Sub2都是在定时器结束后修改num,大家可以看到代码几乎完全一样。那么这时候你肯定会想到代码抽离,所以我们定义一个函数来抽离:

如此,咱们就实现了高阶组件。

八、LazyLoad【熟悉】

React有组件懒加载的功能。

我们先定义一个 Sub.js 子组件:

再在父组件引用:

但以上代码是无效的,因为:懒加载必须结合Suspense一起使用。

九、Suspense【熟悉】

Suspense主要解决的就是网络IO问题,是用来包裹异步组件,添加loading效果等。

我们添加Suspense代码:

至此,我们将network的 No throtting 调为 slow 3G ,然后刷新页面,就可以看到loading的效果。

十、作业

作业一(初级)

使用 Function Component结合Hooks完成Tab栏切换。

作业二(中级)

使用Function Component结合Hooks完成微博发布。

项目效果:http://codesohigh.com/vue-weibo/arrow-up-right

作业三(高级)

开始搭建 《IT猿题库》arrow-up-right项目,并完成首页布局。(打开项目时记得先清空localStorage)

项目psd设计稿:链接: https://pan.baidu.com/s/1h5Zz45ZpX6fspbYWqsBtdAarrow-up-right 提取码: 8w1g

最后更新于