最近項目需要用到了umi.js洲守,豐富的內(nèi)置功能對小白很友好,上手難度不大轰异。今天嘗試在自己寫的demo里加上dva岖沛,get一下connect新用法。
view和model的關(guān)系圖
model主要有 namespace
state
reducers
effects
subscription
5個主要屬性
//model.js 基本結(jié)構(gòu)
export const DemoModel = {
nameSpace: 'demo', // 定義model名搭独,如果沒聲明婴削,會以文件作為namespace
state:{},
reducers:{
// reducer 是 Action 處理器,用來處理同步操作牙肝,
getList (state, { payload }) { // 第二個參數(shù)為 action = {type,payload}
//代碼操作
return payload
}
}唉俗,
effects:{
// Effect是一個 Generator 函數(shù)嗤朴,內(nèi)部使用 yield 關(guān)鍵字,標(biāo)識每一步的操作
*getRemote ({ payload },{put, call}) {
// 這里每個函數(shù)都有兩個參數(shù)虫溜,(action,effect), effect = {put,call,select}
// put 觸發(fā)一個action雹姊,類似于display
// call 執(zhí)行異步函數(shù),比如請求
const data = yield call(getRemoteList)
yield put({
type: 'getList',
payload: {"data":data} // 這里直接返回data會獲取不到數(shù)據(jù)衡楞,因此我用對象又包了一層
})
},
*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', // 監(jiān)聽到進入主頁吱雏,派發(fā)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);