index.js是整個項目的入口文件。node
// 1. Initialize const app = dva({ history: createHistory(), }); // 2. Plugins app.use(createLoading()); // 3. Register global model app.model(require('./models/global').default); // 4. Router app.router(require('./router').default); // 5. Start app.start('#root'); export default app._store; // eslint-disable-line
'/': { component: dynamicWrapper(app, ['user', 'login'], () => import('../layouts/BasicLayout')), },
dynamicWrapper:web
// wrapper of dynamic const dynamicWrapper = (app, models, component) => { // register models models.forEach(model => { if (modelNotExisted(app, model)) { // eslint-disable-next-line app.model(require(`../models/${model}`).default); } }); // () => require('module') // transformed by babel-plugin-dynamic-import-node-sync if (component.toString().indexOf('.then(') < 0) { return props => { if (!routerDataCache) { routerDataCache = getRouterData(app); } return createElement(component().default, { ...props, routerData: routerDataCache, }); }; } // () => import('module') return Loadable({ loader: () => { if (!routerDataCache) { routerDataCache = getRouterData(app); } return component().then(raw => { const Component = raw.default || raw; return props => createElement(Component, { ...props, routerData: routerDataCache, }); }); }, loading: () => { return <Spin size="large" className="global-spin" />; }, }); };
model相似於mvc結構中控制器的角色,其中主要有五個配置項。api
進入頁面,在頁面的componentDidMount鉤子函數中調用model的effect中的方法服務器
該方法調用service文件夾下的統一管理的請求函數babel
獲取到服務器返回值,在model的effect中拿到,而且調用model下的reducerwebsocket
調用model的reducers對請求的數據進行處理,將model的state進行改變,頁面自動進行渲染mvc