為什麼不使用乙個全域性變數替代redux?

時間 2021-05-05 13:46:02

1樓:伊撒爾

redux 的重點不在於變數引發更新啊,它的重點是,在 js 層實現了 elm 的模型,使用中介軟體抽象了 effects

全域性變數可以解決 effects 問題嗎,並不能

2樓:笑熬漿糊

你再寫寫react+redux 就會發現,redux就是「全域性變數能夠和react配合的最精簡的方式」(當然最精簡要打引號)

3樓:

可以啊,只要你這個全域性變數是observable的就行

你描述也沒啥問題,乙個mobx全域性單例就解決的事情,沒必要用redux

4樓:winter

乙個全域性變數不夠的,你還得加個函式叫refresh()

當然了,如果你引乙個vue裡面的reactivity包就不需要了。

5樓:

因為乙個全域性變數在被改變之後無法驅動 React 元件重新渲染。

React 的核心價值觀是:狀態決定渲染結果,因此只有狀態改變了才需要重新渲染。如果你用乙個非狀態的全域性變數來儲存狀態,那任何乙個 React 元件都不會因為這個全域性變數的人改變而重新渲染。

在沒有 hook 之前,Redux 通過 HOC 來解決這個問題。Redux 狀態變化會觸發 HOC 裡的屬性變化,因而觸發被 HOC 包裹的原元件重新渲染。在有了 hook 之後,React 觀察 hook 是否觸發狀態變化,Redux 通過 hook 來通知 React 狀態變化。

如果你想要讓你的全域性變數發生變化時能通知 React,那麼你需要把上述 Redux 做的事情再做一遍。如果這個全域性變數內的任何變化都通知每乙個 React 元件重新渲染,那就會造成過度重複渲染。你希望乙個變化只通知關心這個變化的相關元件,你在實現了這個優化之後你就重新發明了 Redux selector。

Redux 確實有很多簡單場景用不到的「設計模式」,例如要有 action 然後還要有 action creator 這種,我把它們稱之為過度設計。把這些砍掉後,你就得到了乙個簡單一些的帶 selector 的狀態極。但這東西也有人寫過了,例如 Undex 和 Recoil,不太值得自己從零寫乙個。

6樓:叢來花間翁

看你想實現什麼樣的功能了,如果你只是想存一些變數,方便某些地方讀取的話,完全可以用乙個全域性變數代替啊,至於很多回答提到的元件更新的問題,也可以在設定變數的同時手動的去觸發元件更新,這樣在很多情況下能減少render的次數。

那麼問題來了,很多地方都要用到這個變數的時候是不是要手動的觸發很多次呢,當專案不斷增大的時候也許你已經無力維護了,很容易產生疏漏。

此外,想要實現手動觸發元件更新,常用的做法是通過props向下傳遞函式,同樣專案增大,這些傳遞就會變得非常混亂。

而且有的時候,變數的變化是不可控(不可預知的),這時候沒有辦法通過手動觸發更新的方式更新元件(俗稱bug)。

上面三點都提到了元件的更新,如果你跟我說你沒有必要,那你不僅不需要redux,而且也不需要react。

如果你不想使用redux,context其實是乙個非常不錯的選擇。

我在寫專案的過程中,為了追求效能,都沒有使用redux,都用context代替了。

7樓:一二

不是工作需求,別深陷這些框架。全域性變數肯定能用,他們框架設計出來是為了解決一些問題的,但是這些功能你不一定需要。。。也別太追這些框架的名氣,什麼求職必備、必會。。

還是腳踏實地學學演算法,計算機原理,甚至放棄前端。。。

8樓:黑公尺糕

其實 redux就是用了乙個全域性變數,但是在此基礎上做了一些規範和封裝,比如它實現了observer,讓你不用手動去watch乙個值的變化,他封裝了getter和setter方法,並且規範化了操作流程,讓你知道什麼時候該用reducer,什麼時候是action,你完全可以自己實現 redux,但是有些路你是繞不過去的 ,後面你會發現,還是開源的框架好用~

9樓:冷葉

React的設計思想之一就是單項資料流,Redux也嚴格遵循了這一原則,在政治上是正確的。它對狀態的更新本質上就是通過共享變數的作用域提公升來實現的,可以理解為這其實就是乙個全域性變數,只不過是在React Tree層級的全域性。

