日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Redux中的重要概念

發布時間:2025/1/21 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redux中的重要概念 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Action/Reducer/Store

首先,先看看第一張圖,圖中展示了Redux的單向數據流,以及Action、Reducer和Store這三個核心概念。

下面就圍繞上圖,非別介紹Action、Reducer和Store這三個概念。

Action和Action Creator

Action是一個對象,用來代表所有會引起狀態(state)變化的行為(例如服務端的響應,頁面上的用戶操作)。

假如我們要實現一個任務管理系統,那么添加任務的Action對象就會是下面的形式:

{type: 'ADD_TASK',name: 'Read ES6 spec',category: 'Reading' }

Action對象是行為的描述,一般都會包含下面的信息:

  • 一個字符串類型的type字段來表示將要執行的動作
  • 需要傳遞給應用的其他數據信息(例子中的name和category),數據形式用戶可以自定義

Action通過Action創建函數(Action Creator)來創建,Action Creator是一個函數,最終返回一個Action對象。

對于添加任務這個行為,對應的Action Creator如下:

function addTask(name, category) {return {type: ADD_TASK,name,category}; }

Reducer

Action對象僅僅是描述了行為的相關信息,至于如何通過特定的行為來更新state,就需要看看Reducer了。

關于Reducer,最簡單的描述就是:

  • Reducer是一個函數
  • 該函數接收兩個參數,一個舊的狀態previousState和一個Action對象
  • 返回一個新的狀態newState

根據上面的描述,Reducer函數就可以表示為:

(previousState, action) => newState

Reducer函數的形式通常如下:

