摘要:初始值,優先級低于傳給的,如下此時,在后為以格式定義。用于處理同步操作,唯一可以修改的地方。由觸發,可以觸發,可以和服務器交互,可以獲取全局的數據等等。取消注冊,清理和。如果沒有返回函數,使用會給予警告注冊路由表。
前言
dva 首先是一個基于 redux 和 redux-saga 的數據流方案,然后為了簡化開發體驗,dva 還額外內置了 react-router 和 fetch,所以也可以理解為一個輕量級的應用框架。
dva官網地址:https://dvajs.com/
import dva from "dva"; // 1. Initialize const app = dva(); // 2. Plugins app.use({}); // 3. Model app.model(require("./models/example").default); // 4. Router app.router(require("./router").default); // 5. Start app.start("#root");
dva僅有6個api,如下介紹:
1. const app = dva(options)創建應用,返回dva實例
options中包含:
(1) history:默認為hashHistory,如果要配置history為browserHistory,則
import createHistory from "history/createBrowserHistory"; const app = dva({ history: createHistory(), });
(2) initialState: 指定初始數據,優先級高于model中的state,默認為{}
(3) onError: 管理全局出錯狀態,如下:
const app = dva({ onError(e){ console.log(e); } });
(4) onAction(fn | fn[]): 在action被dispatch時觸發,用于注冊redux中間件,支持函數格式或者函數數組格式,如下通過redux-logger答應日志,如:
import createLogger from "redux-logger"; const app = dva({ onAction: createLogger(opts), });
(5) onStateChange(fn): state改變時觸發,可用于同步state 到 localStorage,服務器端等
(6) onReducer(fn): 封裝 reducer 執行。比如借助 redux-undo 實現 redo/undo :
import undoable from "redux-undo"; const app = dva({ onReducer: reducer => { return (state, action) => { const undoOpts = {}; const newState = undoable(reducer, undoOpts)(state, action); // 由于 dva 同步了 routing 數據,所以需要把這部分還原 return { ...newState, routing: newState.present.routing }; }, }, });
(7) onEffect(fn): 封裝 effect 執行。比如 dva-loading 基于此實現了自動處理 loading 狀態。
(8) onHmr(fn): 熱替換相關,目前用于 babel-plugin-dva-hmr
(9) extraReducers: 指定額外的 reducer,比如 redux-form 需要指定額外的 form reducer
import { reducer as formReducer } from "redux-form" const app = dva({ extraReducers: { form: formReducer, }, });
(10) extraEnhancers: 指定額外的 StoreEnhancer ,比如結合 redux-persist 的使用
import { persistStore, autoRehydrate } from "redux-persist"; const app = dva({ extraEnhancers: [autoRehydrate()], }); persistStore(app._store);2.app.use(hooks)
配置 hooks 或者注冊插件。(插件最終返回的是 hooks )
比如注冊 dva-loading 插件的例子:
import createLoading from "dva-loading"; ... app.use(createLoading(opts));
hooks 包含2中(3)到(10)
3.app.model(model)注冊model
model 是 dva 中最重要的概念,以下是典型的例子:
app.model({ namespace: "todo", state: [], reducers: { add(state, { payload: todo }) { // 保存數據到 state return [...state, todo]; }, }, effects: { *save({ payload: todo }, { put, call }) { // 調用 saveTodoToServer,成功后觸發 `add` action 保存到 state yield call(saveTodoToServer, todo); yield put({ type: "add", payload: todo }); }, }, subscriptions: { setup({ history, dispatch }) { // 監聽 history 變化,當進入 `/` 時觸發 `load` action return history.listen(({ pathname }) => { if (pathname === "/") { dispatch({ type: "load" }); } }); }, }, });
model 包含 5 個屬性:
namespace: model 的命名空間,同時也是他在全局 state 上的屬性,只能用字符串,不支持通過 . 的方式創建多層命名空間。
state: 初始值,優先級低于傳給 dva() 的 opts.initialState,如下:
const app = dva({ initialState: { count: 1 }, }); app.model({ namespace: "count", state: 0, });
此時,在 app.start() 后 state.count 為 1
reducers: 以 key/value 格式定義 reducer。用于處理同步操作,唯一可以修改 state 的地方。由 action 觸發,格式為 (state, action) => newState 或 [(state, action) => newState, enhancer]
effects: 以 key/value 格式定義 effect。用于處理異步操作和業務邏輯,不直接修改 state。由 action 觸發,可以觸發 action,可以和服務器交互,可以獲取全局 state 的數據等等。格式為
*(action, effects) => void 或 [*(action, effects) => void, { type }]。
subscriptions: 以 key/value 格式定義 subscription。subscription 是訂閱,用于訂閱一個數據源,然后根據需要 dispatch 相應的 action。在 app.start() 時被執行,數據源可以是當前的時間、服務器的 websocket 連接、keyboard 輸入、geolocation 變化、history 路由變化等等。格式為 ({ dispatch, history }, done) => unlistenFunction。注意:如果要使用 app.unmodel(),subscription 必須返回 unlisten 方法,用于取消數據訂閱。
4.app.unmodel(namespace)取消 model 注冊,清理 reducers, effects 和 subscriptions。subscription 如果沒有返回 unlisten 函數,使用 app.unmodel 會給予警告
5.app.router(({ history, app }) => RouterConfig)注冊路由表。通常是這樣的:
import { Router, Route } from "dva/router"; app.router(({ history }) => { return (); });
推薦把路由信息抽成一個多帶帶的文件,這樣結合 babel-plugin-dva-hmr 可實現路由和組件的熱加載,比如:
app.router(require("./router"));
而有些場景可能不使用路由,比如多頁應用,所以也可以傳入返回 JSX 元素的函數。比如:
app.router(() =>6.app.start(selector));
啟動應用。selector 可選,如果沒有 selector 參數,會返回一個返回 JSX 元素的函數。
app.start("#root");
那么什么時候不加 selector?常見場景有測試、node 端、react-native 和 i18n 國際化支持。
比如通過 react-intl 支持國際化的例子:
import { IntlProvider } from "react-intl"; ... const App = app.start(); ReactDOM.render(, htmlElement);
本文參考官網:https://dvajs.com/api/#dva-api
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100138.html
摘要:是中用來對參數進行類型檢測的,當然要使用這個插件,得先安裝這個插件,如下但是如果你是直接用創建的項目,無需安裝,直接引入即可,如下上面那個例子中可以看出,要引入組件,必須得傳入參數類型為字符串的參數,否則會報錯常用的數據類型檢測如下 propTypes是react中用來對參數進行類型檢測的,當然要使用這個插件,得先安裝這個插件,如下: npm install prop-types --...
摘要:創建組件創建組件之前要注意以下幾點組件創建的名稱首字母得大寫組件中返回的只能是一個根節點,所有的內容得用一個元素都框起來無狀態函數式組件無狀態函數式組件可以理解成就是一個函數生成的,使得代碼的可讀性更好,并且精簡便利,減少了冗余,無狀態組件 創建組件 創建組件之前要注意以下幾點: 組件創建的名稱首字母得大寫 組件中返回的JSX只能是一個根節點,所有的內容得用一個元素都框起來 1.無...
摘要:如在中在中,聚合積累的結果是當前的對象。被稱為副作用,在我們的應用中,最常見的就是異步操作。至于為什么我們這么糾結于純函數,如果你想了解更多可以閱讀,或者它的中文譯本函數式編程指南。 DvaJS: React and redux based, lightweight and elm-style framework. https://dvajs.com/ 實例項目源碼:https://g...
摘要:首先是一個基于和的數據流方案,然后為了簡化開發體驗,還額外內置了和,所以也可以理解為一個輕量級的應用框架。本教程是利用的開放來做一個一樣的網站,以此來學習框架的使用。寫的不好的地方還請多多包涵,大家一起學習。 dva 首先是一個基于 redux 和 redux-saga 的數據流方案,然后為了簡化開發體驗,dva 還額外內置了 react-router 和 fetch,所以也可以理解為...
閱讀 3222·2021-11-11 16:55
閱讀 2458·2021-10-13 09:39
閱讀 2392·2021-09-13 10:27
閱讀 2155·2019-08-30 15:55
閱讀 3083·2019-08-30 15:54
閱讀 3127·2019-08-29 16:34
閱讀 1819·2019-08-29 12:41
閱讀 1065·2019-08-29 11:33