如果我們想要在document層級做全域性變數來替代Redux,這當然也可以實現的,把這個rootState變成Observable,每次資料變化後forceupdate react元件即可。

技術實現上沒有什麼對錯,只不過乙個框架能夠成為標準有很多因素的影響。它的設計合理性、政治正確性、時效性、背後的推手等等。

實在想換的話,推薦乙個小巧精悍的狀態管理庫,它使用react-hooks原生實現,自動連線module組織架構,如果你對React16很熟悉的話,基本上是零成本入手。

10樓:悠閒的水

全域性變數不好把更新推送給元件,題主這麼有個性的想法,可以試試Mobx,參考我在另乙個問題裡的回答:Mobx真的好用嗎?它有什麼優缺點?主要適用於什麼場景?

11樓:Angry Bugs

redux 首先是乙個訊息佇列,然後才是乙個狀態儲存。如果只用乙個全域性變數的話,元件之間怎麼通訊?加上observe那不就是把redux重新發明了一遍麼……

12樓:by wang

第一點我要說的是,redux並不繁瑣複雜,相比目前其他的狀態管理方案來說,redux是最簡單的。

為什麼不用乙個全域性變數替代redux?任何乙個工程化的方案,都可以替代redux,當你把乙個全域性變數變成工程化方案時,並且大家都能夠接受時,那麼它肯定比用redux麻煩的多的多。

第二點我要說的是,我個人還是不太喜歡redux的,當濫用的時候會帶來非常多的問題,因為是個全域性儲存,很難去精確的控制生命週期和邊界,相比一些基於redux的新專案我覺得很不錯的,比如rematch。

13樓:waterwu

全域性變數本質上就是乙個單例模式,redux 只是在單例模式基礎上加了訂閱機制、採用 reducer 約束修改,以及加上 middleware 機制保證擴充套件性。

如果自己實現乙個,也會需要做這些事情。

14樓:make老師

這個問題問得就有問題了。

首先你得清楚redux產生的原因:

redux的主要優勢之一是它可以幫你處理應用的共享狀態。如果兩個元件需要訪問同一狀態,該怎麼辦?這種兩個元件同時需要訪問同一狀態的現象稱為「共享狀態」。

你可以將該狀態提公升到附近的父元件,但是如果該父元件在元件樹中向上好幾個元件的位置,那麼將狀態當做屬性向下乙個乙個地傳遞,這項工作很快就會變得乏味。此外,在該父元件和該子元件之間的元件甚至根本不需要訪問該狀態!

在構建網路應用時,Redux不僅使我們能夠以有條理的方式儲存資料,而且使我們能夠在應用的任何位置快速獲取該資料。只需告訴Redux到底哪個元件需要哪個資料,它就會為你處理後續一切工作!

借助Redux,你可以控制狀態改變的時間、原因和方式。

你單一的全域性變數能解決這些問題嗎,很明顯,這是不滿足的。

15樓:秋無衣

現在comp1元件已經展示了資料data1,在comp2元件更新了data1,我怎麼在comp1實時的獲取data1的更新?

為什麼全域性變數和區域性變數的答案會不一樣,用C Free執行?

Xinyu Tan 我沒仔細看程式因為我覺得你的程式的行為是不可預期的。原因在於 char a 1003 沒有初始化。裡面的內容是隨機的。當你用strlen a 去計算字串 a的長度時計算結果是根據陣列a裡第乙個0值的位置決定的。由於陣列a裡的內容隨機所以 int c strlen a 中 c的值是...

同樣都是未定義就使用乙個變數,為什麼會有這樣迥異的結果呢?

03c84f62d 這是python的不足之處,當本方法塊有語句對乙個變數賦值時改變量自動變為區域性變數 也就是說當程式執行a a 1時,會先計算a 1。由於在這個方法裡對a進行了賦值操作 就是本條指令賦的值 a被認為是區域性變數,py核心試圖從該方法域獲取a的值,但是明顯此時a並沒有被賦值,於是程...

Java的乙個類裡面的成員變數為什麼可以是本類?

交流電尼斯 因為你看到的變數不是變數自身,而是乙個指標。你以為你在類宣告裡寫了乙個自己開始套娃,但其實你只是放了乙個指標,這個指標指向另乙個例項。 烟花的盡頭 估計是學C 的吧。class A 這個寫法C 是不支援的class A 這個就支援了。參考為什麼 C 中乙個類的成員型別不能是該類本身,而 ...