Redux學習筆記-----基礎部分

来源:https://www.cnblogs.com/wanrenfeiyu/archive/2018/07/11/9286265.html
-Advertisement-
Play Games

Action Action是store數據的唯一來源。需使用store.dispatch()將所需的action傳到store。Action是把伺服器響應的數據或者用戶輸入的數據、和其他一些非View的數據傳入store的有效載荷。Action實際上是JS的普通對象。示例: 需要註意的是:應該儘可能 ...


Action

Action是store數據的唯一來源。需使用store.dispatch()將所需的action傳到store。Action是把伺服器響應的數據或者用戶輸入的數據、和其他一些非View的數據傳入store的有效載荷。Action實際上是JS的普通對象。示例:

{
   type:"ADD_TODO", //type為必須的欄位,值為字元串或存放字元串的變數
   text:"我是示例"      
}

  

需要註意的是:應該儘可能的減少在action中傳遞的數據。

Action創建函數

Action創建函數只是簡單的返回一個action。示例:

function addTodo(text) {
  return {
    type: ADD_TODO,
    text
  }
}

  

Redux提供的bindActionCreators()可以自動把多個action創建函數綁定到dispatch()方法上。

Reducer

Reducers 指定了應用狀態的變化如何響應 actions 併發送到 store 的,記住 actions 只是描述了有事情發生了這一事實,並沒有描述應用如何更新 state。

reducer 就是一個純函數,接收舊的 state 和 action,返回新的 state。

(previousState, action) => newState

  

永遠不要在reducer里做這些操作:

  • 修改傳入參數;
  • 執行有副作用的操作,如API請求和路由跳轉;
  • 調用非純函數,如Data.now()或Math.random();

reducer一定要保持純凈。只要傳入參數相同,返回計算得到的下一個state就一定相同。沒有特殊情況、沒有副作用、沒有API請求、沒有變數修改,單純執行計算

combinerReducers()方法只是生成一個函數,這個函數用來調用你的一系列reducer,每個reducer根據他們的key來篩選出state中的一部分數據並處理,然後這個生成的函數再將所有reducer的結果合成一個大的對象。
//ES6的寫法
import { combineReducers } from 'redux'
import * as reducers from './reducers'

const todoApp = combineReducers(reducers)

 Store

Store的職責:

  • 維持應用的state;
  • 提供 getState() 方法來獲取state;
  • 提供 dispatch(action) 方法更新state;
  • 通過 subscribe(listener) 註冊監聽器;
  • 通過 subscribe(listener) 返回的函數註銷監聽器;

Redux 應用只有一個單一的 store

store的使用示例:

//創建store
let store = createStore(todoApp);
//列印初始狀態
console.log("初始狀態======》",store.getState());

//每次state更新時,列印日誌
//註意subscribe()返回一個函數用來註銷監聽器
const unsubscribe = store.subscribe(()=>console.log("state有更新=======》",store.getState()))

//發起一系列action
store.dispatch(addTodo("learn about actions"));
store.dispatch(addTodo("learn about reducers"));
store.dispatch(addTodo("learn about store"));
store.dispatch(toggleTdo(0));
store.dispatch(toggleTdo(1));
store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED));

//停止監聽
unsubscribe();

數據流

Redux應用中數據的生命周期遵循4個步驟:

  1. 調用  store.dispatch(action) 。 action 就是一個描述“發生了什麼”的普遍對象,可將其理解為通過 store.dispatch 來告訴reducer發生了什麼
  2. Redux store調用傳入的reducer函數。根據傳入的action.type來更新state
  3. 根reducer應該把多個子reducer輸出合併成一個單一的state樹。可使用原生的 combineReducers() 輔助函數,也可自己實現
  4. Redux store保存了根reducer返回的完整的state樹

 React-Redux

connect():生成容器組件;

mapStateToProps():指定如何把當前Redux Store state映射到展示組件的props中。示例:

