umijs / umi

A framework in react community ✨
https://umijs.org
MIT License
15.39k stars 2.65k forks source link

[Feature Request] 增加 dva 的 onError 等的hook配置 #4233

Closed satanrabbit closed 4 years ago

satanrabbit commented 4 years ago

Background

在 umi@2.x (umi-plugin-dva)的版本上是通过 在 src 下的 plugins 目录默认可以扩展 dva 的,3.x (@umijs/plugin-dva)版本却取消了(不知道取消是何考虑?): umi-plugin-dva 源码中的 getPluginContent

  function getPluginContent() {
    const pluginPaths = globby.sync('plugins/**/*.{js,ts}', {
      cwd: paths.absSrcPath,
    });
    const ret = pluginPaths.map(path =>
      `
    app.use(require('../../${path}').default);
  `.trim(),
    ); 

但是在 @umijs/plugin-dva 中 Dva 的配置只有有限的几项,没法配置 onError, 导致没法托管捕获所有请求的错误或者在请求完成后处理数据时发生但未 put 更新 modal 的 state 前抛出的错误。

Proposal

在 @umijs/plugin-dva 增加配置项 onError 或者 plugins (包含 onError 或者其他hooks)(参照 umi-plugin-dva 实现难度应该不大吧);使dva的配置 设置为类似:

dva:{
  immer: true,
    onError(err){
      // ......
   }
}

或者

dva:{
  immer: true,
  plugins:[ {
    onError(err){
      // ......
      }
   }]
}

Additional context

umi@2.x 到 3.x的升级的跨度还是比较大的,使用 @umijs/plugin-request 和 @umijs/plugin-layout 等插件的学习成本比较高,自己封装的部分组件自己用起来还是比较顺手的,但是就缺少 dva 的 onError 的 hook 没法使用,导致很多问题没法解决。

xiexingen commented 4 years ago

附议 也遇到这个问题了

jackyr commented 4 years ago

+1,升级不够友好,文档少坑多。 关于这个问题,目前只能手动在应用入口处注册处理:

import { getDvaApp } from 'umi';

const app = getDvaApp();

app.use({
  onError (e) {
    e.preventDefault();
    // ...
  },
});
662 commented 4 years ago

+1,升级不够友好,文档少坑多。 关于这个问题,目前只能手动在应用入口处注册处理:

import { getDvaApp } from 'umi';

const app = getDvaApp();

app.use({
  onError (e) {
    e.preventDefault();
    // ...
  },
});

再入口文件app.ts中调用 getDvaApp 得到的是 undefined

daqi commented 4 years ago

https://github.com/umijs/umi/issues/4663