From f511a773641522b8b130ef532fe041eb74cfc2e5 Mon Sep 17 00:00:00 2001 From: chencheng Date: Thu, 22 Feb 2018 16:27:54 +0800 Subject: [PATCH] 4. Generate users model and service --- src/pages/users/models/users.js | 29 +++++++++++++++++++++++++++++ src/pages/users/services/users.js | 5 +++++ src/utils/request.js | 27 +++++++++++++++++---------- 3 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 src/pages/users/models/users.js create mode 100644 src/pages/users/services/users.js diff --git a/src/pages/users/models/users.js b/src/pages/users/models/users.js new file mode 100644 index 0000000..e3fd89b --- /dev/null +++ b/src/pages/users/models/users.js @@ -0,0 +1,29 @@ +import * as usersService from '../services/users'; + +export default { + namespace: 'users', + state: { + list: [], + total: null, + }, + reducers: { + save(state, { payload: { data: list, total } }) { + return { ...state, list, total }; + }, + }, + effects: { + *fetch({ payload: { page } }, { call, put }) { + const { data, headers } = yield call(usersService.fetch, { page }); + yield put({ type: 'save', payload: { data, total: headers['x-total-count'] } }); + }, + }, + subscriptions: { + setup({ dispatch, history }) { + return history.listen(({ pathname, query }) => { + if (pathname === '/users') { + dispatch({ type: 'fetch', payload: query }); + } + }); + }, + }, +}; diff --git a/src/pages/users/services/users.js b/src/pages/users/services/users.js new file mode 100644 index 0000000..227ddaa --- /dev/null +++ b/src/pages/users/services/users.js @@ -0,0 +1,5 @@ +import request from '../../../utils/request'; + +export function fetch({ page = 1 }) { + return request(`/api/users?_page=${page}&_limit=5`); +} diff --git a/src/utils/request.js b/src/utils/request.js index 6e8005c..a660650 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,9 +1,5 @@ import fetch from 'dva/fetch'; -function parseJSON(response) { - return response.json(); -} - function checkStatus(response) { if (response.status >= 200 && response.status < 300) { return response; @@ -21,10 +17,21 @@ function checkStatus(response) { * @param {object} [options] The options we want to pass to "fetch" * @return {object} An object containing either "data" or "err" */ -export default function request(url, options) { - return fetch(url, options) - .then(checkStatus) - .then(parseJSON) - .then(data => ({ data })) - .catch(err => ({ err })); +export default async function request(url, options) { + const response = await fetch(url, options); + + checkStatus(response); + + const data = await response.json(); + + const ret = { + data, + headers: {}, + }; + + if (response.headers.get('x-total-count')) { + ret.headers['x-total-count'] = response.headers.get('x-total-count'); + } + + return ret; }