摘要:前言自推出之后,收到了不少追捧,很多問(wèn)題也隨之而來(lái)。在出現(xiàn)之前,可以使用保存狀態(tài)和更新?tīng)顟B(tài)用以應(yīng)對(duì)這種情況。為了在這個(gè)用例上追趕的腳步,的需要提供副作用隔離功能。提供了一個(gè),可以用它接入你的風(fēng)格的。
前言
React Hooks 自推出之后,收到了不少追捧, 很多問(wèn)題也隨之而來(lái)。
本文就其中的一個(gè)話題展開(kāi)討論:React Hooks 是否會(huì)取代傳統(tǒng)的Redux ?
我認(rèn)為: 不會(huì).
在我看來(lái),相比于傳統(tǒng)的Class Component, Hooks 并沒(méi)有提供什么新的狀態(tài)功能,只不過(guò)是對(duì)原有的 API 做了增強(qiáng)。
相比之前,Hoos 更加簡(jiǎn)潔,也提升了原生 API 的可用性,適用的場(chǎng)景也越來(lái)越多。
為了闡明我的觀點(diǎn), 我們先做一些回顧。
Redux 是什么Redux 是一個(gè) 可預(yù)測(cè)的狀態(tài)管理工具,可以輕松集成在 React 應(yīng)用中。 它有很多優(yōu)點(diǎn), 比如:
單一數(shù)據(jù)源
數(shù)據(jù)共享
事務(wù)狀態(tài)
將數(shù)據(jù)狀態(tài)I/O和副作用相隔離
狀態(tài)回朔, 又稱 時(shí)光機(jī)
一系列輔助工具帶來(lái)的強(qiáng)大調(diào)試能力
總的來(lái)說(shuō), Redux 提供了應(yīng)對(duì)大型應(yīng)用的代碼組織和調(diào)試能力,在程序出錯(cuò)時(shí), 能幫你快速定位問(wèn)題。
Hooks 是什么在下的這邊文章科普了Hooks的一些基礎(chǔ)功能, 感興趣的可以看一下。
全面了解 React 新功能: Suspense 和 Hooks
Hooks 的主要優(yōu)點(diǎn):
可以在函數(shù)式組件中定義數(shù)據(jù)狀態(tài),也能通過(guò)一些Hooks來(lái)模擬生命周期方法。
邏輯復(fù)用;可以把公共邏輯抽象成一個(gè)個(gè)多帶帶的Hook, 從傳統(tǒng)的面向生命周期編程 轉(zhuǎn)變?yōu)槊嫦驑I(yè)務(wù)邏輯編程。
共享公共行為,類似Render Props.
兩家各有所長(zhǎng),好在現(xiàn)在有 react-redux Hooks(https://react-redux.js.org/ne... 和 Reducer Hook (https://reactjs.org/docs/hook... 這樣的工具,我們就沒(méi)有必要糾結(jié)兩者之間如何選擇,雨露均沾, 美滋滋。
Hooks 帶來(lái)了那些變化改變了我們編寫(xiě)組件的方式, 有了更多選擇,你可以拋棄生命周期方法, 擁抱Hooks。
Render Props 這種模式也有了更好的歸宿
Hooks 不能取代哪些技術(shù)Redux
HOC
容器組件和視圖組件之間的隔離, 分離純邏輯和視覺(jué)效果, 更易于測(cè)試。
何時(shí)使用Hooks任何時(shí)候你都可以使用Redux 來(lái)管理狀態(tài),只要你喜歡。
但是如果你的應(yīng)用足夠簡(jiǎn)單,只包含單個(gè)視圖,需要一個(gè)地方臨時(shí)保存狀態(tài),不需要和其他組件共享數(shù)據(jù),或者甚至都沒(méi)有異步I/O都沒(méi)有(有也無(wú)所謂)。 這時(shí)候就到Hooks大顯身手了,這些情景下用Redux, 當(dāng)然也可以,不過(guò)這種做法叫用牛刀殺雞雞。
來(lái)看個(gè)例子:
import React, { useState } from "react"; import t from "prop-types"; import TextField, { Input } from "@material/react-text-field"; const noop = () => {}; const Holder = ({ itemPrice = 175, name = "", email = "", id = "", removeHolder = noop, showRemoveButton = false, }) => { const [nameInput, setName] = useState(name); const [emailInput, setEmail] = useState(email); const setter = set => e => { const { target } = e; const { value } = target; set(value); }; return (); }; export default Holder; {showRemoveButton && ( )} ${itemPrice}
上面的例子 使用 useState 來(lái)跟蹤表單中的 name 和 email:
const [nameInput, setName] = useState(name); const [emailInput, setEmail] = useState(email);
你可能會(huì)注意到還有一個(gè) removeHolder ,這個(gè)action creator 來(lái)自 Redux 。這種模式下,各種方法都可以混合搭配。
在 Hooks 出現(xiàn)之前, 可以使用 local state 保存狀態(tài)和更新?tīng)顟B(tài) 用以應(yīng)對(duì)這種情況。如果是我寫(xiě)這個(gè)的話, 我更傾向于把它塞到Redux中, 再通過(guò)Prop去取狀態(tài)吧。
反正到現(xiàn)在, 我做過(guò)的所有React應(yīng)用, 都用到了Redux,原則也很簡(jiǎn)單:
組件狀態(tài)用組件狀態(tài),應(yīng)用狀態(tài)用 Redux。 各司其職, 相得益彰。
何時(shí)使用Redux另一個(gè)常見(jiàn)的疑問(wèn)是, 我應(yīng)該把所有的數(shù)據(jù)和狀態(tài)都放在Redux嗎? 如果不這么做的話, 是不是就無(wú)法使用時(shí)間旅行?
答案是不會(huì)的。
因?yàn)閼?yīng)用中有很多狀態(tài)是臨時(shí)的,種種局限不足以為日志遙測(cè)或者時(shí)間旅行提供足夠多的信息。 除非你在做的是一個(gè)具有協(xié)同能力的文本編輯器(比如我之前參與的Lark Docs, 還有騰訊文檔等),可以把用戶的每一個(gè)操作,每一個(gè)changeSet 的數(shù)據(jù)都保存起來(lái), 包括光標(biāo)位置等信息。
每次你往Redux 里添加數(shù)據(jù)的時(shí)候, 隨之而來(lái)的是一層抽象和額外的復(fù)雜度。
換言之, 每次你要用Redux的時(shí)候, 要知道自己為啥需要用到它。 如果你的應(yīng)用有如下需求, 那就可以考慮使用Redux:
需要保存或者加載狀態(tài)
跨組件共享狀態(tài)
需要與其他組件共享業(yè)務(wù)邏輯或數(shù)據(jù)處理過(guò)程
還是那個(gè)例子:
訪問(wèn)鏈接: https://tffffday.com/
import React from "react"; import { useDispatch, useSelector } from "react-redux"; import { compose } from "ramda"; import page from "../../hocs/page.js"; import Purchase from "./purchase-component.js"; import { addHolder, removeHolder, getHolders } from "./purchase-reducer.js"; const PurchasePage = () => { // You can use these instead of // mapStateToProps and mapDispatchToProps const dispatch = useDispatch(); const holders = useSelector(getHolders); const props = { // Use function composition to compose action creators // with dispatch. See "Composing Software" for details. addHolder: compose( dispatch, addHolder ), removeHolder: compose( dispatch, removeHolder ), holders, }; return; }; // `page` is a Higher Order Component composed of many // other higher order components using function composition. export default page(PurchasePage);
這個(gè)組件并不處理任何DOM, 是一個(gè)純展示型的組件,并用 React-Redux hooks API 連接到 Redux 上。
之所以用到 Redux,是因?yàn)槠渌糠中枰@個(gè)表單的數(shù)據(jù)。它的狀態(tài)不是本地化到單個(gè)組件中,而是在組件之間共享;
Redux 允許我們干凈地將副作用與其他組件邏輯分離開(kāi)來(lái),不需要我們模擬 I/O 服務(wù)。
相比 redux-thunk,我更喜歡使用 redux-saga 的原因就是后者的隔離功能)。
為了在這個(gè)用例上追趕 Redux 的腳步,React 的 API 需要提供副作用隔離功能。
Redux 是一種架構(gòu)Redux 與狀態(tài)管理庫(kù)有著很大區(qū)別。但本質(zhì)上,也是 Flux 架構(gòu) 的一個(gè)子集。
與庫(kù)相比,Redux 向來(lái)更接近一種架構(gòu)和非強(qiáng)制性的約定(convention)。
事實(shí)上,Redux 的基本實(shí)現(xiàn)只需要幾十行代碼。
這也是 Redux 的一大好處。如果你想多用一些本地組件狀態(tài)和 hook API,不想把所有內(nèi)容都塞到 Redux 里,那也完全沒(méi)問(wèn)題。
React 提供了一個(gè) useReducer hook,可以用它接入你的 Redux 風(fēng)格的 Reducer。這對(duì)不常見(jiàn)的狀態(tài)邏輯、依賴狀態(tài)等內(nèi)容非常有用。
如果你的用例是要將臨時(shí)狀態(tài)裝入單個(gè)組件,也可以使用 Redux 架構(gòu),但要用 useReducer hook 取代 Redux 來(lái)管理狀態(tài)。
如果你后面需要維持或共享這個(gè)狀態(tài), 就需要把它保存到Redux里了。
結(jié)語(yǔ)Hooks 并不會(huì)替代傳統(tǒng)的 Redux, 它的出現(xiàn)為我們編寫(xiě)組件提供了更多的靈活性, 更多的可能, 希望各位FEer 都能及時(shí)擁抱這個(gè)新特性, 找到自己最喜歡的開(kāi)發(fā)姿勢(shì)~
行文粗淺, 若有疏漏, 還請(qǐng)指正。
附原文鏈接: https://medium.com/javascript...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106173.html
摘要:要求通過(guò)要求數(shù)據(jù)變更函數(shù)使用裝飾或放在函數(shù)中,目的就是讓狀態(tài)的變更根據(jù)可預(yù)測(cè)性單向數(shù)據(jù)流。同一份數(shù)據(jù)需要響應(yīng)到多個(gè)視圖,且被多個(gè)視圖進(jìn)行變更需要維護(hù)全局狀態(tài),并在他們變動(dòng)時(shí)響應(yīng)到視圖數(shù)據(jù)流變得復(fù)雜,組件本身已經(jīng)無(wú)法駕馭。今天是 520,這是本系列最后一篇文章,主要涵蓋 React 狀態(tài)管理的相關(guān)方案。 前幾篇文章在掘金首發(fā)基本石沉大海, 沒(méi)什么閱讀量. 可能是文章篇幅太長(zhǎng)了?掘金值太低了? ...
摘要:希望大家在這浮夸的前端圈里,保持冷靜,堅(jiān)持每天花分鐘來(lái)學(xué)習(xí)與思考。 今天的React題沒(méi)有太多的故事…… 半個(gè)月前出了248個(gè)Vue的知識(shí)點(diǎn),受到很多朋友的關(guān)注,都強(qiáng)烈要求再出多些React相前的面試題,受到大家的邀請(qǐng),我又找了20多個(gè)React的使用者,他們給出了328道React的面試題,由我整理好發(fā)給大家,同時(shí)發(fā)布在了前端面試每日3+1的React專題,希望對(duì)大家有所幫助,同時(shí)大...
摘要:第一次了解這項(xiàng)特性的時(shí)候,真的有一種豁然開(kāi)朗,發(fā)現(xiàn)新大陸的感覺(jué)。在絕大多數(shù)情況下,是更好的選擇。唯一例外的就是需要根據(jù)新的來(lái)進(jìn)行操作的場(chǎng)景。會(huì)保證在頁(yè)面渲染前執(zhí)行,也就是說(shuō)頁(yè)面渲染出來(lái)的是最終的效果。上面條規(guī)則都是為了保證調(diào)用順序的穩(wěn)定性。 歡迎關(guān)注我的公眾號(hào)睿Talk,獲取我最新的文章:showImg(https://segmentfault.com/img/bVbmYjo); 一、...
摘要:起飛指南作者元瀟方凳雅集出品目前放出來(lái)了個(gè)內(nèi)置,但僅僅基于以下兩個(gè),就能做很多事情。行代碼實(shí)現(xiàn)一個(gè)全局元瀟根組件掛上即可子組件調(diào)用隨時(shí)隨地實(shí)現(xiàn)一個(gè)局部元瀟的本質(zhì)是的一個(gè)語(yǔ)法糖,感興趣可以閱讀一下的類型定義和實(shí)現(xiàn)。 React Hook起飛指南 作者:元瀟 方凳雅集出品 16.8目前放出來(lái)了10個(gè)內(nèi)置hook,但僅僅基于以下兩個(gè)API,就能做很多事情。所以這篇文章不會(huì)講很多API,...
摘要:首發(fā)自我的博客,歡迎注如要運(yùn)行本文的代碼,請(qǐng)先確認(rèn)自己的版本已支持出來(lái)已經(jīng)有段時(shí)間了,本文不對(duì)的具體用法作介紹,而是使用實(shí)現(xiàn)一個(gè)簡(jiǎn)易的基于的使用實(shí)現(xiàn)初版自帶了供我們使用,它接受兩個(gè)參數(shù),一是函數(shù),二是初始,并返回和函數(shù),如下這個(gè)函數(shù)自己實(shí)現(xiàn) 首發(fā)自我的github博客,歡迎star 注:如要運(yùn)行本文的代碼,請(qǐng)先確認(rèn)自己的react版本已支持hooks react hooks出來(lái)已經(jīng)有段...
閱讀 1655·2019-08-30 15:54
閱讀 2409·2019-08-30 15:52
閱讀 2107·2019-08-29 15:33
閱讀 3064·2019-08-28 17:56
閱讀 3263·2019-08-26 13:54
閱讀 1699·2019-08-26 12:16
閱讀 2474·2019-08-26 11:51
閱讀 1675·2019-08-26 10:26