成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

實(shí)例講解Redux

roland_reed / 1208人閱讀

摘要:實(shí)例講解示例代碼地址在這里你可以通過命令到本地,也可以直接下載。之后便可以通過執(zhí)行示例代碼。下面結(jié)合實(shí)例中的內(nèi)容理解上述概念。更改應(yīng)用的狀態(tài)通過方法將發(fā)送到函數(shù)中,進(jìn)行狀態(tài)的更新。分別用來處理頁面和頁面狀態(tài)的更新。

實(shí)例講解Redux

示例代碼地址在這里 ,你可以通過git clone命令clone到本地,也可以直接下載。

然后通過執(zhí)行npm install 安裝所依賴的模塊 。之后便可以通過node 執(zhí)行示例代碼。

什么是Redux

隨著 JavaScript 單頁應(yīng)用開發(fā)日趨復(fù)雜,JavaScript 需要管理比任何時(shí)候都要多的 state (狀態(tài))。 這些 state 可能包括服務(wù)器響應(yīng)、緩存數(shù)據(jù)、本地生成尚未持久化到服務(wù)器的數(shù)據(jù),也包括 UI 狀態(tài),如激活的路由,被選中的標(biāo)簽,是否顯示加載動(dòng)效或者分頁器等等。

簡(jiǎn)單來說Redux就是javaScript 的狀態(tài)管理器。同時(shí),Redux支持React、Angular、Ember、jQuery等。

到這里你可能并不知道該如何使用Redux,別著急,在了解如何使用之前,需要先理解相關(guān)的基本概念。示例代碼可查看demo1/app.js

State

在一個(gè)可以進(jìn)行用戶交互的界面上,當(dāng)我們觸發(fā)了交互事件的時(shí)候,界面也會(huì)跟著進(jìn)行更新。例如在一個(gè)app中的下拉刷新,當(dāng)我們進(jìn)行下拉刷新這個(gè)動(dòng)作時(shí),會(huì)去請(qǐng)求服務(wù)器數(shù)據(jù),當(dāng)返回結(jié)果時(shí)app的頁面會(huì)更新。界面的改變我們就可以看做是狀態(tài)的變化。而狀態(tài)的變化是由于我們進(jìn)行了某個(gè)動(dòng)作。在Redux中,尤其需要注意的是State是只讀的,且狀態(tài)的變化只能通過Reducer函數(shù)進(jìn)行轉(zhuǎn)換,

Action

Action就是你與界面進(jìn)行交互的行為。它是一個(gè)對(duì)象且必須要包含一個(gè)type屬性,用來描述你要做的是什么事。

Store

Store就是應(yīng)用狀態(tài)的容器。用來維護(hù)應(yīng)用的state、獲取state、更新state、監(jiān)聽state變化等。這里需要注意的是整個(gè)應(yīng)用只有一個(gè)Store

Reducer

一個(gè)純函數(shù),接收當(dāng)前的state和一個(gè)action參數(shù),根據(jù)當(dāng)前的行為,即actiontype屬性返回一個(gè)新的state。狀態(tài)的更新只能通過這個(gè)函數(shù)。

Talk is cheap, Show me the code!

可能看了上述內(nèi)容你仍然不知道什么是Redux,Redux能干什么。下面結(jié)合實(shí)例demo1/app.js中的內(nèi)容理解上述概念。

1.引入相關(guān)模塊(這里沒有使用ES6的方式是為了能使用node命令直接查看結(jié)果,node命令無法識(shí)別import。當(dāng)然你也可以通過配置babel的方式使用import語法)

var { createStore } = require("redux");
//import { createStore } from "redux" //es6方式引入

2.定義Reducer,來進(jìn)行狀態(tài)的更新

var defaultState = "JavaScript"
function programLanguage(state = defaultState, action) {
    switch (action.type) {
        case "IOS":
            return action.language;
        case "WEB":
            return action.language;
        case "SNACK":
            return action.language;
        default:
            return state;
    }
}

從上述代碼可以看到,我們定義了一個(gè)programLanguage方法,其實(shí)這就是一個(gè)Reducer,它接受了當(dāng)前stateaction參數(shù)。用來更新state。

3.創(chuàng)建store。

