ahooks 正式發布:值得擁抱的 React Hooks 工具庫

2021-02-20 Alibaba F2E

圖片來源:網絡


從 React Hooks 正式發布到現在,越來越多的項目正在使用 Function Component 替代 Class Component,Hooks 這一新特性也逐漸被廣泛的使用。


然而在實踐的過程中,我們發現在很多常見的場景下,大部分邏輯是重複且可被復用的,如對數據請求的邏輯處理,對防抖節流的邏輯處理等,同樣的代碼經常會在同一個或不同的項目中被重複的編寫 😂。


另一方面,由於 Hooks 雖然解決了 Class 組件的 this 、 LifeCycle 等學習成本過高的問題,但是也引入了諸如閉包、依賴地獄、不能在條件語句中使用的約定等等新的問題,導致對 Hooks 新手而言並不友好,經常會遇到 Hooks 的各種奇怪問題而摸不著頭腦 🤣 。


要解決上面的問題,讓我們回到 React Hooks 本身,相比 Class 而言 Hooks 到底給我們帶來了哪些優勢,怎麼利用這些優勢來提升生產效率。對比而言,React Hooks 的主要特性之一就是可以在組件之間共享可復用的狀態邏輯,方便了開發者將業務邏輯和 UI 視圖進行解耦,從而狀態與 UI 的界限會越來越清晰,順著這個思路,我們是否有機會將與業務無關的邏輯進行抽象,封裝一套通用場景的純邏輯的 Hooks 工具方法,答案是肯定的,我們稱之為 ice/hooks,其討論過程詳見 [RFC] 通用場景的 Hooks 方案,這便也是 ahooks 的由來。


ice/hooks:面向中後臺業務場景的 Hooks 方案。


那麼好奇的你肯定會問, ice/hooks 與標題的 ahooks 的關係是什麼? 待我細細道來 😆


在 ice/hooks RFC 期間,我們也對比參考了社區的同類方案諸如 react-use 等,但最終因為 react-use 提供的 Hooks 過於冗餘(已經超過 100+),大部分在實際業務中可能使用不到,以及它在一年時間內大版本已經變更到 v15 的原因等最終放棄選,最終確定 ice/hooks 中提供的 Hooks 一方面是基於 react-use 的基礎部分,另一方面更多的是貼合業務的,由業務中進行提煉出來的 Hooks 進行組合的方案。


正當方案確定準備開發時,在 ice/hooks RFC 評論區收到來自螞蟻 umi 團隊 #盡龍 的回覆,希望可以共建維護一套阿里集團通用的 Hooks 方案,經過幾輪討論下來為避免重複建設,以及共同訴求的前提下,與螞蟻 umi 團隊,阿里體育團隊達成共建 React Hooks 工具庫的目標,這便是 ahooks 工具庫品牌的由來。


ahooks:基於 React Hooks 的工具庫,致力提供常用且高質量的 Hooks。



通過近 2 個月的共建,ahooks 已正式發布 v1.0 版本 ✊🏿 ✊🏽 ✊🏾。

項目目標

ahooks 定位於一套基於 React Hooks 的工具庫,核心圍繞 React Hooks 的邏輯封裝能力,降低代碼複雜度和避免團隊的重複建設為背景,共同建設和維護阿里經濟體層面的 React Hooks 庫,使之成為和 antd/fusion 組件庫一樣的基礎設施能力,幫助開發者在邏輯層面省去大量的重複工作。


品牌升級


在共建之前由於 umi 團隊已經有了一定的 Hooks 沉澱,因此主要基於已有的能力進行整合和迭代,對特殊依賴的 Hooks 進行規範化,並將品牌升級為 ahooks。


社區開源


由於品牌升級和出於共建的考慮,ahooks 代碼也已提交了開源流程申請並已經通過審批,原始碼維護在 Alibaba Group 下。詳見 alibaba/hooks


API 規範


ahooks 基於 UI、SideEffect、LifeCycle、State、DOM 等分類提供了常用的 Hooks,如下圖所示。並對每一類接口的 API 進行了規範化,如規範入參結構、返回值結構等,保證 API 層面的簡潔和一致性。



示例演示
import { useRequest } from 'ahooks';
const { data, error, loading, ...rest } = useRequest<R>( service: string | object | ((...args:any) => string | object), { ..., requestMethod?: (service) => Promise })

