import { Effect, ImmerReducer } from 'umi'
import { login } from '@/services/admin' // *******************
export interface ILoginState {
adminname: string
token: string
role: number
}
export interface ILoginModelInterface {
namespace: 'admin' // 接口中的namespace 直接写模块的名称即可
state: ILoginState,
effects: {
loginReq: Effect
},
reducers: {
changeAdminName: ImmerReducer<ILoginState>,
changeToken: ImmerReducer<ILoginState>,
changeRole: ImmerReducer<ILoginState>
}
}
const LoginModel: ILoginModelInterface = {
namespace: 'admin', // 命名空间 --- 区分模块
state: { // 初始化的状态
adminname: '',
token: '',
role: 1
},
effects: { // 可以看作是 vuex中actions, 必须写成 generator 的写法
// payload 解构赋值 说明传入过来的参数是以对象形式传递的
// call 代表调用 异步操作的方法
// put 代表 类似于之前的 dispatch
*loginReq ({ payload }: any, { call, put }: any) {
console.log(11111)
// 异步操作数据 必须通过yield 执行
// call(异步函数, 函数需要的参数)
const res = yield call(login, payload)
console.log(res)
// 修改状态 ---- 必须使用 yield 表示代码的继续执行
// 使用时必须是对象形式
yield put({ type: 'changeAdminName', payload: res.data.data.adminname})
yield put({ type: 'changeToken', payload: res.data.data.token})
yield put({ type: 'changeRole', payload: res.data.data.role})
}
},
reducers: { // 类似于vuex中的 mutations
changeAdminName (state: ILoginState, action: any) {
state.adminname = action.payload
},
changeToken (state: ILoginState, action: any) {
state.token = action.payload
},
changeRole (state: ILoginState, action: any) {
state.role = action.payload
}
}
}
export default LoginModel
dva数据流
最新推荐文章于 2024-03-20 16:37:49 发布