let store = createStore(programLanguage);

再次強(qiáng)調(diào)整個(gè)應(yīng)用中只能有一個(gè)store,即createStore函數(shù)只能被調(diào)用一次。

createStore的定義如下:

function createStore(reducer, preloadedState, enhancer);

可以看到的是createStore接受三個(gè)參數(shù)

reducer:就是上述的reducer函數(shù),這里不再贅述

preloadedState: 初始state

enhancer:組合store creator的高級(jí)函數(shù),返回一個(gè)新的強(qiáng)化過的store creator。

4.更改應(yīng)用的狀態(tài)

store.dispatch({ type: "default" });
store.dispatch({ language: "Swift", type: "IOS" });
store.dispatch({ language: "Ruby", type: "WEB" });
store.dispatch({ language: "Python", type: "SNACK" });

通過dispatch方法將action發(fā)送到reducer函數(shù)中,進(jìn)行狀態(tài)的更新。

執(zhí)行node demo1/app.js 的打印結(jié)果如下

JavaScript
JavaScript Swift
JavaScript Swift Ruby
JavaScript Swift Ruby Python

當(dāng)執(zhí)行第一句代碼store.dispatch({ type: "default" });時(shí) 返回的是JavaScript。是由于dispatch方法內(nèi)部會(huì)調(diào)用在createStore中注冊(cè)的Reducer函數(shù),即programLanguage函數(shù)。由programLanguage的內(nèi)部邏輯return的是一個(gè)defaultState。此時(shí)整個(gè)應(yīng)用的狀態(tài)為JavaScript

當(dāng)執(zhí)行第二句代碼store.dispatch({ language: "Swift", type: "IOS" });時(shí) 返回了JavaScript Swift。是由于typeIOS,programLanguage返回的是state + " " +action.language; 因?yàn)樯弦痪浯a將應(yīng)用的狀態(tài)變?yōu)榱?b>JavaScript,所以結(jié)果自然就是JavaScript Swift。同時(shí)整個(gè)應(yīng)用的狀態(tài)也會(huì)變成JavaScript Swift。

同理,第三句和第四句代碼也是如此。

5.訂閱狀態(tài)的更新

store.subscribe(() =>
    console.log(store.getState())
);

為了方便查看狀態(tài)的變化。這里調(diào)用了subscribe方法,每當(dāng)狀態(tài)發(fā)生變化時(shí)都會(huì)調(diào)用其回調(diào)函數(shù)。

store.getState() 獲取應(yīng)用的當(dāng)前狀態(tài)。

優(yōu)化操作 Action creator

隨著頁面的增加,Action必然也會(huì)越來越多,如果Action內(nèi)部所攜帶的消息也很多。此時(shí)如果需要狀態(tài)的更新,就需要寫復(fù)雜的Action,造成代碼可讀性差,文件臃腫。所以我們可以使用Action creator來構(gòu)造Action。當(dāng)需要進(jìn)行狀態(tài)更新就傳入相應(yīng)的數(shù)據(jù)到Action creator中生成Action并返回。

demo2

我們創(chuàng)建了一個(gè)HomeAction的文件專門用來存放Action Creator。在此文件中我們創(chuàng)建了三個(gè)Action creator,分別是action_iosaction_web、action_snack,并將創(chuàng)建Action的任務(wù)交給這三個(gè)函數(shù)。

與此同時(shí)在我們demo2/app.js中需要dispatch一個(gè)action的時(shí)候。只需要從Action creator中取出Action就行了。并不需要我們手動(dòng)的去創(chuàng)建,如此一來便大大增加代碼的可讀性,可維護(hù)性。

分散Reducer

同樣的隨著業(yè)務(wù)量的增加,Reducer必定也會(huì)越來越大。所以我們可以按模塊的不同來拆分Reducer。將一個(gè)大的Reducer拆分成幾個(gè)小的reducer

demo3reducer文件夾中,我們按照模塊的不同的拆分homeReducerprofileReducer。分別用來處理home頁面和profile頁面狀態(tài)的更新。

那么問題來了,這么拆分如何使用createStore去創(chuàng)建store呢,畢竟createStore只能傳一個(gè)Reducer參數(shù)。而且createStore只能調(diào)用一次。

