React 面试题 第二部分

1.列举十个常用的React 内置Hooks

  • useState:让函数组件具有维持状态的能力
  • useEffect:执行副作用
  • useCallback:避免不必要的函数重新创建、避免不必要的子组件重新渲染
  • useMemo:缓存计算的结果
  • useRef:在多次渲染之间共享数据
  • useContext:定义全局状态
  • useLayoutEffect
  • useReducer
  • useDebugValue
  • useImperativeHandle

2.为什么会有React Hooks 它解决了那些问题

如果你使用过 React 一段时间,你也许会熟悉一些解决此类问题的方案,比如 render props 和 高阶组件。 但是这类方案需要重新组织你的组件结构,这可能会很麻烦,使你的代码难以理解。 如果你在 React DevTools 中观察过 React 应用,你会发现由 providers,consumers,高阶组件,render props 等其他抽象层组成的组件会形成“嵌套地狱”。 你可以使用 Hook 从组件中提取状态逻辑,使得这些逻辑可以单独测试并复用。 Hook 使你在无需修改组件结构的情况下复用状态逻辑。 这使得在组件间或社区内共享 Hook 变得更便捷

3.React Hooks 如何模拟组件的生命周期

import React, { useState, useEffect, useRef } from "react"

interface Props {
  name: string;
}

const MyComponent: React.FC<Props> = ({ name }) => {
  const [count, setCount] = useState(0);
  const isMounted = useRef(false);

  useEffect(() => {
    console.log(`${name} is mounted`);
    isMounted.current = true;

    return () => {
      console.log(`${name} is unmounted`);
      isMounted.current = false;
    };
  }, []);

  useEffect(() => {
    if (isMounted.current) {
      console.log("count has been updated");
    }
  }, [count]);

  useEffect(() => {
    console.log("name has been updated");
  }, [name]);

  useEffect(() => {
    console.log("component has been updated");
  });

  const handleClick = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <h1>Hello {name}!</h1>
      <p>Count: {count}</p>
      <button onClick={handleClick}>Click me</button>
    </div>
  )
}

export default MyComponent;

在这个例子中,我们定义了一个MyComponent函数组件,它接受一个名为name的属性。 我们使用useState Hook来定义一个名为count的状态和一个名为setCount的函数,它用于更新状态。我们还使用useRef Hook来创建一个名为isMounted的引用,以检查组件是否已经挂载。

在组件的useEffect Hook中,我们通过传递一个空数组作为第二个参数来模拟componentDidMount方法。 在这个方法中,我们使用console.log语句记录组件的挂载和卸载状态,并设置isMounted的当前值以反映组件的挂载状态。

我们还使用了两个useEffect Hook来模拟componentDidUpdate方法。 第一个是通过传递count作为第二个参数来触发的,它在count的值被更新时记录一个消息。 第二个useEffect是不带依赖项的,它在每次更新时都会被调用,并记录一个通用的组件更新消息。

最后,我们定义了一个点击处理程序,它使用setCount来增加count的值。 在组件的返回语句中,我们使用JSX来渲染组件的内容。

使用这种方式,我们可以在函数组件中模拟类组件的生命周期方法,并且可以清晰地控制组件的状态和行为。

4.如何自定义hook

Hook 作为 React 的新特性,确实为我们提供了更多的可能性。通过自定义 Hook 的方式,我们可以将组件中可复用的状态逻辑抽离出来,保持其独立性。而当我们需要它时又可以很容易的将这些状态逻辑重新应用到组件内,与组件紧密的结合在一起,发挥它的作用。

5.说一下React Hooks 性能优化

  • React.memo : 和 class 组件时期的 PureComponent 一样,做简单额数据类型比较
  • useMemo : 可以用来比较复杂类型的数据,不如 Object Array 等
  • useCallback : 升级版本,用于控制传递函数时候控制组件是否需要更新

6.使用React Hooks 遇到的那些坑? 

  1. 不要改变 hooks 的调用顺序;
  2. 不要使用旧的状态;
  3. 不要创建旧的闭包;
  4. 不要忘记清理副作用;
  5. 不要在不需要重新渲染时使用useState;
  6. 不要缺少useEffect依赖。

7.Hooks 相比 HOC 和Render Prop 有那些有点 

Hooks 可以优化 render 的前置逻辑处理,也适合用于取代 class extend 的写法; HoC 更多是个从外注入的方案,也适合用来做插件; Render Props 可以在树状 VDOM 的渲染流程上有更多的自由度;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值