作为 React 初学者,使用过 React 一段时间之后,进行总结一下。
首先接触的项目类型是医学类「临床试验电子数据采集系统/数据管理系统」,项目中主要结合 fusion design、Bizcharts 等。
一、Hooks 组件
Hook 不会影响你对 React 概念的理解。 Hook 为已知的 React 概念提供了更直接的 API:props, state,context,refs 以及生命周期。Hook 还提供了一种更强大的方式来进行组合。
Q:React class 是有生命周期的,那么 React hooks 有没有生命周期呢?
A:函数组件的本质是函数,没有 state 的概念,因此不存在生命周期一说,它仅仅是一个 render 函数而已。但是引入 Hooks 后就不同了,它能让组件在不使用 class 的情况下使用 state 以及其他的 React 特性,相比与 class 的生命周期概念来说,它更接近于实现状态同步,而不是响应生命周期事件。
但我们可以利用 useState()、 useEffect() 和 useLayoutEffect() 来模拟实现生命周期。
二、提取自定义 Hook
也可以使用 Hook 从组件中提取状态逻辑,使得这些逻辑可以单独测试并复用。Hook 使你在无需修改组件结构的情况下复用状态逻辑。 这使得在组件间或社区内共享 Hook 变得更便捷。
当我们想在多个函数之间共享逻辑时,我们会把它提取成一个公共的函数。而组件和 Hook 都是函数,所以也同样适用这种方式。
自定义 Hook 是一个函数,其名称以 “use” 开头,函数内部可以调用其他的 Hook。 例如,下面的 useStudyInfo 是我们第一个自定义的 Hook:
import { useEffect, useState } from 'react'
export default function useStudyInfo(studyId: number) {
const [studyInfo, setStudyInfo] = useState(null)
useEffect(() => {
$api.studyDetail.studyInfo(studyId)
.then((res) => {
const { code, data, message } = res
if (code === 0) {
setStudyInfo(data)
} else {
Message.error(message)
}
})
}, [])
return studyInfo
}
此处 useStudyInfo 的 Hook 目的是为了获取当前登录的用户信息。
Q:自定义 Hook 必须以 'use' 开头吗? A:是的,必须的。这个约定非常重要。不遵循的话,由于无法判断某个函数是否包含对其内部 Hook 的调用,React 将无法自动检查你的 Hook 是否违反了 Hook 的规则。
未完待续。。。