19 - Dva框架基础

基本概述

Dva特征

  1. 框架性:
    1. 是完整的应用开发框架,而不是针对某个特定问题的插件
    2. 自动集成了redux,router等常用插件,并进行良好的集成配置
    3. 可以直接在框架基础上完成业务开发工作
  2. 规范性:
    1. 定义了项目中各类文件的物理组织形式
    2. 定义了各个部件在项目的逻辑结合方式
    3. 定义了数据和页面的访问与使用方式
  3. 简化性:
    1. 对集成的多个插件进行了二次封装,简化直接使用原生插件的操作过程

与create-react-app脚手架对比

  1. 默认集成更多更常用的插件
  2. 更规范的项目文件组织形式
  3. 更便利的插件使用接口

项目文件结构说明

  1. mock[fold]: 模拟数据文件存放路径
  2. src/assets[fold]: 图片等附件文件存放路径
  3. src/componenets[fold]: 功能组件存放路径,通常一个功能组件是一个子文件夹里边包含构成组件jsx,css以及js文件
  4. src/models[fold]: 数据模型文件
  5. src/routes[fold]: 容器组件存放路径,通常一个容器组件是一个子文件夹里边包含构成组件jsx,css以及js文件
  6. src/service[fold]: 数据模型调用的逻辑层方法存放路径,如网络请求逻辑代码,业务处理逻辑代码
  7. src/utils[fold]: 通用工具函数存放路径,如网络请求帮助类,字符串处理帮助类等
  8. src/index.css: 主页面样式文件
  9. src/index.js:
    1. 程序运行的入口
    2. model、路由信息以及其他信息与主程序的集成关系配置文件,类似manifest.xml文件
  10. src/router.js:主页面的路由表
  11. roadhogrc.mock.js: 模拟数据集成配置文件

dva概念关系图

在这里插入图片描述

注意事项

  1. 严格意义上,功能组件与model没有逻辑上的一一对应关系或者结构上的集成/组合关系
  2. 功能组件与model只有消息传递的通讯关系,即:
    1. 功能组件将页面数据和操作请求分发给指定model
    2. 功能组件从指定顶model中获得数据并进行UI展示

dva开发设计要求

主程序与容器组件路由挂接

  1. 主页面的html有且只有个一个根html元素
  2. 通过配置路由实现主界面中页面的切换,(实质是容器组件的条件加载)

容器组件与功能组件分离

  1. 容器组件向上与路由表对应实现页面切换
  2. 容器组件向下与功能组件组合实现功能的集成
  3. 一般情况下容器组件,自身不带有状态数据(state),状态数据统一交给redux空间中间models管理
  4. 一般情况下容器组件,自身不带有业务逻辑操作或交互监听函数,具体的业务逻辑操作推迟到功能组件中实现

功能组件与Model分离

  1. 功能组件对外提供特定UI展示结果,包括html元素结构和css样式等
  2. 功能组件自身监听各个子元素的响应事件,如button-clicked,form-submit
  3. 功能组件自身不含状态数据(state),状态数据统一交给redux空间中间models管理
  4. 功能组件自身的监听函数,不应改带有业务逻辑性,只需要考虑将页面收集的参数(数据或操作指令)合理、合规、合时地传递给models
  5. 功能组件需要负责将models中对应的数据正确地渲染到UI中

Model与基础操作分离

  1. 所有的models都应该受到redux统一管理,而不应该与组件发生直接关系
  2. models中必须包含命名空间(namespace),即当前model存放在redux空间中的变量名,也是外部访问reducer,effect的限定
  3. models中应该包含内部状态数据(state),即当前models要管理操作的数据,类似OOP中的成员变量
  4. models中应该包含转发处理器(reducer),即接收处理并转发由功能组件传来的数据和操作指令
  5. models中可以包括副作用器(effect),用于处理异步数据操作
  6. models中可以包括监听器(subscriptions),监听全局事件并进行相应处理,如页面缩放,键盘输入等
  7. models中的reducer,subscriptions一般情况下只进行简单的state更新操作,
    1. 复杂的业务逻辑建议推迟到servivce中实现
    2. 固定的调用过程建议推迟到utils中实现
  8. models中的effect,一般情况下只是执行基本异步操作和调用对应的reducer方法
    1. 复杂的业务逻辑应在对应的reducer内部实现
    2. 固定的调用过程建议推迟到utils中实现