function reducer(state = [], action) {// 處理不同action的代碼switch (action.type) {case SPECIAL_ACTION:// 根據SPECIAL_ACTION action更新state// 返回新的statedefault:return state} }

Store

Actions描述了"what happened"的事實,Reducers則根據這些actions來更新state,而Store則是Actions和Reducers連接在一起的對象。

Store是Redux中數據的統一存儲,維護著state的所有內容,所以Store的主要功能就是:

  • 維護應用的state內容
  • 提供getState()方法獲取 state
  • 提供dispatch(action)方法更新 state
  • 提供subscribe(listener)方法注冊監聽器

看到Store提供的方法,就可以把Action、Reducer和Store聯系在一起了:

  • Store通過dispatch(action)方法來接收不同的Action
  • 根據Action對象的type和數據信息,Store對象可以通過Reducer函數來更新state的內容
  • ?

    Middleware

    下面就來看看第二張圖,跟第一張圖的差別不大,只是增加了中間件(Middleware)來處理Action。

    在Redux中,Middlerwares主要的作用就是處理Action,Redux中的Action必須是一個plain object。但是為了實現異步的Action或其他功能,這個Action可能就是一個函數,或者是一個promise對象。這是就需要中間件幫助來處理這種特殊的Action了。

    也就是說,Redux中的Middleware會對特定類型action做一定的轉換,所以最后傳給reducer的action一定是標準的plain object。

    針對Action的特征,Reudx Middleware可以采取不同的操作:

    • 可以選擇傳遞給下一個中間件,如:next(action)
    • 可以選擇跳過某些中間件,如:dispatch(action)
    • 或者更直接了當的結束傳遞,如:return。

    Redux中常用的中間件:

    • redux-thunk:action可以是一個函數,用來發起異步請求。
    • redux-promise:action可以是一個promise對象,用來更優雅的進行異步操作。
    • redux-logger:action就是一個標準的plain object,用來記錄action和nextState的。

    ?

    react-redux

    經過前面的介紹,我們已經看到了Redux中的一些核心概念。Redux跟React沒有直接的關系,本身可以支持React、Angular、Ember等等框架。

    通過react-redux這個庫,可以方便的將react和redux結合起來:react負責頁面展現,redux負責維護/更新數據狀態。

    到這里,第三張圖就展示了react-redux這個庫的工作原理,react和redux是怎么聯系到一起的。

    react-redux中提供了兩個重要功能模塊Provider和connect,這兩個模塊保證了react和redux之間的通信,下面就分別看看這兩個模塊。

    Provider

    通過Provider的代碼可以看到,Provide本質上是一個react組件。

    export default class Provider extends Component {getChildContext() {return { store: this.store }}constructor(props, context) {super(props, context)this.store = props.store}render() {const { children } = this.propsreturn Children.only(children)} }

    Provider組件主要用到了react通過context屬性,可以將屬性(props)直接給子孫component,無須通過props層層傳遞,從而減少組件的依賴關系。

    connect

    connect方法的主要作用就是讓Component與Store進行關聯, Store的數據變化可以及時通知Views重新渲染。

    任何一個通過connect()函數處理過的組件都可以得到一個dispatch方法作為組件的props,以及得到全局state中的所有內容。

    通過源碼]可以看到,connect函數運行后,會返回一個wrapWithConnect函數,該函數可以接收一個react組件,然后返回一個經過處理的Connect組件。

    return function wrapWithConnect(WrappedComponent) {class Connect extends Component {constructor(props, context) {// 從祖先Component處獲得storethis.store = props.store || context.storethis.stateProps = computeStateProps(this.store, props)this.dispatchProps = computeDispatchProps(this.store, props)this.state = { storeState: null }// 對stateProps、dispatchProps、parentProps進行合并this.updateState()}shouldComponentUpdate(nextProps, nextState) {// 進行判斷,當數據發生改變時,Component重新渲染if (propsChanged || mapStateProducedChange || dispatchPropsChanged) {this.updateState(nextProps)return true}}componentDidMount() {// 改變Component的statethis.store.subscribe(() = {this.setState({storeState: this.store.getState()})})}render() {// 生成包裹組件Connectreturn (<WrappedComponent {...this.nextState} />)}}Connect.contextTypes = {store: storeShape}return Connect; }

    ?

    詳細內容和demo

    文中很多Redux的概念都是進行了簡單的介紹,更多詳細的介紹可以參考,GitHub地址:WilberTian/StepByStep-Redux

    • 01.Action.md
    • 02.Reducer.md
    • 03.Store.md
    • 04.Redux-data-flow.md
    • 05.Middleware (part 1).md
    • 05.Middleware (part 2).md
    • 06.react-redux.md

    每篇文章的結尾都會有一些簡單的demo 代碼,幫助理解文章中介紹的內容。

    ?

    總結

    文中結合三張圖片介紹了Redux中的一些核心概念,以及React和Redux之間通過react-redux這個庫進行交互。

    更多詳細的內容,已經整理到了GitHub上了(WilberTian/StepByStep-Redux),通過這些介紹以及demo的運行結果,一定能對Redux有一個比較基本的認識。

    轉載于:https://www.cnblogs.com/axl234/p/5729072.html

    總結

    以上是生活随笔為你收集整理的Redux中的重要概念的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久热欧美 | 欧美黄色一级大片 | 影音先锋每日资源 | 草草视频在线观看 | 91大神网址| 欧美成人精品一区二区综合免费 | 久久一本综合 | 久久99免费| 亚洲六月婷婷 | 亚洲性生活网站 | 国产91精品ai换脸 | 中国特级毛片 | 欧美精品久久99 | 90岁肥老奶奶毛毛外套 | 欧美影院一区二区 | 人人免费操 | 欧美成人三级在线播放 | 一本大道综合伊人精品热热 | 国产精品1区2区3区4区 | 97精品人妻一区二区三区 | 日本va在线观看 | 亚洲国产成人av | 久色视频在线 | 国产精品久久777777毛茸茸 | 亚洲va欧美 | 久久久久久久久久久久97 | 自拍超碰 | 欧美韩一区二区 | 欧美精品毛片 | 中国老熟女重囗味hdxx | 日韩av不卡电影 | 男女av免费 | 免费网站在线观看人数在哪动漫 | 日本人の夫妇交换 | 古代黄色片 | 一道本无吗一区 | 日韩av导航 | 俺去草| 精品人妻一区二区三区含羞草 | 7m精品福利视频导航 | 亚洲无线视频 | 人人爽人人香蕉 | 制服丝袜第一页在线观看 | 亚洲国产第一区 | 金鱼妻日剧免费观看完整版全集 | 国产成人精品一区二三区四区五区 | 久久久久亚洲色欲AV无码网站 | 成人精品| 日本捏奶吃奶的视频 | 91香蕉视频黄 | caopeng视频 | 国产精品成人99一区无码 | 国产麻豆免费视频 | av免费观看网站 | 麻豆一区二区在线 | 五月综合久久 | 精东影业一区二区三区 | 不卡av网站 | 日本免费电影一区二区三区 | 免费观看av毛片 | 久久久久久影视 | 国产精品亚洲色图 | 肌肉猛男裸体gay网站免费 | 别揉我奶头啊嗯一区二区 | 国产精品亚洲二区 | 黄色成人一级片 | 重囗另类bbwseⅹhd | 国产精品国产三级国产aⅴ 欧美bbbbbbbbbbbb18av | 爱爱福利社 | 久久久人人爽 | 日本一区二区免费看 | 国产剧情在线观看 | 看黄色小视频 | 亚洲欧美另类视频 | 成人高清视频在线观看 | 欧美一区二区三区视频在线 | 国产啪视频 | 男人天堂视频在线观看 | 亚洲视频四区 | 日本午夜精品理论片a级app发布 | 久久精品国产av一区二区三区 | 国产福利资源 | 丁香啪啪综合成人亚洲 | 国产在线自 | 久久精品美女视频 | 午夜色网 | www麻豆| jizz18欧美18 | 久国产 | 天天操综合网 | 婷婷色伊人 | 在线观看免费视频 | 日韩电影一区二区 | 亚洲欧美一二三 | 亚洲一区二区 | 欧美视频二区 | 中文字幕免费一区 | 美女视频一区二区三区 | 啪啪av|