//VisibleTodoList 需要計算傳到 TodoList 中的 todos,
//所以定義了根據 state.visibilityFilter 來過濾 state.todos 的方法,併在 mapStateToProps 中使用 const getVisibleTodos = (todos, filter) => { switch (filter) { case 'SHOW_COMPLETED': return todos.filter(t => t.completed) case 'SHOW_ACTIVE': return todos.filter(t => !t.completed) case 'SHOW_ALL': default: return todos } } const mapStateToProps = state => { return { todos: getVisibleTodos(state.todos, state.visibilityFilter) } }

  

mapDispatchToProps():接受dispatch()方法並返回期望註入到展示組件的props中的回調方法。示例:

//VisibleTodoList 向 TodoList 組件中註入一個叫 onTodoClick 的 props ,
//並且onTodoClick 能分發 TOGGLE_TODO 這個 action
const mapDispatchToProps = dispatch => { return { onTodoClick: id => { dispatch(toggleTodo(id)) } } }

 

 

 Redux的整體流程:

  1. 將action傳入dispatch()來觸發reducer
  2. reducer響應action,並根據action.type來處理舊的state數據,然後返回新的state數據,將新的state數據發送到store
  3. store保存reducer返回的新的state,然後所有訂閱  store.subscribe(listener)  的監聽器都將被調用,以此來創建容器組件.(在react-redux中我們使用connect()方法來生成,所以不用手寫 store.subscribe()  來生成容器組件)

 

 

 

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從開源網站下載的源碼,需要自己編譯c源碼成so類庫。當時用Android studio 運行總是報錯”finished with non-zero exit value 2"報錯定位到build.gradle文件里負責編譯 task ndkBuild(type: Exec, description:... ...
  • 隨著視頻行業的發展,很多用戶對於觀看體驗也有了更高的要求,以前的習慣是下載好了在觀看,而現在是希望1分鐘都不要等,ZUI好一邊看著一邊下載,等把這個視頻看完也下載完了,也就是我們常說的“視頻邊下載邊播放”,之前分享過在安卓手機下利用BT實現視頻的邊下在邊播放問題,那麼在IOS下視頻邊下載邊播放是否可 ...
  • 這個問題也是我在android開發群裡面解決的一個問題。 如果有什麼想法或者想法可以在下麵進行評論,我們可以一起交流一下! 我們在eclipse中開發完一個程式之後,需要將其打包為APK的安裝包,我們需要進行以下操作: 但是進行打包的時候出現了以下的錯誤: 我也是找了一些方法進行解決,找到了一個有效 ...
  • 第一次寫博客,有什麼問題或者想法的希望各位可以進行評論交流,望大家多多包涵! 遇到的問題是在新建的項目都出錯了,出現support_v7下麵出現紅線及解決方法及為什麼eclipse中項目繼承ActionBarActivity: 主要是在前面開發的時候遇到了這個問題,昨天有一個android群裡面的人 ...
  • 本文翻譯自CodeProject文章:https://www.codeproject.com/Articles/1223980/Xamarin-Notes-Set-up-the-environment-Windows-and-I 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案 ...
  • 字元串對象方法 search方法 String.prototype.search(reg) search方法用於檢索字元串中指定的子字元串,或檢索與正則表達式相匹配的子字元串,方法返回第一個匹配結果的index,查找不到則返回 。 tips: 1.search方法不執行全局匹配,它將忽略標誌g,並且 ...
  • 1.css3簡介 CSS3是CSS(層疊樣式表)技術的升級版本,於1999年開始制訂,2001年5月23日W3C完成了CSS3的工作草案,主要包括盒子模型、列表模塊、超鏈接方式、語言模塊、背景和邊框、文字特效、多欄佈局等模塊。 2.css3背景 <css3>概覽有幾個很棒的背景屬性,它們提供了對背景 ...
  • Q:瀏覽器頁面有哪三層構成,分別是什麼,作用是什麼? A:由三部分構成: 網頁結構層(Structural Layer)——由(X)HTML等標記語言負責創建,實現頁面結構。 網頁表示層(Presentation Layer)——由CSS完成頁面的風格。 網頁行為層(Behavior Layer)— ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...