脚手架安装与使用

基本使用

安装脚手架项目

npm install dva-cli -g //全局安装脚手架

dva -v //查看当前dva版本号

创建空白项目

PS E:\Space_Web> dva new 11-hello-dva //在指定路径下创建一个名为11-hello-dva的项目(文件夹形式)

[注意] 对于版本高于0.10.1的dva框架,在构建空白项目时,npm会报错说dva过时,建议改用umi框架。此问题可以忽略,继续构建

dva-cli is deprecated, please use create-umi instead, checkout https://umijs.org/guide/create-umi-app.html for detail.
如果你是蚂蚁金服内部用户,请使用 bigfish 创建项目,详见 https://bigfish.alipay.com/ 。

运行项目

npm start 
  1. 调试过程中支持热更新,修改代码后不用重新启动项目
  2. 调试插件不是webapppack,控制台显示,调试项目地址可能与传统react项目不同

打包项目

nmp build
  1. 打包完成后会在项目文件中生成dist文件夹
  2. dist文件夹的网页内容必须在静态服务器中才可正常加载

集成AntD

  1. 安装antD 和 babel插件
npm install antd babel-plugin-import --save
  1. 配置集成:修改项目中的.webpackrc文件,修改结果如下
{
    "extraBabelPlugins": [
        ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }]
        ]
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MOEA-DVA是一种多目标优化算法,它基于向量评分函数和动态变异策略,可以用于解决多目标优化问题。以下是一个Python实现的MOEA-DVA算法的代码示例: ```python import numpy as np def moea_dva(pop_size, num_obj, num_var, max_gen, f, g, xl, xu): # 初始化种群 pop = np.random.rand(pop_size, num_var) * (xu - xl) + xl # 初始化权重向量 w = np.random.rand(pop_size, num_obj) w = w / np.tile(np.sum(w, axis=1)[:, None], (1, num_obj)) # 初始化参考点 z = np.min(f(pop), axis=0) # 开始迭代 for gen in range(max_gen): # 计算适应度 fit = np.sum(w * (f(pop) - z), axis=1) # 计算变异概率 p = np.exp(-fit) p = p / np.sum(p) # 选择父代 idx = np.random.choice(pop_size, 2, p=p) p1 = pop[idx[0], :] p2 = pop[idx[1], :] # 变异 beta = 0.5 * (1 + 2 * np.random.rand(num_var)) beta[beta > 1] = 2 - beta[beta > 1] beta[beta < 0] = 0 c1 = 0.5 * ((1 + beta) * p1 + (1 - beta) * p2) c2 = 0.5 * ((1 - beta) * p1 + (1 + beta) * p2) # 交叉 cr = 0.5 * (1 + np.random.rand(num_var)) cr[cr > 1] = 2 - cr[cr > 1] cr[cr < 0] = 0 c = np.zeros((2, num_var)) c[0, :] = cr * c1 + (1 - cr) * c2 c[1, :] = (1 - cr) * c1 + cr * c2 # 修剪 c[c < xl] = xl[c < xl] c[c > xu] = xu[c > xu] # 更新参考点 z = np.min(np.vstack((z, f(c))), axis=0) # 更新种群 pop = np.vstack((pop, c)) w = np.vstack((w, np.random.rand(2, num_obj))) w = w / np.tile(np.sum(w, axis=1)[:, None], (1, num_obj)) idx = np.argsort(np.sum(w, axis=0)) pop = pop[idx[:pop_size], :] w = w[idx[:pop_size], :] # 返回最终种群 return pop ``` 其中,pop_size是种群大小,num_obj是目标函数个数,num_var是决策变量个数,max_gen是最大迭代次数,f是目标函数,g是约束函数,xl和xu是决策变量的上下界。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值