Dva: 关于 [email protected] 和动态加载的问题

Created on 22 Jan 2017  ·  11Comments  ·  Source: dvajs/dva

由于 [email protected] 中引入了 app.unmodel 以及为 app.model 增加了冲突校验,不允许对相同的 namespace 注册多次 model,而动态加载路由需要多次执行 app.model,所以很多人升级到 1.2 时就出错了。

典型出错

bug

建议方案

在 router.js 里用一个辅助方法注册 model 。

const cached = {};
function registerModel(app, model) {
  if (!cached[model.namespace]) {
    app.model(model);
    cached[model.namespace] = 1;
  }
}

使用

registerModel(app, require('./models/users'));

参考

https://github.com/dvajs/dva-example-user-dashboard/commit/df2a7a0e1e7295840cfd2032a677f5e69c968c8a

faq

Most helpful comment

我这边报错是因为注册代码写了两次,

app.model(require("./models/users"));

// 2. Plugins
// app.use({});
app.use(createLoading());

// 3. Model
// app.model(require('./models/example'));
app.model(require('./models/users'))

All 11 comments

@sorrycc 使用辅助方法注册 model,在react-native 下(非动态加载)还是有问题。
android系统,点击返回键退出系统,重新进行系统就会报#465的问题。

@rendongsc model 是动态载入的吗? 重新进入系统为啥只执行 app.model 的代码呢?

不是动态载入的,重新进入系统为什么要再次执行app.model原因不清楚。

const cached = {};
function registerModel(app, model) {
  if (!cached[model.namespace]) {
    app.model(model);
    cached[model.namespace] = 1;
  }
}
const app = dva();
app.use(createLoading());
registerModel(app, Auth);
registerModel(app, Initial);
registerModel(app, Cooperate);
registerModel(app, Mail);
registerModel(app, Infomation);
app.router(() => <Router />);
export default app;

可以先加 try...catch 解决这个问题,有时间可以研究下为啥执行多次。

function registerModel(app, model) {
  try {
    app.model(model);
  } catch(e) {}
}

我这边报错是因为注册代码写了两次,

app.model(require("./models/users"));

// 2. Plugins
// app.use({});
app.use(createLoading());

// 3. Model
// app.model(require('./models/example'));
app.model(require('./models/users'))

@sorrycc 老师,想问下根据路由动态加载路由和在index.js上同时加载,性能相差会很大吗

@AsceticBoy 项目大的话会相差比较大,因为下载时间长了。

@sorrycc 大叔,我想请教一个问题:
比如我Main.js 内容如下

render() {
     return (
         <Header />    
             // 动态显示页面router
         <Bottom/>
     )
}

这个Main.js只是一个公共容器,包含公共的头部组件和底部组件,我需要在中间去动态的加载不同
页面的router请问该如何实现?还是说得另外建一个新的文件包含以上结构,然后在其中添加我所需要
加载页面的router ? 有没有这样一个动态加载页面router的方法,公用这一个Main.js的结构?

model.call(this, {
        namespace: '@@dva',
        state: 0,
        reducers: {
          UPDATE: function UPDATE(state) {
            return state + 1;
          }
        }
      });

Android 的 notify 进入 app ,这个 internal 的 namespace 无论如何都会被 inject, 因为 checkmodel 的原因,crash
这个外部还没有太好的办法 workaround
@sorrycc

@buhe 能否提供一个最小可复现代码 demo? 什么情况下会重复调用 app.start() ?

所以现在这问题还是依旧吗?

  • dva: 2.1.0
function registerModel(app, model) {
  try {
    app.model(model);
  } catch(e) {}
}

而不建议使用

const cached = {};
function registerModel(app, model) {
  if (!cached[model.namespace]) {
    app.model(model);
    cached[model.namespace] = 1;
  }
}

是这么理解吗?

Was this page helpful?
0 / 5 - 0 ratings