import { useBoolean } from 'ahooks';
const [ state, { toggle, setTrue, setFalse }] = useBoolean( defaultValue?: boolean,);

import { useLocalStorageState } from 'ahooks';
const [state, setState] = useLocalStorageState<T>( key: string, defaultValue?: T | (() => T),): [T?, (value?: T | ((previousState: T) => T)) => void]


更多示例詳見 ahooks 官網:https://ahooks.js.org/zh-CN/hooks/async


開發迭代


在開源項目中如何保障 ahooks 的正常開發迭代是首先需要達成一致共識的,因此我們也制定了相應的維護機制,即將現有的 Hooks 按照分類指派到每個人,被指派的人需要負責該分類下的新增、 日常維護、 Review 和疑難問題的解決。以及建立周報和周會機制,每兩周聚焦一次當下的進度和問題,以此確保開源項目正常的開發迭代。



歡迎與我們聯繫,或者加入我們一起參與項目開發 ❤️



隨著 ahooks 正式版本的發布,開源的主體工作基本已完成,但目前更多追求的是功能的完成,接下來一方面我們會基於各自的業務場景繼續不斷的完善和沉澱更多通用的 Hooks,簡化邏輯層面大量的重複工作,以此降低代碼複雜度和提升開發效率;另外一方面也在計劃編寫基於 React Hooks 的系列教程,幫助 Hooks 新手更好的理解和使用 React Hooks。


最後的最後,關於 ahooks 任何使用上的問題歡迎在釘釘群反饋。



相關連結

關注「Alibaba F2E」

把握阿里巴巴前端新動向

