zoukankan      html  css  js  c++  java
  • React Hooks

    一: 为什么要引入Hooks

      (1)想要复用一个有状态的组件太麻烦了。react的核心思想:将一个页面拆成一堆独立的,可复用的组件,并且用自上而下的单项数据流的形式将这些组件串联起来。

      但是大型项目中的react,项目中实际上很多react组件冗长且难以复用。尤其是写成class的组件,它们本身包含了状态(state),复用很麻烦

      原来用:渲染属性 Render Props  和高阶组件解决;

      痛处:会增加代码层级关系。

      (2)生命周期钩子函数中逻辑太乱。通常希望一个函数只做一件事情,但是我们的生命周期钩子函数中通常做了很多事情。比如在componentDidMount中发起ajax请求获取数据,绑定一些事件监听等等。同时,有时候需要在componentDidUpdate做一遍同样的事情。当项目变复杂后,这一块代码也就变得不那么直观。

      (3)class让人太困惑。this中的指向问题,以及很多时候用function写了一个简单完美的无状态组件,后来因为需求变动这个组件必须有自己的state,不得不把function改为class

    二:Hooks是什么?

      react新特性,即javaSript函数

      Hook 这个单词的意思是"钩子"。

      React Hooks 的意思是,组件尽量写成纯函数,如果需要外部功能和副作用,就用钩子把外部代码"钩"进来。 React Hooks 就是那些钩子。

    三:Hooks解决了什么问题?

      1.拥有hooks不需要写Class,所有组件都是Function,

      2.拥有hooks,生命周期钩子函数可以放一边

      3.this的指向问题将不存在

    三:Hooks怎么用?

      (1)State Hooks:声明状态变量。 useState这个函数接收的参数是我们的状态初始值(initial state),它返回了一个数组,这个数组的第 [0]项是当前当前的状态值,第 [1]项是可以改变状态值的方法函数。

      react规定我们必须将hooks写在函数的最外层,不能写在if-else等条件语句中,来确保hooks的执行顺序一致。

      (2)Effect Hooks:我们写有状态组件,通常会产生很多副作用(side effect),比如发起ajax请求获取数据,添加一些监听的注册和取消注册,手动修改dom等,我们之前都把这些副作用写在生命周期函数钩子里,比如componentDidMount、componentDidUpdate和componentWillUnmount。而现在的useEffect就相当于与这些声明周期函数钩子的集合体。

    同时,hooks可以反复多次使用,相互独立,我们合理的做法就是,给每一个副作用一个单独的useEffect钩子。这样一来,这些副作用不再一股脑堆在生命周期钩子里,代码变得更加清晰。

    注意:react首次渲染和之后的每次渲染都会调用一遍传给useEffect函数

       useEffect中定义的副作用函数的执行不会阻碍浏览器更新试图,也就是这些函数是异步执行,原来的DidMount和DidUpdate同步执行。

    解决:给useEffect传第二个参数即可解决每次渲染执行问题。用第二个参数来告诉react只有当这个参数的值发生改变时,才执行我们传的副作用函数。

    四:Hooks原理是什么?

      为什么useEffect第二个参数是空数组,相当于componentDidMount

      因为依赖一直不变化,callback不会二次执行

      1.为什么只能再函数最外层调用Hook?为什么不要在循环、条件判断或者子函数中调用

      存放state的数组memoizedState是按照hook定义的顺序来放置数据的,如果hook顺序变化,memoizedState并不会感知到

      2,。自定义Hook是如何影响使用它的组件的?

      共享同一个memoizedState,共享同一个顺序

    十个案例学会 React Hooks:https://github.com/happylindz/blog/issues/19

    React Hooks 原理:https://github.com/brickspert/blog/issues/26

  • 相关阅读:
    Python基础系列----语法、数据类型、变量、编码
    Python基础系列----环境的搭建及简单输入、输出
    Python 从基础------进阶------算法 系列
    Python数据库访问公共组件及模拟Http请求
    急!急!急!请问win32api参数乱码如何解决!
    打印之Lodop
    Elasticsearch 6.7.2 源码编译
    ElasticSearch源码之——Gateway
    ElasticSearch源码之——Netty在Elasticsearch中的应用
    从BIO到Netty
  • 原文地址:https://www.cnblogs.com/jcxfighting/p/11428088.html
Copyright © 2011-2022 走看看