| translateHelp | true |
|---|
整合 dva 数据流。
配置开启。
包含以下功能,
- 内置 dva,默认版本是
^2.6.0-beta.20,如果项目中有依赖,会优先使用项目中依赖的版本。 - 约定是到 model 组织方式,不用手动注册 model
- 文件名即 namespace,model 内如果没有声明 namespace,会以文件名作为 namespace
- 内置 dva-loading,直接 connect
loading字段使用即可 - 支持 immer,通过配置
immer开启
符合以下规则的文件会被认为是 model 文件,
src/models下的文件src/pages下,子目录中 models 目录下的文件src/pages下,所有 model.ts 文件
比如:
+ src
+ models/a.ts
+ pages
+ foo/models/b.ts
+ bar/model.ts其中 a.ts,b.ts 和 model.ts 如果其内容是有效 dva model 写法,则会被认为是 model 文件。
默认,上一小节的找到的文件,会做一次校验,校验通过后,才会被添加到最终到 dva model 列表。
一些示例,
// 通过
export default { namespace: 'foo' };
export default { reducers: 'foo' };
// 通过
const model = { namespace: 'foo' };
export default model;
// 通过,支持 dva-model-extend
import dvaModelExtend from 'dva-model-extend';
export default dvaModelExtend(baseModel, {
namespace: 'foo',
});
// 通过
export default <Model>{ namespace: 'foo' };
// 不通过
export default { foo: 'bar' };比如:
export default {
dva: {
immer: true,
hmr: false,
},
}- Type:
boolean - Default:
false
是否跳过 model 验证。
- Type:
string[] - Default:
[]
配置额外到 dva model。
- Type:
boolean - Default:
false
表示是否启用 immer 以方便修改 reducer。
- Type:
boolean - Default:
false
表示是否启用 dva model 的热更新。
常用方法可从 umi 直接 import。
比如:
import { connect } from 'umi';接口包含,
绑定数据到组件。
获取 dva 实例,即之前的 window.g_app。
hooks 的方式获取 dispatch,dva 为 2.6.x 时有效。
hooks 的方式获取部分数据,dva 为 2.6.x 时有效。
hooks 的方式获取 store,dva 为 2.6.x 时有效。
查看项目中包含了哪些 model。
$ umi dva list model通过 umi 导出类型:ConnectRC,ConnectProps,Dispatch,Action,Reducer,Effect,Subscription,和所有 model 文件中导出的类型。
import { Effect, Reducer, Subscription } from 'umi';
export interface IndexModelState {
name: string;
}
export interface IndexModelType {
namespace: 'index';
state: IndexModelState;
effects: {
query: Effect;
};
reducers: {
save: Reducer<IndexModelState>;
};
subscriptions: { setup: Subscription };
}
const IndexModel: IndexModelType = {
namespace: 'index',
state: {
name: '',
},
effects: {
*query({ payload }, { call, put }) {
},
},
reducers: {
save(state, action) {
return {
...state,
...action.payload,
};
},
},
subscriptions: {
setup({ dispatch, history }) {
return history.listen(({ pathname }) => {
if (pathname === '/') {
dispatch({
type: 'query',
})
}
});
}
}
};
export default IndexModel;import React, { FC } from 'react';
import { IndexModelState, ConnectProps, Loading, connect } from 'umi';
interface PageProps extends ConnectProps {
index: IndexModelState;
loading: boolean;
}
const IndexPage: FC<PageProps> = ({ index, dispatch }) => {
const { name } = index;
return <div >Hello {name}</div>;
};
export default connect(({ index, loading }: { index: IndexModelState; loading: Loading }) => ({
index,
loading: loading.models.index,
}))(IndexPage);或者
import React from 'react';
import { IndexModelState, ConnectRC, Loading, connect } from 'umi';
interface PageProps {
index: IndexModelState;
loading: boolean;
}
const IndexPage: ConnectRC<PageProps> = ({ index, dispatch }) => {
const { name } = index;
return <div >Hello {name}</div>;
};
export default connect(({ index, loading }: { index: IndexModelState; loading: Loading }) => ({
index,
loading: loading.models.index,
}))(IndexPage);检查:
- dva 配置有没有开启,该插件是配置开启的
- 有没有有效的 dva model,可通过执行
umi dva list model检查,或者执行umi g tmp后查看src/.umi/plugin-dva/dva.ts中检查 model 注册情况
以及 tsconfig.json 等定义问题,参考 FAQ#import from umi 没有定义怎么办?
配置 dva: { skipModelValidate: true } 关闭 dva 的 model 校验。