成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

初識(shí)React(9):dva簡介

keke / 1937人閱讀

摘要:初始值,優(yōu)先級(jí)低于傳給的,如下此時(shí),在后為以格式定義。用于處理同步操作,唯一可以修改的地方。由觸發(fā),可以觸發(fā),可以和服務(wù)器交互,可以獲取全局的數(shù)據(jù)等等。取消注冊(cè),清理和。如果沒有返回函數(shù),使用會(huì)給予警告注冊(cè)路由表。

前言

dva 首先是一個(gè)基于 redux 和 redux-saga 的數(shù)據(jù)流方案,然后為了簡化開發(fā)體驗(yàn),dva 還額外內(nèi)置了 react-router 和 fetch,所以也可以理解為一個(gè)輕量級(jí)的應(yīng)用框架。
dva官網(wǎng)地址: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個(gè)api,如下介紹:

1. const app = dva(options)

創(chuàng)建應(yīng)用,返回dva實(shí)例

options中包含:

(1) history:默認(rèn)為hashHistory,如果要配置history為browserHistory,則

import createHistory from "history/createBrowserHistory";
const app = dva({
  history: createHistory(),
});

(2) initialState: 指定初始數(shù)據(jù),優(yōu)先級(jí)高于model中的state,默認(rèn)為{}

(3) onError: 管理全局出錯(cuò)狀態(tài),如下:

const app = dva({
  onError(e){
    console.log(e);
  }
});

(4) onAction(fn | fn[]): 在action被dispatch時(shí)觸發(fā),用于注冊(cè)redux中間件,支持函數(shù)格式或者函數(shù)數(shù)組格式,如下通過redux-logger答應(yīng)日志,如:

import createLogger from "redux-logger";
const app = dva({
  onAction: createLogger(opts),
});

(5) onStateChange(fn): state改變時(shí)觸發(fā),可用于同步state 到 localStorage,服務(wù)器端等

(6) onReducer(fn): 封裝 reducer 執(zhí)行。比如借助 redux-undo 實(shí)現(xiàn) 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 數(shù)據(jù),所以需要把這部分還原
      return { ...newState, routing: newState.present.routing };
    },
  },
});

(7) onEffect(fn): 封裝 effect 執(zhí)行。比如 dva-loading 基于此實(shí)現(xiàn)了自動(dòng)處理 loading 狀態(tài)。

(8) onHmr(fn): 熱替換相關(guān),目前用于 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 ,比如結(jié)合 redux-persist 的使用

import { persistStore, autoRehydrate } from "redux-persist";
const app = dva({
  extraEnhancers: [autoRehydrate()],
});
persistStore(app._store);
2.app.use(hooks)

配置 hooks 或者注冊(cè)插件。(插件最終返回的是 hooks )

比如注冊(cè) dva-loading 插件的例子:

import createLoading from "dva-loading";
...
app.use(createLoading(opts));

hooks 包含2中(3)到(10)

3.app.model(model)

注冊(cè)model

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

app.model({
  namespace: "todo",
  state: [],
  reducers: {
    add(state, { payload: todo }) {
      // 保存數(shù)據(jù)到 state
      return [...state, todo];
    },
  },
  effects: {
    *save({ payload: todo }, { put, call }) {
      // 調(diào)用 saveTodoToServer,成功后觸發(fā) `add` action 保存到 state
      yield call(saveTodoToServer, todo);
      yield put({ type: "add", payload: todo });
    },
  },
  subscriptions: {
    setup({ history, dispatch }) {
      // 監(jiān)聽 history 變化,當(dāng)進(jìn)入 `/` 時(shí)觸發(fā) `load` action
      return history.listen(({ pathname }) => {
        if (pathname === "/") {
          dispatch({ type: "load" });
        }
      });
    },
  },
});

model 包含 5 個(gè)屬性:

namespace: model 的命名空間,同時(shí)也是他在全局 state 上的屬性,只能用字符串,不支持通過 . 的方式創(chuàng)建多層命名空間。

state: 初始值,優(yōu)先級(jí)低于傳給 dva() 的 opts.initialState,如下:

const app = dva({
  initialState: { count: 1 },
});
app.model({
  namespace: "count",
  state: 0,
});

此時(shí),在 app.start() 后 state.count 為 1

reducers: 以 key/value 格式定義 reducer。用于處理同步操作,唯一可以修改 state 的地方。由 action 觸發(fā),格式為 (state, action) => newState 或 [(state, action) => newState, enhancer]

effects: 以 key/value 格式定義 effect。用于處理異步操作和業(yè)務(wù)邏輯,不直接修改 state。由 action 觸發(fā),可以觸發(fā) action,可以和服務(wù)器交互,可以獲取全局 state 的數(shù)據(jù)等等。格式為

*(action, effects) => void 或 [*(action, effects) => void, { type }]。

