搜尋
首頁web前端js教程react、redux、react-redux使用案例對比詳解

這次帶給大家react、redux、react-redux使用案例對比詳解,react、redux、react-redux使用的注意事項有哪些,以下就是實戰案例,一起來看一下。

React

一些小型項目,只使用 React 完全夠用了,資料管理使用props、state即可,那什麼時候需要引入Redux呢?當渲染一個元件的資料是透過props從父元件中取得時,通常情況下是A --> B,但隨著業務複雜度的增加,有可能是這樣的:A --> B -- > C --> D --> E,E需要的資料需要從A那裡透過props傳遞過來,以及對應的E --> A逆向傳遞callback。組件BCD是不需要這些資料的,但是又必須經由它們來傳遞,這確實有點不爽,而且傳遞的props以及callback對BCD組件的複用也會造成影響。或是兄弟組件之間想要分享某些數據,也不是很方便傳遞、取得等。諸如此類的情況,就有必要引進Redux了。

其實A --> B --> C --> D --> E 這種情況,React不使用props層層傳遞也是能拿到資料的,使用Context即可。後面要講到的react-redux就是透過Context讓各個子元件拿到store裡的資料的。

Redux

其實我們只是想找個地方存放一些共享資料而已,大家都可以取得到,也都可以進行修改,僅此而已。那放在一個全部變數裡面行不行?行,當然行,但是太不優雅,也不安全,因為是全域變數嘛,誰都能存取、誰都能修改,有可能一不小心被哪個小夥伴覆蓋了也說不定。那全域變數不行就用私有變數唄,私有變數、無法輕易修改,是不是立刻就想到閉包了...

現在要寫這樣一個函數,其滿足:

  1. 存放一個資料物件

  2. 外界能存取這個資料

  3. 外界也能修改這個資料

  4. 當資料有變化的時候,通知訂閱者

function createStore(reducer, initialState) {
 // currentState就是那个数据
 let currentState = initialState;
 let listener = () => {};
 function getState() {
 return currentState;
 }
 function dispatch(action) {
 currentState = reducer(currentState, action); // 更新数据
 listener(); // 执行订阅函数
 return action;
 }
 function subscribe(newListener) {
 listener = newListener;
 // 取消订阅函数
 return function unsubscribe() {
  listener = () => {};
 };
 }
 return {
 getState,
 dispatch,
 subscribe
 };
}
const store = createStore(reducer);
store.getState(); // 获取数据
store.dispatch({type: 'ADD_TODO'}); // 更新数据
store.subscribe(() => {/* update UI */}); // 注册订阅函数

更新資料執行的步驟:

  1. What:想做什麼--- dispatch(action)

  2. How:怎麼幹,幹的結果--- reducer(oldState, action) => newState

  3. Then?:重新執行訂閱函數(例如重新渲染UI等)

這樣就實作了一個store,提供資料儲存中心,可以供外部存取、修改等,這就是Redux的主要想法。所以,Redux確實和React沒有什麼本質關係,Redux可以結合其他函式庫正常使用。只不過Redux這種資料管理方式,跟React的資料驅動視圖概念很合拍,它兩個結合在一起,開發非常便利。

現在既然有了一個安全的地方可以存取數據,要怎麼結合到React裡面呢?我們可以在應用初始化的時候,創建一個window.store = createStore(reducer),然後在需要的地方通過store.getState()去獲取數據,通過store.dispatch去更新數據,通過store.subscribe去訂閱數據變化然後進行setState...如果很多地方都這樣做一遍,實在是不堪其重,而且,還是沒有避免掉全域變數的不優雅。

React-Redux

由於全域變數有諸多的缺點,那就換個思路,把store直接整合到React應用的頂層props裡面,只要各個子元件能存取到頂層props就行了,像這樣:

<topwrapcomponent>
 <app></app>
</topwrapcomponent>,

React剛好提供了這麼一個鉤子,Context,用法很簡單,看一下官方demo就明了。現在各個子元件已經能夠輕易存取到store了,接下來就是子元件把store裡用到的資料取出、修改、以及訂閱更新UI等。每個子組件都需要這樣做一遍,顯然,肯定有更方便的方法:高階組件。透過高階元件把store.getState()、store.dispatch、store.subscribe封裝起來,子元件對store就無感知了,子元件正常使用props取得資料以及正常使用callback觸發回調,相當於沒有store存在一樣。

下面是這個高階元件的大致實作:

function connect(mapStateToProps, mapDispatchToProps) {
 return function(WrappedComponent) {
 class Connect extends React.Component {
  componentDidMount() {
  // 组件加载完成后订阅store变化,如果store有变化则更新UI
  this.unsubscribe = this.context.store.subscribe(this.handleStoreChange.bind(this));
  }
  componentWillUnmount() {
  // 组件销毁后,取消订阅事件
  this.unsubscribe();
  }
  handleStoreChange() {
  // 更新UI
  this.forceUpdate();
  }
  render() {
  return (
   <wrappedcomponent></wrappedcomponent>
  );
  }
 }
 Connect.contextTypes = {
  store: PropTypes.object
 };
 return Connect;
 };
}

使用connect的時候,我們知道要寫一些樣板化的程式碼,例如mapStateToProps、mapDispatchToProps這兩個函數:

const mapStateToProps = state => {
 return {
 count: state.count
 };
};
const mapDispatchToProps = dispatch => {
 return {
 dispatch
 };
};
export default connect(mapStateToProps, mapDispatchToProps)(Child);
// 上述代码执行之后,可以看到connect函数里面的
 <wrappedcomponent></wrappedcomponent>
// 就变成了
 <wrappedcomponent></wrappedcomponent>
// 这样,子组件Child的props里面就多了count和dispatch两个属性
// count可以用来渲染UI,dispatch可以用来触发回调

So,这样就OK了?OK了。 通过一个闭包生成一个数据中心store,然后把这个store绑定到React的顶层props里面,子组件通过HOC建立与顶层props.store的联系,进而获取数据、修改数据、更新UI。 这里主要讲了一下三者怎么窜在一起的,如果想了解更高级的功能,比如redux中间件、reducer拆分、connect的其他参数等,可以去看一下对应的源码。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

antd下拉框联动使用步骤详解

如何使用JS实现合并多个数组去重算

以上是react、redux、react-redux使用案例對比詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

如何安裝JavaScript?如何安裝JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

在Quartz中如何在任務開始前發送通知?在Quartz中如何在任務開始前發送通知?Apr 04, 2025 pm 09:24 PM

如何在Quartz中提前發送任務通知在使用Quartz定時器進行任務調度時,任務的執行時間是由cron表達式設定的。現�...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能