基於redux的前端框架dva入門教程

2021-08-10 17:35:12 字數 4347 閱讀 3590

預設輸出檔案。

預設輸出 react-router 介面, react-router-redux 的介面通過屬性 routerredux 輸出。

比如:

import  from 'dva/router';
非同步請求庫,輸出 isomorphic-fetch 的介面。不和 dva 強繫結,可以選擇任意的請求庫。

輸出 redux-saga 的介面,主要用於用例的編寫。(用例中需要用到 effects)

解決元件動態載入問題的 util 方法。

比如:

import dynamic from 'dva/dynamic';

const userpagecomponent = dynamic();

opts包含:

models: 返回 promise 陣列的函式,promise 返回 dva model

component:返回 promise 的函式,promise 返回 react component

建立應用,返回 dva 例項。(注:dva 支援多例項)

opts包含:

如果要配置 history 為browserhistory,可以這樣:

import createhistory from 'history/createbrowserhistory';

history: createhistory(),

});

history,

initialstate,

onerror,

onaction,

onstatechange,

onreducer,

oneffect,

onhmr,

extrareducers,

extraenhancers,

});

配置 hooks 或者註冊外掛程式。(外掛程式最終返回的是 hooks )

比如註冊 dva-loading 外掛程式的例子:

import createloading from 'dva-loading';

...

hooks包含:

onerror((err, dispatch) => {})

effect執行錯誤或subscription通過done主動拋錯時觸發,可用於管理全域性出錯狀態。

注意:subscription並沒有加try...catch,所以有錯誤時需通過第二個引數done主動拋錯。例子:

subscriptions: , done) ,

},});

如果我們用 antd,那麼最簡單的全域性錯誤處理通常會這麼做:

import  from 'antd';

onerror(e) ,

});

onaction(fn | fn)

在 action 被 dispatch 時觸發,用於註冊 redux 中介軟體。支援函式或函式陣列格式。

例如我們要通過 redux-logger 列印日誌:

import createlogger from 'redux-logger';

onaction: createlogger(opts),

});

onstatechange(fn)

state改變時觸發,可用於同步state到 localstorage,伺服器端等。

onreducer(fn)

封裝 reducer 執行。比如借助 redux-undo 實現 redo/undo :

import undoable from 'redux-undo';

onreducer: reducer => ;

const newstate = undoable(reducer, undoopts)(state, action);

// 由於 dva 同步了 routing 資料,所以需要把這部分還原

return ;

},},

});

oneffect(fn)

封裝 effect 執行。比如 dva-loading 基於此實現了自動處理 loading 狀態。

onhmr(fn)

熱替換相關,目前用於 babel-plugin-dva-hmr 。

extrareducers

指定額外的 reducer,比如 redux-form 需要指定額外的formreducer:

import  from 'redux-form'

extrareducers: ,

});

extraenhancers

指定額外的 storeenhancer ,比如結合 redux-persist 的使用:

import  from 'redux-persist';

extraenhancers: [autorehydrate()],

});

註冊 model,詳見 #model 部分。

註冊路由表。

通常是這樣的:

import  from 'dva/router';

return (

history=>

path="/"

);});

推薦把路由資訊抽成乙個單獨的檔案,這樣結合 babel-plugin-dva-hmr 可實現路由和元件的熱載入,比如:

而有些場景可能不使用路由,比如多頁應用,所以也可以傳入返回 jsx 元素的函式。比如:

啟動應用。selector可選,如果沒有selector引數,會返回乙個返回 jsx 元素的函式。

那麼什麼時候不加selector?常見場景有測試、node 端、react-native 和 i18n 國際化支援。

比如通過 react-intl 支援國際化的例子:

import  from 'react-intl';

...reactdom.render(

intlprovider>, htmlelement);

model 是 dva 中最重要的概念。以下是典型的例子:

namespace: 'todo',

state: ,

reducers: ) ,

},effects: , ) );

},},

subscriptions: ) ) => );

}});

},},

});

model 包含 5 個屬性:

model 的命名空間,同時也是他在全域性 state 上的屬性,只能用字串,不支援通過.的方式建立多層命名空間。

初始值,優先順序低於傳給dva()opts.initialstate

比如: initialstate: ,

}); namespace: 'count',

state: 0,

});以 key/value 格式定義 reducer。用於處理同步操作,唯一可以修改state的地方。由action觸發。

格式為(state, action) => newstate[(state, action) => newstate, enhancer]

詳見:

以 key/value 格式定義 effect。用於處理非同步操作和業務邏輯,不直接修改state。由action觸發,可以觸發action,可以和伺服器互動,可以獲取全域性state的資料等等。

格式為*(action, effects) => void[*(action, effects) => void, ]

type 型別有:

詳見:格式為(, done) => unlistenfunction

使用dva框架的總結

最近的專案是react dva atd webpack的乙個後台專案,剛接觸dva就感覺很喜歡,很簡潔用著很爽。關於使用redux中的一些問題 1 檔案切換問題 redux的專案通常喲啊分為reducer action saga component等等,我們需要在檔案之間來回切換,並且檔案通常是分目...

使用dva框架的總結

最近的專案是react dva atd webpack的乙個後台專案,剛接觸dva就感覺很喜歡,很簡潔用著很爽。關於使用redux中的一些問題 1 檔案切換問題 redux的專案通常喲啊分為reducer action saga component等等,我們需要在檔案之間來回切換,並且檔案通常是分目...

前端基於jquery的UI框架

正在做的乙個專案選擇jquery作為前端js核心庫。然後就想選乙個基於jquery的ui庫,然後悲催的事情發生了。至於為什麼使用jquery,一是因為不想為授權費用,而又不想引起可能法律糾紛 另一方面jquery也是所有最容易上手和流行的js庫。如果ext要用於商用就要付版權費,這個不行 dojo的...