結構
effects: { *pageQuery({ payload = {} }, { select, call, put }) { const res = yield call(pageQuery, payload); const list = yield select((s) => s.commodity.list); yield put({ type: 'save', payload: { detail: res.result, }, }); }, }
首先確認一點,effects里面的函數都是Generator函數.然后我們對里面的一些關鍵詞進行分類來區分為啥effects里面的函數的函數要這么寫.
yield
固定關鍵詞,Generator函數自帶的關鍵詞,和"*"搭配使用.有點像async和await,使用"*"則表明它是Generator函數,然后每使用一個"yield"就是告訴程序這里是異步,需要等待這個后面的代碼執行完成.同步代碼可不使用該關鍵詞
payload
view端通過dispatch傳過來的payload同名參數
select, call, put
dva中effects函數的固定傳參,他們分別對應不同的功能,用於不用場景
select
拿到model中state的數據
const list = yield select((s) => s.commodity.list);
call
第一個參數是一個異步函數,payload是參數,可以通過call來執行一個完整的異步請求,又因為yield的存在,就實現了異步轉同步的方案
const res = yield call(pageQuery, payload)
put
可以使用同model中的reducers或者effects,通過reducers來實現數據到頁面的更新.可以通過put實現effect的嵌套使用
yield put({ type: 'save', payload: { detail: res.result, }, });