1.基本介绍

包含以下功能

  • 内置 dva,默认版本是^2.6.0-beta.20,如果项目中有依赖,会优先使用项目中依赖的版本。
  • 约定式的 model 组织方式,不用手动注册 model
  • 文件名即 namespace,model 内如果没有声明 namespace,会以文件名作为 namespace
  • 内置 dva-loading,直接 connectloading字段使用即可
  • 支持 immer,通过配置immer开启

    约定式的 model 组织方式

    符合以下规则的文件会被认为是 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 文件。

2.使用

2.1创建ui组件

  1. //pages/tag.tsx
  2. //创建ui组件
  3. import React, { FC } from 'react';
  4. import { connect } from 'umi';
  5. import { Button } from 'antd';
  6. type Iprops = {
  7. tag: any;
  8. };
  9. const Tag: FC<Iprops> = (props) => {
  10. const getHttpHandle = () => {
  11. const { dispatch }: any = props;
  12. //使用model,更新数据
  13. dispatch({
  14. //调用命名空间的某个方法
  15. type: 'tag/fetchTags',
  16. //需要传递的参数,这里可以传递一些发送请求所需要的参数
  17. payload: null,
  18. });
  19. };
  20. //获取请求数据,这里需要在函数外面获取数据,否则第一次点击按钮是没有数据的
  21. console.log(props.tag);
  22. return (
  23. <div>
  24. <h1>我是tag列表</h1>
  25. <Button type="primary" onClick={getHttpHandle}>
  26. 点击按钮,获取数据
  27. </Button>
  28. </div>
  29. );
  30. };

2.2创建model

  1. //在src根目录下新建models文件夹,这里是约定式
  2. //src/models/tag.ts
  3. import { Effect,request,Reducer} from 'umi'
  4. interface IndexModelState {
  5. name: string;
  6. }
  7. interface IndexModelType {
  8. namespace :string,
  9. state:{
  10. tagList:any[]
  11. },
  12. effects: {
  13. fetchTags: Effect
  14. },
  15. reducers:{
  16. setTagsList: Reducer<IndexModelState>;
  17. }
  18. }
  19. //获取数据
  20. const getHttpTags=()=>{
  21. return request('/api/tags')
  22. }
  23. const tagModel:IndexModelType= {
  24. //命名空间,调用model的时候,不要和其他的model重名,是唯一的
  25. namespace :'tag',
  26. //状态,跟React中的state类似,和Redux中保存的state一样
  27. state:{
  28. tagList:[]
  29. },
  30. //调用服务端的接口
  31. effects:{
  32. //这里有两个参数
  33. //payload接受一些传递过来的参数,例如表单提交
  34. //callback可以进行额外操作
  35. //call访问外部的方法
  36. //put将数据传递给reducer
  37. *fetchTags({payload,callback},{ put, call}){
  38. //第一个参数是外部函数,第二个参数是需要传递进函数的参数
  39. const res=yield call(getHttpTags)
  40. //将数据传递给reducers,更新状态
  41. yield put({
  42. //类似于redux中的action,表式这个是用来干嘛的
  43. type:'setTagsList',
  44. //需要传递的数据
  45. payload:res
  46. })
  47. }
  48. },
  49. //跟新state,是一个纯函数
  50. reducers:{
  51. //原来的状态
  52. setTagsList(state:any,action:any){
  53. //需要对状态进行改变
  54. return {...state, tagList:action.payload}
  55. }
  56. }
  57. }
  58. export default tagModel

2.3连接ui组件和model

  1. export default connect(
  2. //第一个参数是一个回调函数
  3. ({ tag }: any) => ({ tag }),
  4. )(Tag);