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)
}
},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.model的state是通過(guò)redux的connect來(lái)提供給組件的。 export default connect(state => state)(/*your component*/)
4.dva其他就是redux與redux-saga、react-router的集成。一個(gè)好用的state管理工具。
謝邀!
用過(guò)redux都知道,redux設(shè)計(jì)思想極好,但學(xué)習(xí)概念很多,晦澀難懂,不利于初學(xué)者,并且開發(fā)過(guò)程中,牽一發(fā)而動(dòng)全身,往往改一個(gè)小地方,需要在 reducer, saga, action 之間來(lái)回切換 ,因此支付寶前端團(tuán)隊(duì)才寫的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的封裝!
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ù)!
當(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: [],
};
},
},
};
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。