subscriptions: 以 key/value 格式定義 subscription。subscription 是訂閱,用于訂閱一個(gè)數(shù)據(jù)源,然后根據(jù)需要 dispatch 相應(yīng)的 action。在 app.start() 時(shí)被執(zhí)行,數(shù)據(jù)源可以是當(dāng)前的時(shí)間、服務(wù)器的 websocket 連接、keyboard 輸入、geolocation 變化、history 路由變化等等。格式為 ({ dispatch, history }, done) => unlistenFunction。注意:如果要使用 app.unmodel(),subscription 必須返回 unlisten 方法,用于取消數(shù)據(jù)訂閱。

4.app.unmodel(namespace)

取消 model 注冊(cè),清理 reducers, effects 和 subscriptions。subscription 如果沒有返回 unlisten 函數(shù),使用 app.unmodel 會(huì)給予警告

5.app.router(({ history, app }) => RouterConfig)

注冊(cè)路由表。通常是這樣的:

import { Router, Route } from "dva/router";
app.router(({ history }) => {
  return (
    
      
    
  );
});

推薦把路由信息抽成一個(gè)多帶帶的文件,這樣結(jié)合 babel-plugin-dva-hmr 可實(shí)現(xiàn)路由和組件的熱加載,比如:

app.router(require("./router"));

而有些場景可能不使用路由,比如多頁應(yīng)用,所以也可以傳入返回 JSX 元素的函數(shù)。比如:

app.router(() => );
6.app.start(selector)

啟動(dòng)應(yīng)用。selector 可選,如果沒有 selector 參數(shù),會(huì)返回一個(gè)返回 JSX 元素的函數(shù)。

app.start("#root");

那么什么時(shí)候不加 selector?常見場景有測試、node 端、react-native 和 i18n 國際化支持。

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

import { IntlProvider } from "react-intl";
...
const App = app.start();
ReactDOM.render(, htmlElement);

本文參考官網(wǎng):https://dvajs.com/api/#dva-api

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100138.html

相關(guān)文章

  • 初識(shí)React(6):propTypes類型檢測

    摘要:是中用來對(duì)參數(shù)進(jìn)行類型檢測的,當(dāng)然要使用這個(gè)插件,得先安裝這個(gè)插件,如下但是如果你是直接用創(chuàng)建的項(xiàng)目,無需安裝,直接引入即可,如下上面那個(gè)例子中可以看出,要引入組件,必須得傳入?yún)?shù)類型為字符串的參數(shù),否則會(huì)報(bào)錯(cuò)常用的數(shù)據(jù)類型檢測如下 propTypes是react中用來對(duì)參數(shù)進(jìn)行類型檢測的,當(dāng)然要使用這個(gè)插件,得先安裝這個(gè)插件,如下: npm install prop-types --...

    Brenner 評(píng)論0 收藏0
  • 初識(shí)React(3):組件

    摘要:創(chuàng)建組件創(chuàng)建組件之前要注意以下幾點(diǎn)組件創(chuàng)建的名稱首字母得大寫組件中返回的只能是一個(gè)根節(jié)點(diǎn),所有的內(nèi)容得用一個(gè)元素都框起來無狀態(tài)函數(shù)式組件無狀態(tài)函數(shù)式組件可以理解成就是一個(gè)函數(shù)生成的,使得代碼的可讀性更好,并且精簡便利,減少了冗余,無狀態(tài)組件 創(chuàng)建組件 創(chuàng)建組件之前要注意以下幾點(diǎn): 組件創(chuàng)建的名稱首字母得大寫 組件中返回的JSX只能是一個(gè)根節(jié)點(diǎn),所有的內(nèi)容得用一個(gè)元素都框起來 1.無...

    FullStackDeveloper 評(píng)論0 收藏0
  • 一篇文章讀懂 React & redux 前端開發(fā)

    摘要:如在中在中,聚合積累的結(jié)果是當(dāng)前的對(duì)象。被稱為副作用,在我們的應(yīng)用中,最常見的就是異步操作。至于為什么我們這么糾結(jié)于純函數(shù),如果你想了解更多可以閱讀,或者它的中文譯本函數(shù)式編程指南。 DvaJS: React and redux based, lightweight and elm-style framework. https://dvajs.com/ 實(shí)例項(xiàng)目源碼:https://g...

    cppowboy 評(píng)論0 收藏0
  • dva開發(fā)一個(gè)cnode網(wǎng)站(1)

    摘要:首先是一個(gè)基于和的數(shù)據(jù)流方案,然后為了簡化開發(fā)體驗(yàn),還額外內(nèi)置了和,所以也可以理解為一個(gè)輕量級(jí)的應(yīng)用框架。本教程是利用的開放來做一個(gè)一樣的網(wǎng)站,以此來學(xué)習(xí)框架的使用。寫的不好的地方還請(qǐng)多多包涵,大家一起學(xué)習(xí)。 dva 首先是一個(gè)基于 redux 和 redux-saga 的數(shù)據(jù)流方案,然后為了簡化開發(fā)體驗(yàn),dva 還額外內(nèi)置了 react-router 和 fetch,所以也可以理解為...

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

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

0條評(píng)論

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