文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

面试官:说说对React Hooks的理解?解决了什么问题?

2024-12-03 01:46

关注

一、是什么

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性

至于为什么引入hook,官方给出的动机是解决长时间使用和维护react过程中常遇到的问题,例如:

在以前,函数组件也被称为无状态的组件,只负责渲染的一些工作

因此,现在的函数组件也可以是有状态的组件,内部也可以维护自身的状态以及做一些逻辑方面的处理

二、有哪些

上面讲到,Hooks让我们的函数组件拥有了类组件的特性,例如组件内的状态、生命周期

最常见的hooks有如下:

useState

首先给出一个例子,如下:

  1. import React, { useState } from 'react'
  2.  
  3. function Example() { 
  4.   // 声明一个叫 "count" 的 state 变量 
  5.   const [count, setCount] = useState(0); 
  6.  
  7.   return ( 
  8.     
     
  9.       

    You clicked {count} times

     
  10.        setCount(count + 1)}> 
  11.         Click me 
  12.        
  13.     
 
  •   ); 
  • 在函数组件中通过useState实现函数内部维护state,参数为state默认的值,返回值是一个数组,第一个值为当前的state,第二个值为更新state的函数

    该函数组件等价于的类组件如下:

    1. class Example extends React.Component { 
    2.   constructor(props) { 
    3.     super(props); 
    4.     this.state = { 
    5.       count: 0 
    6.     }; 
    7.   } 
    8.  
    9.   render() { 
    10.     return ( 
    11.       
       
    12.         

      You clicked {this.state.count} times

       
    13.          this.setState({ count: this.state.count + 1 })}> 
    14.           Click me 
    15.          
    16.       
     
  •     ); 
  •   } 
  • 从上述两种代码分析,可以看出两者区别:

    总的来讲,useState 使用起来更为简洁,减少了this指向不明确的情况

    useEffect

    useEffect可以让我们在函数组件中进行一些带有副作用的操作

    同样给出一个计时器示例:

    1. class Example extends React.Component { 
    2.   constructor(props) { 
    3.     super(props); 
    4.     this.state = { 
    5.       count: 0 
    6.     }; 
    7.   } 
    8.  
    9.   componentDidMount() { 
    10.     document.title = `You clicked ${this.state.count} times`; 
    11.   } 
    12.   componentDidUpdate() { 
    13.     document.title = `You clicked ${this.state.count} times`; 
    14.   } 
    15.  
    16.   render() { 
    17.     return ( 
    18.       
       
    19.         

      You clicked {this.state.count} times

       
    20.          this.setState({ count: this.state.count + 1 })}> 
    21.           Click me 
    22.          
    23.        
    24.     ); 
    25.   } 

    从上面可以看见,组件在加载和更新阶段都执行同样操作

    而如果使用useEffect后,则能够将相同的逻辑抽离出来,这是类组件不具备的方法

    对应的useEffect示例如下:

    1. import React, { useState, useEffect } from 'react'
    2. function Example() { 
    3.   const [count, setCount] = useState(0); 
    4.   
    5.   useEffect(() => {    document.title = `You clicked ${count} times`;  }); 
    6.   return ( 
    7.     
       
    8.       

      You clicked {count} times

       
    9.        setCount(count + 1)}> 
    10.         Click me 
    11.        
    12.      
    13.   ); 

    useEffect第一个参数接受一个回调函数,默认情况下,useEffect会在第一次渲染和更新之后都会执行,相当于在componentDidMount和componentDidUpdate两个生命周期函数中执行回调

    如果某些特定值在两次重渲染之间没有发生变化,你可以跳过对 effect 的调用,这时候只需要传入第二个参数,如下:

    1. useEffect(() => { 
    2.   document.title = `You clicked ${count} times`; 
    3. }, [count]); // 仅在 count 更改时更新 

    上述传入第二个参数后,如果 count 的值是 5,而且我们的组件重渲染的时候 count 还是等于 5,React 将对前一次渲染的 [5] 和后一次渲染的 [5] 进行比较,如果是相等则跳过effects执行

    回调函数中可以返回一个清除函数,这是effect可选的清除机制,相当于类组件中componentwillUnmount生命周期函数,可做一些清除副作用的操作,如下:

    1. useEffect(() => { 
    2.     function handleStatusChange(status) { 
    3.         setIsOnline(status.isOnline); 
    4.     } 
    5.  
    6.     ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange); 
    7.     return () => { 
    8.         ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange); 
    9.     }; 
    10. }); 

    所以, useEffect相当于componentDidMount,componentDidUpdate 和 componentWillUnmount 这三个生命周期函数的组合

    其它 hooks

    在组件通信过程中可以使用useContext,refs学习中我们也用到了useRef获取DOM结构......

    还有很多额外的hooks,如:

    三、解决什么

    通过对上面的初步认识,可以看到hooks能够更容易解决状态相关的重用的问题:

    编写hooks为函数式编程,每个功能都包裹在函数中,整体风格更清爽,更优雅

    hooks的出现,使函数组件的功能得到了扩充,拥有了类组件相似的功能,在我们日常使用中,使用hooks能够解决大多数问题,并且还拥有代码复用机制,因此优先考虑hooks

    参考文献

    https://zh-hans.reactjs.org/docs/hooks-state.html

    https://zh-hans.reactjs.org/docs/hooks-effect.html

     

    https://www.cnblogs.com/lalalagq/p/9898531.html

     

    来源:JS每日一题内容投诉

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    软考中级精品资料免费领

    • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

      难度     813人已做
      查看
    • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

      难度     354人已做
      查看
    • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

      难度     318人已做
      查看
    • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

      难度     435人已做
      查看
    • 2024年上半年系统架构设计师考试综合知识真题

      难度     224人已做
      查看

    相关文章

    发现更多好内容

    猜你喜欢

    AI推送时光机
    位置:首页-资讯-后端开发
    咦!没有更多了?去看看其它编程学习网 内容吧
    首页课程
    资料下载
    问答资讯