1. 动态注册module
- 有不少业务场景下,我们可能会定义出很多个model,但并不需要在应用启动的时候就全部加载,比较典型的是各类管理控制台。如果每个功能页面是通过路由切换,互相之间没有关系的话,通常会使用webpack的require.ensure来做代码模块的懒加载。
function RouterConfig({ history, app }) {
const routes = [
{
path: '/',
name: 'IndexPage',
getComponent(nextState, cb) {
require.ensure([], (require) => {
registerModel(app, require('./models/dashboard'));
cb(null, require('./routes/IndexPage'));
});
},
},
{
path: '/users',
name: 'UsersPage',
getComponent(nextState, cb) {
require.ensure([], (require) => {
registerModel(app, require('./models/users'));
cb(null, require('./routes/Users'));
});
},
},
];
return <Router history={history} routes={routes} />;
}
- 使用dynamic
mport dynamic from "dva/dynamic";
import app from "../app";
export const UserPageDynamic = dynamic({
app,
models: () => [import("../models/user")],
component: () => import("../routes/UserPage")
});
2.使用model共享全局信息
从业务场景来说,有不少场景是可以做全局model的,比如说,我们在路由之间前进后退,model可以用于在路由间共享数据,比较典型的,像列表页和详情页的互相跳转,就可以用同一份model去共享它们的数据。
注意,如果当前应用中加载了不止一个model,在其中一个的effect里面做select操作,是可以获取另外一个中的state的:
*foo(action, { select }) {
const { a, b } = yield select();
}
3.跨model的通信
父容器A,子容器B,二者各自connect了不同的model A和B
父容器中有一个操作,分三个步骤:
model A中某个effect处理第一步
call model B中的某个effect去处理第二步
第二步结束后,再返回model A中做第三步
yield call({ type: 'a/foo' });
yield call({ type: 'b/foo' });
yield call({ type: 'a/bar' });