# React Hooks 的思考

# 前言

听说 Hooks 有一段时间了,一直没去看文档。最近终于想起这事儿,浏览一遍文档后,立即燃起了一种“兴奋感”。
这种“兴奋感”犹如当初看见“箭头函数”、“async/await”一样。
所以,即使在有很多分析文章的情况下,仍想再写一些个人的思考和感受。
react hooks官方文档 (opens new window)

# 解决什么问题

别人总结的 (opens new window)

使用 React 开发遇到的三大问题:复用逻辑、巨型组件、混乱的 Class

上面总结得很到位,相信对每个有一定 React 开发经验的人来说都深有感触。

对我而言,当初学习 React 时,让我产生第一丝反感的代码是:onChange={this.handler.bind(this)}
而hooks让我眼前一亮的代码,正好完美地解决上面的问题。

import { useState } from 'react';

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

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

# 会产生什么影响

结论:将对React项目的代码组织结构产生巨大影响

我相信 React 是推荐写函数组件的(UI = f(Props)),实际上业务项目中绝大部分代码都处于 Class 组件内,维护一个庞大的 this.stateUI = render(State^n))。像这样:

不知道算不算违背了初衷。

React Hooks的目标是打碎这个庞大的 this.state,通过 Hooks API(惊艳),将组件状态用函数体内的变量来维护。
以后的代码结构(依赖关系)可能是这样:

相信以后大家会更喜欢写函数组件了。

这次“组织结构”调整将提升代码可维护性,更容易复用逻辑与 UI。

# 会带来什么问题

  1. 一定程度上导致代码碎片化 Hooks 的特性会让开发者,打碎集中式的 state,编写小型的函数组件。
    而复杂的需要维护的业务状态并不会减少,代码量也不会少。这将导致开发者拆分出大量的函数组件和自定义 hooks。
  2. 复杂度增加,初学者理解起来更加困难 Hooks 维持状态的机制(闭包),加上 React 自动渲染(之前是 class render 方法,现在是函数体),
  3. 还可能在代码调式方面造成困难 https://zhuanlan.zhihu.com/p/48264713

# 番外篇

阅读文档,第一眼看到篇首的代码时,立即联想到Reagent Form-2 component (opens new window)

(defn counting-button [txt]
  (let [state (reagent/atom 0)] ;; state is accessible in the render function
    (fn [txt]
      [:button.green
        {:on-click #(swap! state inc)}
        (str txt " " @state)])))

希望 React Hooks 能大幅降低 Form-3 component 出现的几率。

💗 博主正处于裸辞待业状态,欢迎 商务合作 💗

相关文章

从 React 看前端 UI 代码范式革命

alt text 前言 本来打算写的主题是“我为什么讨厌 React Hooks API”,展开聊聊“小甜甜”是如何变成“牛夫人”的,没想到越写越严肃:) React 是两次前端范式革命的引领者,至今仍有繁荣的社区和旺盛的创造力; React 多次天才又激进的创新,一些想法被借鉴改良、一些引发广泛质疑,大部分是被认同和接受的; ...

WebCodecs 性能表现及优化思路

笔者开源 WebAV 已经一年半,还写了系列文章帮助初学者入门 Web 音视频。 之前一直隐隐担心在 Web 平台处理音视频与 Native APP 会有明显性能差距,因为 WebCodecs API 毕竟被浏览器代理了一层,且一些数据处理需要 js 配合,不确定有多大的性能损耗。 相信刚接触 WebCodecs 的读者也非常关心它的性能表现如何。 ...

Web 网页自集成 HTTP 代理方案

前言 大部分程序员,想必都有会一个常用的抓包代理工具; 但在座的各位,可曾见过这样一款集成在 Web 应用中的代理工具? 它是明显区别于传统代理工具的,有以下特性: 零安装,零配置,Web 点击即用、APP 扫码即用;_(不 ...

Web 文件系统(OPFS 及工具)介绍

文件系统是往往是构建大型软件的基石之一,很长一段时间 Web 平台因缺失成熟的文件系统成为构建大型软件的阻碍,如今 OPFS 可弥补这一缺憾。 本文介绍 OPFS 背景和基本使用方法、使用过程中的注意事项,及如何配合笔者开源的 opfs-tools、opfs-tools-explorer 两个项目,充分发挥 OPFS 的性能与开发效率。 Web 存储 A ...

opfs-tools (文件系统 API) 项目介绍

文件系统是许多领域程序的基石,所有通用编程语言都会内置完备的文件系统 API。 Web 很长一段时间没有提供完善的访问文件系统的规范,使得需要高频读写文件、大文件处理软件在 Web 端都会受到一些限制,比如音视频剪辑、游戏、数据库等等。 之前在浏览器中实现视频裁剪、截帧等相关功能时,发现缺少基本的操作文件的 API,比如读写、移动、复制文件。 而 [OPFS] ...

Web 终极拦截技巧(全是骚操作)

拦截的价值 > 计算机科学领域的任何问题都可以通过增加一个中间层来解决。 —— Butler Lampson 如果系统的控制权、代码完全被掌控,很容易添加中间层; 现实情况我们往往无法控制系统的所有环节,所以需要使用一些 “非常规”(拦截) 手段来增加中间层。 拦截的方法 拦截/覆写 浏览器 API 最常见的场景有通过拦截 console ...

Web 音视频(六)图像素材处理

Web 音视频目录 前序章节介绍了如何在浏览器中解析、创建视频,以及给视频添加一些自定义素材(图片、音频、文字...); 本章介绍如何给图像素材加特效、加动画,实现转场、移动水印、图像滤镜美化等功能。 你可以跳过原理介绍,直接查看 WebAV 示例 素材动画 在视频制作中实现动画跟其他场景略有不同,因为视频 ...