別著急,在redux中提供了一個(gè)combineReducers的方法,用來組合我們的Reducer。

const mainReducer = combineReducers({
    homeReducer,
    profileReducer
})
let store = createStore(mainReducer);
最后

謝謝閱讀,如果感覺本文對(duì)你有用,那將是我的榮幸。如果有寫的錯(cuò)誤的地方也請(qǐng)留言指正。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/80929.html

相關(guān)文章

  • 實(shí)例講解基于 React+Redux 的前端開發(fā)流程

    摘要:宅印前端基于的模式開發(fā),我們指定了一套分工明確的并行開發(fā)流程。下面通過一個(gè)蘋果籃子實(shí)例,來看看整個(gè)應(yīng)用開發(fā)流程。容器負(fù)責(zé)接收中的和并發(fā)送大多數(shù)時(shí)候需要和直接連接,容器一般不需要多次使用,比如我們這個(gè)應(yīng)用的蘋果籃子。 前言:在當(dāng)下的前端界,react 和 redux 發(fā)展得如火如荼,react 在 github 的 star 數(shù)達(dá) 42000 +,超過了 jquery 的 39000+,...

    chaosx110 評(píng)論0 收藏0
  • 實(shí)例講解react+react-router+redux

    摘要:而函數(shù)式編程就不一樣了,這是模仿我們?nèi)祟惖乃季S方式發(fā)明出來的。數(shù)據(jù)流在中,數(shù)據(jù)的流動(dòng)是單向的,即從父節(jié)點(diǎn)傳遞到子節(jié)點(diǎn)。數(shù)據(jù)流嚴(yán)格的單向數(shù)據(jù)流是架構(gòu)的設(shè)計(jì)核心。 前言 總括: 本文采用react+redux+react-router+less+es6+webpack,以實(shí)現(xiàn)一個(gè)簡(jiǎn)易備忘錄(todolist)為例盡可能全面的講述使用react全家桶實(shí)現(xiàn)一個(gè)完整應(yīng)用的過程。 代碼地址:Re...

    RiverLi 評(píng)論0 收藏0
  • dva框架使用詳解及Demo教程

    摘要:框架的使用詳解及教程在前段時(shí)間,我們也學(xué)習(xí)講解過框架的基本使用,但是有很多同學(xué)在交流群里給我的反饋信息說,框架理解上有難度,看了之后還是一臉懵逼不知道如何下手,很多同學(xué)就轉(zhuǎn)向選擇使用框架。 dva框架的使用詳解及Demo教程 在前段時(shí)間,我們也學(xué)習(xí)講解過Redux框架的基本使用,但是有很多同學(xué)在交流群里給我的反饋信息說,redux框架理解上有難度,看了之后還是一臉懵逼不知道如何下手,很...

    bergwhite 評(píng)論0 收藏0
  • 一篇文章總結(jié)redux、react-reduxredux-saga

    摘要:編輯器頂層組件不就了嗎這就是。官方提供的綁定庫。具有高效且靈活的特性。在的中,可以使用或者等來監(jiān)聽某個(gè),當(dāng)某個(gè)觸發(fā)后,可以使用發(fā)起異步操作,操作完成后使用函數(shù)觸發(fā),同步更新,從而完成整個(gè)的更新。 不就ok了嗎?這就是 react-redux。Redux 官方提供的 React 綁定庫。 具有高效且靈活的特性。 React Redux 將組件區(qū)分為 容器組件 和 UI 組件 前者會(huì)處理邏輯...

    April 評(píng)論0 收藏0
  • redux-saga框架使用詳解及Demo教程

    摘要:通過創(chuàng)建將所有的異步操作邏輯收集在一個(gè)地方集中處理,可以用來代替中間件。 redux-saga框架使用詳解及Demo教程 前面我們講解過redux框架和dva框架的基本使用,因?yàn)閐va框架中effects模塊設(shè)計(jì)到了redux-saga中的知識(shí)點(diǎn),可能有的同學(xué)們會(huì)用dva框架,但是對(duì)redux-saga又不是很熟悉,今天我們就來簡(jiǎn)單的講解下saga框架的主要API和如何配合redux框...

    Nosee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<