Umi Dva:useStore useSelector useDispatch用法

最近項(xiàng)目需要用到了umi.js,豐富的內(nèi)置功能對(duì)小白很友好,上手難度不大。今天嘗試在自己寫的demo里加上dva,get一下connect新用法。

view和model的關(guān)系圖

image-20210204152603826.png

model主要有 namespace state reducers effects subscription5個(gè)主要屬性


//model.js 基本結(jié)構(gòu)
export const DemoModel = {
  nameSpace: 'demo', // 定義model名,如果沒(méi)聲明,會(huì)以文件作為namespace
  state:{}, 
  reducers:{ 
    // reducer 是 Action 處理器,用來(lái)處理同步操作,
    getList (state, { payload }) { // 第二個(gè)參數(shù)為 action = {type,payload} 
        //代碼操作
      return payload 
    }
    },
  effects:{ 
    // Effect是一個(gè) Generator 函數(shù),內(nèi)部使用 yield 關(guān)鍵字,標(biāo)識(shí)每一步的操作
    *getRemote ({ payload },{put, call}) {  
      // 這里每個(gè)函數(shù)都有兩個(gè)參數(shù),(action,effect), effect = {put,call,select}
      // put 觸發(fā)一個(gè)action,類似于display
      // call 執(zhí)行異步函數(shù),比如請(qǐng)求 
      const data = yield call(getRemoteList)
      yield put({
        type: 'getList',
        payload: {"data":data} // 這里直接返回data會(huì)獲取不到數(shù)據(jù),因此我用對(duì)象又包了一層
      })
    },
    *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)聽(tīng)到進(jìn)入主頁(yè),派發(fā)query事件
          })
        }
      });
    }
  }
}

使用 useSelector useDispatch ,來(lái)替代原先的connect,綁定 State 到 View ,

import { useSelector, useDispatch,useStore } from 'umi';

const Index = () => {
  // useSelector 通過(guò)getState()方法找到demo的data
    const state = useSelector(state => state.getState().demo.data) 
  // useStore:如果store中的state改變,這個(gè)將不會(huì)自動(dòng)更新
  //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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容