相關焦點

  • React 16.8發布:hooks終於來了!
    如果你之前從未聽說過 hooks,可以參考以下這些資源:「Introducing hookss」解釋了我們為 React 添加 hooks 功能:https://reactjs.org/docs/hooks-intro.html「hookss at a Glance」對內置的 hooks 進行了快速的介紹:https://reactjs.org
  • React v16.8 發布:帶來穩定版的 Hooks 功能
    React v16.8 版本已於2月6日發布,最值得關注的更新莫過於帶來了穩定版的 Hooks 功能。
  • React Hooks使用小結
    React Hooks已經出來很久了,有人早已擁抱hooks,有人class大法如此好,何必hooks,也有人左手hooks,右手class。
  • 函數式編程看React Hooks(一)簡單React Hooks實現
    從 react 的變化可以看出,react 走的道路越來越接近於函數式編程,輸入輸出一致性。當然也不是憑空地去往這個方面,而是為了能夠解決更多的問題。以下 三點是 react 官網所提到的 hooks 的動機 https://zh-hans.reactjs.org/docs/hooks-intro.html#motivation代碼重用:在hooks出來之前,常見的代碼重用方式是 HOC 和render props,這兩種方式帶來的問題是:你需要解構自己的組件,同時會帶來很深的組件嵌套複雜的組件邏輯:在class組件中
  • 寫React Hooks前必讀
    來源:相學長 https://zhuanlan.zhihu.com/p/113216415最近團隊內有同學,由於寫react hooks引發了一些bug,甚至有1例是線上問題。團隊內也因此發起了一些爭執,到底要不要寫hooks?到底要不要加lint?到底要不要加autofix?
  • 你可能不知道的 React Hooks
    參考資料[1] Hooks API Reference: https://reactjs.org/docs/hooks-reference.html[2] useEffect: https://reactjs.org/docs/hooks-reference.html#useeffect[3] Hooks API Reference: https://reactjs.org
  • 寫React Hooks前需要注意什麼?
    必須完整閱讀一次React Hooks官方文檔英文文檔:https://reactjs.org/docs/hooks-intro.html中文文檔:https://zh-hans.reactjs.org/docs/hooks-intro.html其中重點必看hooks: useState、useReducer、useEffect、useCallback
  • React Hooks 原理與最佳實踐
    Custom Hooks對於 react 來說,在函數組件中使用 state 固然有一些價值,但最有價值的還是可以編寫通用 custom hooks 的能力。想像一下,一個單純不依賴 UI 的業務邏輯 hook,我們開箱即用。不僅可以在不同的項目中復用,甚至還可以跨平臺使用,react、react native、react vr 等等。
  • 【實戰總結篇】寫React Hooks前必讀
    「最近團隊內有同學,由於寫react hooks引發了一些bug,甚至有1例是線上問題。
  • React Hooks 設計思想
    那麼,如果我們通過一套 API 設計實現以上三點且避開 class 組件的缺陷,提供更好的分離關注點能力,讓代碼復用更加簡易,是不是一件很值得期待的事情呢?React Hooks 就是滿足這些要求的新設計。
  • 超性感的React Hooks(四):useEffect
    許多朋友試圖利用class語法中的生命周期來類比理解useEffect,也許他們認為,hooks只是語法糖而已。那麼,即使正在使用hooks,也有可能對我上面這一段話表示不理解,甚至還會問:不類比生命周期,怎麼學習hooks?我不得不很明確的告訴大家,生命周期和useEffect是完全不同的。
  • React Hooks 還不如類?
    本文最初發布於 Medium 網站,經原作者授權翻譯並分享。我們發現,類可能是學習 React 道路上的一大障礙。你必須了解 this 在 JavaScript 中的工作機制,這和大多數語言中的機制截然不同。你必須記得綁定事件處理程序。
  • 30 分鐘精通 React 新特性——React Hooks
    難道是Mixins要在react中死灰復燃了嗎?當然不會了,等會我們再來談兩者的區別。總而言之,這些hooks的目標就是讓你不再寫class,讓function一統江湖。React為什麼要搞一個Hooks?想要復用一個有狀態的組件太麻煩了!我們都知道react都核心思想就是,將一個頁面拆成一堆獨立的,可復用的組件,並且用自上而下的單向數據流的形式將這些組件串聯起來。
  • React hooks 最佳實踐【更新中】
    function component 來代替類的寫法;但是俗話說的好,沒有什麼東西是十全十美的,在本次整理總結 hooks 庫的過程中,有體驗到 hooks 帶來的體驗提升,同時也存在對比類生命周期寫法中不足的地方。
  • 30 分鐘精通 React 今年最勁爆的新特性 —— React Hooks
    難道是Mixins要在react中死灰復燃了嗎?當然不會了,等會我們再來談兩者的區別。總而言之,這些hooks的目標就是讓你不再寫class,讓function一統江湖。React為什麼要搞一個Hooks?想要復用一個有狀態的組件太麻煩了!我們都知道react都核心思想就是,將一個頁面拆成一堆獨立的,可復用的組件,並且用自上而下的單向數據流的形式將這些組件串聯起來。
  • React Status 中文周刊 #21 - 2020 年 React 大事記回顧
    原文連結:https://www.lorenzweiss.de/common_mistakes_react_hooks/Lorenz原文連結:https://www.robinwieruch.de/react-hooks-higher-order-components原文連結:https://www.robinwieruch.de/react-hooks-higher-order-components原文連結:https://www.robinwieruch.de/react-hooks-higher-order-components
  • 使用React Hooks代替類的6大理由
    React hooks 已經出來有一段時間了,但是許多 React 開發人員對它們的態度並不是很積極。我發現這背後主要有兩個原因。第一個原因是許多 React 開發人員已經參與了一個大型項目,需要付出巨大的努力才能遷移整個代碼庫。另一個原因是大家對 React 類已經很熟悉了。有足夠經驗的話,繼續使用類會感到更自在。
  • 10分鐘教你手寫8個常用的自定義hooks
    本文是一篇以實戰為主的文章,主要講解實際項目中如何使用hooks以及一些最佳實踐,不會一步步再介紹一遍react hooks的由來和基本使用,因為寫hooks的文章很多,而且官網對於react hooks的介紹也很詳細,所以大家不熟悉的可以看一遍官網。
  • 「不容錯過」手摸手帶你實現 React Hooks
    如此很容易產生 bugthis 指向問題:父組件給子組件傳遞函數時,必須綁定 thisHook 規則 只能在函數內部的最外層調用 Hook,不要在循環、條件判斷或者子函數中調用只在 React 函數中調用 Hook 在 React 的函數組件中調用 Hook 在自定義 Hook 中調用其他 Hook利用 eslint 做 hooks
  • React-hooks入坑指南
    前言如果你是在使用React >= 16.8的版本,那麼你可以使用hooks在編寫你的組件,它可以讓你在不編寫 class 的情況下使用 state 以及其他的 React 特性。由於微信中無法插入非微信域名的超連結,所以文章的超連結無法進行跳轉,可能會影響閱讀體驗。