1.src/models
在 Ant Design Pro 中,一个完整的前端 UI 交互到服务端处理流程是这样的:
1.UI 组件交互操作;
2.调用 model 的 effect;
3.调用统一管理的 service 请求函数;
4.使用封装的 request.ts 发送请求;
5.获取服务端返回;
6.然后调用 reducer 改变 state;
7.更新 model。
1 // model 2 { 3 namespace: String, // 命名空间 4 state: Object, // 状态 5 reducer: Object, // 同步更新 state 6 effects: Object, // 副作用:处理异步逻辑 7 subscriptions: Object // 订阅数据源 8 }
这些文件被引用在src/pages/.umi/dva中。
我们以 models/global
为例:
namespace: 'global'
说明以下此处的dva命名空间为 global
,即你调用的时候需要采用 global.XXX
的形式
其中的 state: {}
是存放状态的,也就是数据。
reducers
是用来更新 state
的,但是他只能是同步的。所以我们需要 effects
来进行异步更新。
即:
1 state: { 2 collapsed: false, 3 notices: [], 4 }, // 存放状态和数据 5 reducers: { // 用来同步设置state 6 changeLayoutCollapsed( 7 state = { 8 notices: [], 9 collapsed: true, 10 }, 11 { payload }, 12 ) { 13 return { ...state, collapsed: payload }; 14 }, 15 16 saveNotices(state, { payload }) { 17 return { 18 collapsed: false, 19 ...state, 20 notices: payload, 21 }; 22 }, 23 // ... 24 }
1 effects: { // 异步更新state,通过调用同步的reducers实现 2 *fetchNotices(_, { call, put, select }) { 3 const data = yield call(queryNotices); 4 yield put({ 5 type: 'saveNotices', 6 payload: data, 7 }); 8 const unreadCount = yield select( 9 state => state.global.notices.filter(item => !item.read).length, 10 ); 11 yield put({ 12 type: 'user/changeNotifyCount', 13 payload: { 14 totalCount: data.length, 15 unreadCount, 16 }, 17 }); 18 }, 19 // ... 20 }