001-ant design pro 页面加载原理及过程,@connect 装饰器
一、概述
以列表页中的标准列表为主
Ant Design Pro 默认通过只需浏览器单方面就可处理的 HashHistory 来完成路由。如果要切换为 BrowserHistory,那在 src/index.js 中也有对应的内容可以直接修改,但需要在后端服务器进行相应路由配置。
二、详述
加载过程图
2.1、菜单→路由→组件
在左侧的导航栏点击 列表页 > 标准列表
后,可以进入到上面截图所示的页面。导航栏的内容在 src/common/menu.js
中【或者服务获取的地址】
菜单:
- {
- name: '列表页',
- icon: 'table',
- path: 'list',
- children: [
- {
- name: '查询表格',
- path: 'table-list',
- },
- {
- name: '标准列表',
- path: 'basic-list',
- },
- //……
- ],
- },
路由
全局的路由关系是: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
中的路由记录。
- export const getRouterData = (app) => {
- const routerConfig = {
- ...,
- '/list/basic-list': {
- component: dynamicWrapper(app, ['list'], () => import('../routes/List/BasicList')),
- },
- ...,
- };
- ...
- }
这里调用了同文件内的 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
,具体组件。已省略部分代码
- import React, { PureComponent } from 'react';
- import { connect } from 'dva';
- //……
- import PageHeaderLayout from '../../layouts/PageHeaderLayout';
- @connect(({ list, loading }) => ({
- list,
- loading: loading.models.list,
- }))
- export default class BasicList extends PureComponent {
- componentDidMount() {
- this.props.dispatch({
- type: 'list/fetch',
- payload: {
- count: 5,
- },
- });
- }
- render() {
- return (
- <PageHeaderLayout>{/* 页面内容…… */}</PageHeaderLayout>
- );
- }
- }
2.2、@connect 装饰器
组件写法中调用了 dva
所封装的 react-redux
的 @connect
装饰器,用来接收绑定的 list
这个 model 对应的 redux store。注意到这里的装饰器实际除了 app.state.list
以外还实际接收 app.state.loading
作为参数,这个 loading
的来源是 src/index.js
中调用的 dva-loading
这个插件。
- /*
- * src/index.js
- */
- import createLoading from 'dva-loading';
- app.use(createLoading());
它返回的信息包含了 global、model 和 effect 的异步加载完成情况。
数据map一
- {
- "global": true,
- "models": {
- "list": false,
- "user": true,
- "rule": false
- },
- "effects": {
- "list/fetch": false,
- "user/fetchCurrent": true,
- "rule/fetch": false
- }
- }
注意到在这里带上 {count: 5}
这个 payload 向 store 进行了一个类型为 list/fetch
的 dispatch,在 src/models/list.js
中就可以找到具体的对应操作。
- import { queryFakeList } from '../services/api';
- export default {
- namespace: 'list',
- state: {
- list: [],
- },
- effects: {
- *fetch({ payload }, { call, put }) {
- const response = yield call(queryFakeList, payload);
- yield put({
- type: 'queryList',
- payload: Array.isArray(response) ? response : [],
- });
- },
- /* ... */
- },
- reducers: {
- queryList(state, action) {
- return {
- ...state,
- list: action.payload,
- };
- },
- /* ... */
- },
- };
View中使用
1、connect使用
- @connect(({ list, loading }) => ({
- list,//①
- loading: loading.models.list,//②
- }))
说明:
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
- export default {
- namespace: 'list',
- state: {
- list: [],
- },
故在view中使用
- render() {
- const { list: { list }, loading } = this.props;
说明:
定义使用时:list: { list } ,含义实体list下的state类型的list变量
001-ant design pro 页面加载原理及过程,@connect 装饰器的更多相关文章
- Web访问原理-从输入URL到页面加载完成的过程中都发生了什么事情?
从输入URL到页面加载完成的过程中都发生了什么事情?--这是一个经典的面试题: 主要是关于计算机网络方面的知识基础,对于非科班计算机自学web开发的同学可能理解起来就很困难. StackOverFlo ...
- 从输入 URL 到页面加载完成的过程中都发生了什么事情?
这个问题是老生常谈的问题啦,虽然说到处百度都有的答案,还是希望自己能总结一下. 如今有很多答案,都是从硬件开始讲起,比如键盘的响应或者触屏的响应,然后CPU处理到OS的内核等等.这里不作为重点来讲,要 ...
- 从输入 URL 到页面加载完成的过程中都发生了什么
从输入 URL 到页面加载完成的过程中都发生了什么 过程描述 浏览器查找域名对应的 IP 地址: 浏览器根据 IP 地址与服务器建立 socket 连接: 浏览器与服务器通信: 浏览器请求,服务器处理 ...
- 从输入 URL 到页面加载完成的过程详解---【XUEBIG】
从输入 URL 到页面加载完成的过程中都发生了什么事情? 这是一道经典的面试题,涉及面非常广,要答出来并不困难,当要将问题回答好却不是那么容易 过程概述 浏览器查找域名对应的 IP 地址: 浏览器根据 ...
- 【转】 从输入 URL 到页面加载完成的过程中都发生了什么事情?
该问题总结 一. 往浏览器输入URL后给你一个页面,你天天在使用的东西,学过计算机网络的知道是怎么回事,就DNS解析然后页面的回馈,不过要讲好还是有难度. 之前fex团队的nwind专门写过这个问题的 ...
- http系列--从输入 URL 到页面加载完成的过程
一.前言 这道题的覆盖面可以非常广,很适合作为一道承载知识体系的题目.每一个前端人员,如果要往更高阶发展,必然会将自己的知识体系梳理一遍,没有牢固的知识体系,无法往更高处走! 二.主干流程 在将浏览器 ...
- Ant Design按需加载
不eject情况下配置antd按需加载 1.安装 react-app-rewired yarn add react-app-rewired 2. 项目根目录下新建 config-overrides.j ...
- [转]从输入url到页面加载完成的过程中都发生了什么事情
第一个问题:从输入 URL 到浏览器接收的过程中发生了什么事情? 从触屏到 CPU 首先是「输入 URL」,大部分人的第一反应会是键盘,不过为了与时俱进,这里将介绍触摸屏设备的交互. 触摸屏一种传感器 ...
- 从输入URL到页面加载完成的过程中都发生了什么事情?
为了便于理解,我将整个过程分为了六个问题来展开. 第一个问题:从输入 URL 到浏览器接收的过程中发生了什么事情? 从触屏到 CPU 首先是「输入 URL」,大部分人的第一反应会是键盘,不过为了与时俱 ...
随机推荐
- 数据库 数据库SQL语句四
多表查询 等值连接 --查询员工信息,员工号,姓名,月薪,部门名称 select e.empno,e.ename,d.dname from emp e,dept d where e.deptno=d. ...
- 安卓解析json
重点是开启网络权限 难点是调用函数 开启网络权限 </application> <uses-permission android:name="android.permiss ...
- JVM与外界通过数据通道进行数据交换
使用I/O流访问file中的内容. JVM与外界通过数据通道进行数据交换. 分类: 按流分为输入流和输出流: 按传输单位分为字节流和字符流: 还可以分为节点流和过滤流. 节点流:负责数据源和程序之间建 ...
- Unity5 AssetBundle打包加载及服务器加载
Assetbundle为资源包不是资源 打包1:通过脚本指定打包 AssetBundleBuild ab = new AssetBundleBuild ...
- error: Please reinstall the libcurl distribution - easy.h should be in <curl-dir>/include/curl/
运行php-5.3.10 --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --e ...
- CDialog与CDialogEx的区别联系
CDialogEx是VS2003之后出现的,VC++6.0没有.CDialogEx = CDialog ExtendExtend的意思是扩展,即扩展的CDialog! 这个类是CDialog的扩展类, ...
- MySQL--执行mysql脚本及其脚本编写
http://www.cnblogs.com/kex1n/archive/2010/03/26/2286504.html
- Android设计模式之单例模式的七种写法
一 单例模式介绍及它的使用场景 单例模式是应用最广的模式,也是我最先知道的一种设计模式.在深入了解单例模式之前.每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式 ...
- swift - UIView 设置背景色和背景图片
代码如下: let page = UIView() page.frame = self.view.bounds //直接设置颜色 page.backgroundColor = UIColor.gree ...
- ArcGIS GP应用-GP模型创建-缓冲区分析
一.参考资料 http://www.cnblogs.com/HPhone/archive/2012/11/05/2755974.html 二.关键步骤 1.缓冲分析数据源可以选择:点.面.线 2.构建 ...