在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ dvajs Model幾個(gè)疑問(wèn)??

dvajs Model幾個(gè)疑問(wèn)??

1、一個(gè)頁(yè)面配置幾個(gè)Model是根據(jù)什么?
2、dva文檔說(shuō)effects里不直接修改state,請(qǐng)問(wèn)是在dispatch里傳鍵名,effects接收后填到state嗎?
3、我以為的dva的概念大概是,UI事件、網(wǎng)絡(luò)回調(diào),都會(huì)觸發(fā)action,最后驅(qū)動(dòng)組件更新,但現(xiàn)在是model通過(guò)props傳入組件
4、dvajs到底提供了什么?

看我下面的代碼,這樣有違effects里不直接修改state嗎?

dispatch({
    type: 'argumentSettingModels/query',
    payload: {
        targetObject: 'paramGroup',
        pl: {
            entityId: '600040',
            beginIndex: 0,
            pageCount: 10,
        }
    }
})

*query({ payload }, { select, call, put }) {
    const { targetObject, pl } = payload
    const state = yield select(({ argumentSettingModels }) => argumentSettingModels)
    const data = yield call(query, pl)
    const map = new Map()
    if (data && data.code === '1000') {
        map.set(targetObject, {
            list: data.list,
            total: data.total,
            beginIndex: pl.beginIndex,
            pageCount: pl.pageCount,
            orderString: pl.orderString,
        })
        yield put({
            type: 'ajxSuccess',
            payload: Object.assign(state, strMapToObj(map))
        })
    }
    else {
        message.error(data.messages, 1)
    }
},
回答
編輯回答
真難過(guò)

1.我們建議一個(gè)模塊一個(gè)modal,可以用router來(lái)劃分,也就是一個(gè)router一個(gè)modal
2.effects不直接修改state, effects通過(guò)put reducer來(lái) updata state. dispatch 一個(gè)effect后,需要put reducer來(lái)update state.
3.modelstate是通過(guò)reduxconnect來(lái)提供給組件的。 export default connect(state => state)(/*your component*/)
4.dva其他就是redux與redux-saga、react-router的集成。一個(gè)好用的state管理工具。

2018年6月13日 01:19
編輯回答
入她眼

謝邀!

dva設(shè)計(jì)動(dòng)機(jī)

用過(guò)redux都知道,redux設(shè)計(jì)思想極好,但學(xué)習(xí)概念很多,晦澀難懂,不利于初學(xué)者,并且開發(fā)過(guò)程中,牽一發(fā)而動(dòng)全身,往往改一個(gè)小地方,需要在 reducer, saga, action 之間來(lái)回切換 ,因此支付寶前端團(tuán)隊(duì)才寫的dva。

dva概念

dva 是基于現(xiàn)有應(yīng)用架構(gòu) (redux + react-router + redux-saga 等)的一層輕量封裝,沒(méi)有引入任何新概念!說(shuō)白了,dva就是為了解決redux現(xiàn)有問(wèn)題(比如概念多,編寫繁瑣。。。)而設(shè)計(jì)的庫(kù)。您可以把它理解成jquery對(duì)js的封裝!

model方法

dva核心就是 model 方法,用于把 reducer, initialState, action, saga 封裝到一起,其中Model是相關(guān)業(yè)務(wù)操作集合體,是面向業(yè)務(wù)的一個(gè)拆分,因此Model叫做domain model(業(yè)務(wù)模型)更合理些。一般情況model都按照功能模塊劃分,就比如公司項(xiàng)目A,這個(gè)項(xiàng)目包含用戶模塊、產(chǎn)品模塊、活動(dòng)模塊, 那您就可以拆分成三個(gè)Model,分別為user.js、product.js、activitie.js,如果其中一個(gè)模塊過(guò)于龐大您可以再細(xì)分,具體依據(jù)自己的業(yè)務(wù)!

dva開發(fā)流程

當(dāng)用戶交互改變數(shù)據(jù)時(shí)會(huì)通過(guò) dispatch 發(fā)起一個(gè) action,同步行為會(huì)直接通過(guò) reducers 改變 state ,異步行為則先觸發(fā) effects 然后再通過(guò) reducers 改變 state,其中 dispatch 是在組件 connect models以后,通過(guò) props 傳入的。該設(shè)計(jì)思路基本跟開源社區(qū)保持一致,現(xiàn)在我們舉例說(shuō)明下dva開發(fā)流程,同步行為,異步行為都有:

/**
* 這是user組件(Component)
*/
// ES7新標(biāo)準(zhǔn):裝飾器(Decorator)
@connect(state => ({
    user: state.user,
}))

// 如果您不喜歡ES7裝飾器,那好辦,我就幫您寫一個(gè)不用的
export default connect(state => ({
    user: state.user,
}))(User);

// 如果不喜歡ES7裝飾器,就不要加export default
export default class User extends Component {
    componentDidMount() {
        const { dispatch } = this.props;
        // 獲取數(shù)據(jù),異步行為
        dispatch({
          type: 'user/fetch',
        });
    }
    componentWillUnmount() {
        const { dispatch } = this.props;
        // 清空數(shù)據(jù),同步行為
        dispatch({
          type: 'user/clear',
        });
    }
    render() {
        const { user } = this.props;
        // 獲取到數(shù)據(jù)了,我要展示到頁(yè)面上
        const { userData, } = user;
        return (
            <div>
              用戶數(shù)據(jù):{userData}
            </div>
        )
    }
}

/**
* 這是user model(Model)
*/
export default {
    namespace: 'user',
    state: {
        userData: [],
    },

    effects: {
        *fetch(_, { call, put }) {
            // fetchUserData為獲取user數(shù)據(jù)的函數(shù)
            const response = yield call(fetchUserData);
            yield put({
                type: 'save',
                payload: response,
            });
        },
    },

  reducers: {
      save(state, { payload }) {
          return {
              ...state,
              ...payload,
          };
      },
      clear() {
          return {
              userData: [],
          };
      },
  },
};
2017年11月20日 20:25