ant design pro 页面加载原理及过程,@connect 装饰器(有些不理解,在这里学习了,懂得多些,转载记录)

 以列表页中的标准列表为主

  

  Ant Design Pro 默认通过只需浏览器单方面就可处理的 HashHistory 来完成路由。如果要切换为 BrowserHistory,那在 src/index.js 中也有对应的内容可以直接修改,但需要在后端服务器进行相应路由配置。

 

二、详述


加载过程图

 

2.1、菜单→路由→组件

  在左侧的导航栏点击 列表页 > 标准列表 后,可以进入到上面截图所示的页面。导航栏的内容在 src/common/menu.js 中【或者服务获取的地址】

菜单:

 
  1. {

  2. name: '列表页',

  3. icon: 'table',

  4. path: 'list',

  5. children: [

  6. {

  7. name: '查询表格',

  8. path: 'table-list',

  9. },

  10. {

  11. name: '标准列表',

  12. path: 'basic-list',

  13. },

  14. //……

  15. ],

  16. },

路由

  全局的路由关系是:src/index.js 中通过 app.router(require('./router').default);,将 src/router.js 绑定到 dva 实例的 router 方法上。而在 src/router.js 中又引入了 src/common/router.js 中的 getRouterData 作为数据源。

  其实就是相当于:src/common/menu.js 中 path 所指向的路径对应于 src/common/router.js 中的路由记录。

 
  1. export const getRouterData = (app) => {

  2. const routerConfig = {

  3. ...,

  4. '/list/basic-list': {

  5. component: dynamicWrapper(app, ['list'], () => import('../routes/List/BasicList')),

  6. },

  7. ...,

  8. };

  9. ...

  10. }

  这里调用了同文件内的 lazy-loading 的动态加载函数 dynamicWrapper,有 3 个参数,app 为全局 dva 实例,models 为一个带有相关 dva Model 的 Array,component 即为该路由记录对应的实际组件。 

const dynamicWrapper = (app, models, component) => {...};

    可以看到:

    1、加载路由的时候,会动态加载当前文件下的model文件,也就是对应文件下的src/models/list.js

组件:

  src/routes/List/BasicList.js,具体组件。已省略部分代码

 
  1. import React, { PureComponent } from 'react';

  2. import { connect } from 'dva';

  3. //……

  4. import PageHeaderLayout from '../../layouts/PageHeaderLayout';

  5.  
  6. @connect(({ list, loading }) => ({

  7. list,

  8. loading: loading.models.list,

  9. }))

  10. export default class BasicList extends PureComponent {

  11. componentDidMount() {

  12. this.props.dispatch({

  13. type: 'list/fetch',

  14. payload: {

  15. count: 5,

  16. },

  17. });

  18. }

  19.  
  20. render() {

  21. return (

  22. <PageHeaderLayout>{/* 页面内容…… */}</PageHeaderLayout>

  23. );

  24. }

  25. }

 

2.2、@connect 装饰器

  组件写法中调用了 dva 所封装的 react-redux 的 @connect 装饰器,用来接收绑定的 list 这个 model 对应的 redux store。注意到这里的装饰器实际除了 app.state.list 以外还实际接收 app.state.loading 作为参数,这个 loading 的来源是 src/index.js 中调用的 dva-loading这个插件。

 
  1. /*

  2. * src/index.js

  3. */

  4. import createLoading from 'dva-loading';

  5. app.use(createLoading());

它返回的信息包含了 global、model 和 effect 的异步加载完成情况。

数据map一

 
  1. {

  2. "global": true,

  3. "models": {

  4. "list": false,

  5. "user": true,

  6. "rule": false

  7. },

  8. "effects": {

  9. "list/fetch": false,

  10. "user/fetchCurrent": true,

  11. "rule/fetch": false

  12. }

  13. }

注意到在这里带上 {count: 5} 这个 payload 向 store 进行了一个类型为 list/fetch 的 dispatch,在 src/models/list.js 中就可以找到具体的对应操作。 

 
  1. import { queryFakeList } from '../services/api';

  2.  
  3. export default {

  4. namespace: 'list',

  5.  
  6. state: {

  7. list: [],

  8. },

  9.  
  10. effects: {

  11. *fetch({ payload }, { call, put }) {

  12. const response = yield call(queryFakeList, payload);

  13. yield put({

  14. type: 'queryList',

  15. payload: Array.isArray(response) ? response : [],

  16. });

  17. },

  18. /* ... */

  19. },

  20.  
  21. reducers: {

  22. queryList(state, action) {

  23. return {

  24. ...state,

  25. list: action.payload,

  26. };

  27. },

  28. /* ... */

  29. },

  30. };

View中使用

1、connect使用

 
  1. @connect(({ list, loading }) => ({

  2. list,//①

  3. loading: loading.models.list,//②

  4. }))

  说明:

1、connect 有两个参数,mapStateToProps以及mapDispatchToProps,一个将状态绑定到组件的props一个将方法绑定到组件的props

2、代码①:将实体list中的state数据绑定到props,注意绑定的是实体list整体,使用时需要list.[state中的具体变量]

3、代码②:通过loading将上文“数据map一”中的models的list的key对应的value读取出来。赋值给loading,以方便使用,如表格是否有加载图标

 当然代码②也可以通过key value编写:loading.effects["list/fetch"]

2、变量获取

因,在src/models/list.js

 
  1. export default {

  2. namespace: 'list',

  3.  
  4. state: {

  5. list: [],

  6. },

故在view中使用

 
  1. render() {

  2. const { list: { list }, loading } = this.props;

说明:

  定义使用时:list: { list }  ,含义实体list下的state类型的list变量

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值