view和model的关系图
model主要有 namespace
state
reducers
effects
subscription
5个主要属性
//model.js 基本结构
export const DemoModel = {
nameSpace: 'demo', // 定义model名,如果没声明,会以文件作为namespace
state:{},
reducers:{
// reducer 是 Action 处理器,用来处理同步操作,
getList (state, { payload }) { // 第二个参数为 action = {type,payload}
//代码操作
return payload
}
},
effects:{
// Effect是一个 Generator 函数,内部使用 yield 关键字,标识每一步的操作
*getRemote ({ payload },{put, call}) {
// 这里每个函数都有两个参数,(action,effect), effect = {put,call,select}
// put 触发一个action,类似于display
// call 执行异步函数,比如请求
const data = yield call(getRemoteList)
yield put({
type: 'getList',
payload: {"data":data} // 这里直接返回data会获取不到数据,因此我用对象又包了一层
})
},
*delUser ({ payload:{ id } },{put,call}) {
const data = yield call(delUserData, { id })
yield put({
type: 'getRemote',
payload: {}
})
},
},
subscriptions:{
setup({ dispatch, history }) {
return history.listen(({ pathname }) => { // {pathname} = location
if (pathname === '/') {
dispatch({
type: 'getRemote', // 监听到进入主页,派发query事件
})
}
});
}
}
}
使用 useSelector
useDispatch
,来替代原先的connect
,绑定 State 到 View ,
import { useSelector, useDispatch,useStore } from 'umi';
const Index = () => {
// useSelector 通过getState()方法找到demo的data
const state = useSelector(state => state.getState().demo.data)
// useStore:如果store中的state改变,这个将不会自动更新
//const state = useStore(state.getState())
const dispatch = useDispatch()
const deleteHandler = async (id) => {
dispatch({
type:'users/delUser',
payload:{
id
}
})
};
return()
}
export default Index
原先connect
写法
import { connect } from 'umi';
const Index = (props) => {
const { users, dispatch } = props
const state = users.users.data
const deleteHandler = async (id) => {
dispatch({
type:'users/delUser',
payload:{
id
}
})
};
return()
}
const stateToProps = ({users}) => {
return {
users
}
}
export default connect(stateToProps)(Index);
// 或者
export default connect(({users}) => ({
users
}))(UserTable);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。