美文网首页
React Hooks的学习与理解(一)

React Hooks的学习与理解(一)

作者: 依然还是或者其他 | 来源:发表于2020-05-26 00:36 被阅读0次

前言

在使用Hooks时常常会出现一些有趣的问题,这些问题往往跟你之前的Component组件的思维有关。

Hooks与Component

Hooks的useEffect的确可以模拟部分class组件中生命周期的方法,但并不能把两者等同。因为两者本身是不同的(看起来像是一句废话)

Function组件是没有实例的,而Component组件是有实例的,这会导致在Function组件中没有办法引用和保证前一个state,而Component组件是可以的,所以Hooks添加了useRef。

可以再看下两者在渲染时的差异

Function 组件

function Example() {
  const [count, setCount] = useState(0);

  function handleAlertClick() {
    setTimeout(() => {
      alert('You clicked on: ' + count);
    }, 3000);
  }

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

Component组件

class Example extends React.Component{
  state={
    count:0
  }

  handleAlertClick=()=> {
    setTimeout(() => {
      alert('You clicked on: ' + this.state.count);
    }, 3000);
  }

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

同样的操作,比如点击Click Me按钮,先点击3次,然后点击Show alert按钮,再点击Click Me按钮2次。
那么同样的操作在两者中的alert结果是不同的:

  • Function组件:
    alert的是3
  • Component组件:
    alert的是5

原因在于Function组件的render相当于对当前状态进行了一次快照,props、state和其他事件函数等等都是重新生成的且独立的。这不同于Component组件,Component组件的props、state和事件函数可以保存在实例上,不需要重新生成,也就是实时的。
当然上面的Function组件例子中也有涉及到闭包相关的东西。

Hooks与闭包

Function组件在使用Hooks时会产生闭包。
在查看Hooks源码后也能体现出来。

闭包的其中一个特性是可以保持一个变量的持续引用。
再加上Function组件每次render都是一次独立的快照,即重新生成的了一个全新的函数。
那么当之前的异步函数发生调用时,由于闭包的特性,还保持了对于之前的引用,所以就导致了上述例子Function组件alert出来的是3。

由于Component组件的思维模式,在Hooks的开发中,常常会导致一些问题,其他很大一部分就是由于Function的快照与闭包导致的。

参考:
1.Hook 概览——React官方文档
2.Hooks FAQ——React官方文档
3.简单聊一聊 hooks 与闭包——Limboer
4.a-complete-guide-to-useeffect——Dan Abramov

相关文章

  • React Hooks的学习与理解(一)

    前言 在使用Hooks时常常会出现一些有趣的问题,这些问题往往跟你之前的Component组件的思维有关。 Hoo...

  • react-hooks

    前置 学习面试视频 总结react hooks react-hooks react-hooks为函数组件提供了一些...

  • 关于 React Hooks

    研习 react hooks 文档后,一些个人认为值得理解和关注的内容。 useState react hooks...

  • React Hooks究竟是什么呢?

    摘要: React Hooks原理解析。 原文:快速了解 React Hooks 原理 译者:前端小智 我们大部分...

  • 十个案例学会 React Hooks

    在学会使用React Hooks之前,可以先看一下相关原理学习React Hooks 前言 在 React 的世界...

  • React Hooks

    React Hooks Hooks其实就是有状态的函数式组件。 React Hooks让React的成本降低了很多...

  • 理解 React Hooks

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由志航发表于云+社区专栏 TL;DR 一句话总结 ...

  • 理解React Hooks

    useReducer 1. 组件初始化 在组件初始化的时候,调用useReducer会创建一个reducer ho...

  • React Hooks

    前言 React Conf 2018 上 React 提出了关于 React Hooks 的提案,Hooks 作为...

  • react-hooks

    react-hooks react-hooks 是react16.8以后,react新增的钩子API,目的是增加代...

网友评论

      本文标题:React Hooks的学习与理解(一)

      本文链接:https://www.haomeiwen.com/subject/ahmpahtx.html