认识 React Hooks

回顾函数组件

函数组件

  • 没有组件实例

  • 不能监听各个生命周期

  • 无法扩展属性和方法

  • 没有 state 和 setState

  • 只是输入 props ,输出 jsx ,纯函数。

javascript 复制代码
 // class 组件
 class List extends React.Component {
     constructor(props) {
         super(props)
     }
     render() {
         const { list } = this.props
 ​
         return <ul>{list.map((item, index) => {
             return <li key={item.id}>
                 <span>{item.title}</span>
             </li>
         })}</ul>
     }
 }
 ​
 // 函数组件
 function List(props) {
     const { list } = props
 ​
     return <ul>{list.map((item, index) => {
         return <li key={item.id}>
             <span>{item.title}</span>
         </li>
     })}</ul>
 }

class 组件 vs 函数组件

class 组件有如下问题

  • 大型组件很难拆分和重构 ,也很难测试。

  • 业务逻辑分散在组件的各个方法之中,导致重复逻辑或关联逻辑。

  • 组件类引入了 复杂的编程模式,比如 render props 和高阶组件。

按照 React 函数式编程的思维来说,一个组件更像一个函数,而不像一个 class ,即 view = fn(props) 所以,函数组件会看起来更简洁、符合逻辑。

但函数组件没有 state ,没有生命周期,还无法取代 class 组件。所以,才有了 React Hooks 。

state hook

函数组件,要求必需是纯函数,不能有副作用。因此,要在函数组件使用 state ,不能直接使用,而是要"钩"进来,这就是 Hooks

那如何把 state "钩"到函数组件呢?

代码总结

  • const [data, setData] = useState(0) 传入初始值,返回一个数组

  • 数组第一个元素,state 值

  • 数组第二个元素,setState 函数

注意命名规范

  • 规定所有 Hook 命名必须是 use 开头,如 useXxx

  • 自定义的 Hook ,也要 use 开头

  • 其他地方,不要乱用 useXxx 名字

effect hook

有了 state 之后,还差一个常用的功能 ------ 组件生命周期。例如,组件经常会在 didMount 里发请求

模拟声生命周期

  • 模拟 ComponentDidMount :useEffect 依赖 []

  • 模拟 ComponentDidUpdate :useEffect 无依赖,或者依赖 [a, b]

  • 模拟 ComponentWillUnMount :useEffect 中返回一个函数

  • 模拟 ComponentDidMount + ComponentDidUpdate :useEffect 无依赖

effect 实现的是副作用,解释一下这个词

  • 纯函数,输入参数,返回结果,不应该有副作用

  • 副作用:对函数之外的干扰,如设置一个定时任务

  • 而组件却需要副作用,所以用 effect hook 实现

模拟 ComponentWillUnMount 和 class 组件的 WillUnMount 还不一样。

以一个"监听好友在线状态(支持途中好友切换) "的组件为例子说明 ------ FriendStatusClass.js 和 FriendStatus.js ,对比着看。

  • 先用 class 组件:演示,光有 WillUnmount 满足不了需求,需要结合 Update 声明周期

  • 而用 effect Hook 一步就可以解决问题:

    • 使用 useEffect 无依赖,实现同时模拟 Update 生命周期
  • 所以这里的 "模拟 ComponentWillUnMount" 和 class 组件的 WillUnMount 不一样

    • 因为模拟 ComponentWillUnMount中 返回的函数 会在 下一次effect 执行之前被执行,无论是更新还是卸载

小结

有了 state ,有了最基本的 3 个生命周期,日常见的功能也就都能做了

相关推荐
幸运小猿3 小时前
模拟慢上传-处理超时重试image 丢失线上问题
前端·javascript·html
速易达网络5 小时前
ECharts 图表制作完全指南:从零到可视化实战
前端·javascript·echarts
paopaokaka_luck6 小时前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
kyriewen6 小时前
我验了 7 种 sticky 失效说法:3 种根本不成立
前端·javascript·程序员
tryCbest7 小时前
ES6 ( ECMAScript 2015)核心语法
前端·ecmascript·es6
我命由我123458 小时前
Python 实用操作 - 文件操作(打开与关闭文件、读取文件、文件写入)
java·开发语言·前端·javascript·数据库·python·java-ee
Momo__8 小时前
你写的 import 重试,从来没生效过
前端·javascript·typescript
tryCbest9 小时前
Vue3——第 11 篇:组合式 API(上)——setup 与响应式 API 深度解析
前端·javascript·vue.js
tryCbest10 小时前
Vue3——第 13 篇:计算属性与侦听器——computed 与 watch 的进化
前端·javascript·vue.js
用户1179536547810 小时前
企业团队编程软件怎么选:AI编程工具的协作与落地能力对比
javascript