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

一、是什么

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

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

  • 难以重用和共享组件中的与状态相关的逻辑

  • 逻辑复杂的组件难以开发与维护,当我们的组件需要处理多个互不相关的 local state 时,每个生命周期函数中可能会包含着各种互不相关的逻辑在里面

  • 类组件中的this增加学习成本,类组件在基于现有工具的优化上存在些许问题

  • 由于业务变动,函数组件不得不改为类组件等等

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

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

二、有哪些

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

最常见的hooks有如下:

  • useState

  • useEffect

  • 其他

useState

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

import React, { useState } from 'react';

function Example() {
  // 声明一个叫 "count" 的 state 变量
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

在函数组件中通过useState实现函数内部维护state,参数为state默认的值,返回值是一个数组,第一个值为当前的state,第二个值为更新state的函数

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

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  render() {
    return (
      <div>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Click me
        </button>
      </div>
    );
  }
}

从上述两种代码分析,可以看出两者区别:

  • state声明方式:在函数组件中通过 useState 直接获取,类组件通过constructor 构造函数中设置

  • state读取方式:在函数组件中直接使用变量,类组件通过this.state.count的方式获取

  • state更新方式:在函数组件中通过 setCount 更新,类组件通过this.setState()

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

useEffect

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

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

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  componentDidMount() {
    document.title = `You clicked ${this.state.count} times`;
  }
  componentDidUpdate() {
    document.title = `You clicked ${this.state.count} times`;
  }

  render() {
    return (
      <div>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Click me
        </button>
      </div>
    );
  }
}

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

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

对应的useEffect示例如下:

import React, { useState, useEffect } from 'react';
function Example() {
  const [count, setCount] = useState(0);
 
  useEffect(() => {    document.title = `You clicked ${count} times`;  });
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

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

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

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

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

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

useEffect(() => {
    function handleStatusChange(status) {
        setIsOnline(status.isOnline);
    }

    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    return () => {
        ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
});

所以, useEffect相当于componentDidMountcomponentDidUpdatecomponentWillUnmount 这三个生命周期函数的组合

其它 hooks

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

还有很多额外的hooks,如:

  • useReducer

  • useCallback

  • useMemo

  • useRef

三、解决什么

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

  • 每调用useHook一次都会生成一份独立的状态

  • 通过自定义hook能够更好的封装我们的功能

编写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

--The End--

系列正在更新:16/33

点击下方卡片解锁更多

创作不易,星标、点赞、在看 三连支持

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React 是一个非常流行的 JavaScript 框架,它的主要优点包括: 1. 高效的渲染:React 使用虚拟 DOM 技术,可以快速更新页面上的元素,减少了浏览器的重绘和回流,提升了页面的性能。 2. 可重用的组件:React 将 UI 拆分为独立的组件,可以将这些组件重用在不同的应用中,从而减少了代码的重复。 3. 简单易用的 API:React 的 API 设计非常简单易用,可以快速上手,而且可以和其他框架或库很好地集成。 4. 大量的社区资源:React 拥有庞大的社区,有很多优秀的组件、插件和工具可供使用。 React 的劣势包括: 1. 学习曲线较陡峭:相比传统的 DOM 操作,React 的编程模型有一定的学习曲线,需要一定的时间来熟悉。 2. 需要构建工具支持:React 应用需要使用构建工具进行打包和编译,这增加了开发成本。 React 的出现解决了传统的 DOM 操作的一些痛点,例如手动操作 DOM 很容易出错,而且性能较差,难以维护。React 使用虚拟 DOM 技术,可以快速更新页面上的元素,减少了浏览器的重绘和回流,提升了页面的性能。 虚拟 DOM 的优点包括: 1. 快速更新:虚拟 DOM 可以快速更新页面上的元素,减少了浏览器的重绘和回流,提升了页面的性能。 2. 跨平台支持:虚拟 DOM 不依赖于浏览器的实际 DOM,可以在不同的平台上使用,例如服务器端渲染、React Native 等。 虚拟 DOM 的缺点包括: 1. 需要额外的内存:虚拟 DOM 需要创建额外的数据结构来表示页面上的元素,这会占用一定的内存空间。 2. 初次渲染较慢:由于需要额外的数据结构来表示页面上的元素,虚拟 DOM 在初次渲染时会比直接操作实际 DOM 慢一些。 React Hooks 是 React 16.8 引入的新特性,它可以让函数组件拥有类组件的状态和生命周期管理能力。React Hooks 的优点包括: 1. 简化代码:使用 React Hooks 可以将状态管理和副作用的处理逻辑与 UI 逻辑分离,代码变得更加简洁。 2. 更好的可测试性:React Hooks 可以使组件的状态和副作用更容易进行单元测试。 3. 更好的复用性:使用 React Hooks 可以将组件的状态和副作用抽象为自定义 Hook,便于复用。 React Hooks 的劣势包括: 1. 学习曲线较陡峭:React Hooks 的使用需要一定的学习成本,需要理解 Hook 的实现原理和使用规则。 2. 不支持所有的生命周期:React Hooks 并不支持所有的生命周期,有些场景下需要使用类组件才能实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值