通过dva-model-extend实现 dva 动态生成 model

前言

实现通过单个component 单个router通过相应的标识对应产生不同model实现数据包分离,model namespce将会覆盖基础的Model,其中的model[state|subscriptions|effects|reducers] 将通过Object.assign进行复制( Object.assign({},obj,obj1) )将源对象里面的属性添加到目标对象中去,若两者的属性名有冲突,后面的将会覆盖前面的。

背景

在子路由中动态导入model, 因为model比较大, 需要在这个子页面加载的时候加载model, 另外这个可以通过modelExtend 动态生成model(即动态生成namespace)

在原文中的定义

The model.namespace will be overrided by latter model.
model[state|subscriptions|effects|reducers] will be merged as Object.assign.
model.state will be overrided be latter model if it isn‘t an object.

实例

1、通过history中的location 传唯一标识实现区别生成唯一的model的namespace

imoport BaseModel from ‘../model/BaseModel‘
import dynamic from ‘dva/dynamic‘;// 通过dynamic实现动态加载路由、model
import modelExtend from ‘dva-model-extend‘;
const dynamicWrapperCreateNewModel = (app, component, history) => dynamic({
app,
models: () => [modelExtend(BaseModel, { namespace: `createNewModel-${history.location.state.id}` })],
component,
});

2、在路由列表中添加路由

{
name: ‘路由‘,
path: ‘BaseInstance‘,
component: dynamicWrapperCreateTab(app, () => import(‘../routes/OnlyRouter/BillBaseInstance‘), history),
},

3、在UI中添加connect 生成器 连接动态生成的model

@connect(state => ({
myModel: state[`createNewModel-${history.state.state.id}`],
}))

4.通过React-Router4.0 跳转机制跳转到到路由

通过Link的方式传递id

import { Link } from ‘dva/router‘;
<Link
to={{
pathname: this.props.path, // 传递path
state: { id: this.props.pathId }, 传递id 标识
}}
>

通过routerRedux的方式传递id

import { routerRedux } from ‘dva/router‘;
yield put(routerRedux.replace({
pathname: ‘/dashboard/BaseInstance‘,
state: { // 标识
id: ‘0B64AF10-F1D0-6CD0-647F-160C50326F9D‘,
},
}));

  

原文地址:https://www.cnblogs.com/fuGuy/p/9089935.html

时间: 2024-08-29 10:06:02

通过dva-model-extend实现 dva 动态生成 model的相关文章

jQuery动态生成&lt;select&gt;下拉框

前一阵在项目里需要动态生成下拉框,找了一下用jQuery实现比较方便,这里整理一下. 下文所述方法只是本人在项目中遇到问题的解决方法,场景较为简单,也希望能帮助有需要的朋友 1.动态生成下拉框的两种方式 (1)将数据放在model中,JSP页面用EL表达式${}取出,该方式缺点是数据更改时必须刷新整个页面,本文不过多描述. (2)就是本文要说的jQuery动态生成了,该方式适合数据频繁变动的场景. 2.<select>组成 <select> <option value=”aa

在JSP中动态生成随机验证码,登录时后台校验验证码,以及如何避免同一个验证码被重复提交爆破密码

只需几步就可以生成动态随机的验证码,最终效果如下图: 一 前台显示页面login.jsp 其中验证码显示的是一张图片,链接指向的是生成验证码的servlet,同时点击图片后触发changeImg()这个js函数,使其动态生成一个新的验证码,这个函数中的参数t=Math.random()并不会参与验证码的生成,它的作用仅仅只是表示每次提交的并不是同一个请求,需要单独处理,完整的login.jsp代码如下: <%@ page language="java" contentType=&

在后台代码中动态生成pivot项并设置EventTrigger和Action的绑定

最近在做今日头条WP的过程中,遇到需要动态生成Pivot项的问题.第一个版本是把几个频道写死在xaml里了,事件绑定也写在xaml里,每个频道绑定一个ObservableCollection<ArticleItem>.xaml中一个Pivot项的代码大体如下: <phone:PivotItem Header="热点"> <Grid Margin="12,0,0,0" > <Grid.RowDefinitions> &l

动态生成多级菜单

MVC5+EF6 入门完整教程13 -- 动态生成多级菜单 稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据model动态产生. 文章提纲 概述要点 && 理论基础 详细步骤 一.分析多级目录的html结构 二.根据html结构构建data model 三.根据data model动态生成树形结构 四.解析树形结构成html 总结 概述要点 &am

MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航

上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇文章我们要开发另一个实用组件:面包屑导航. 面包屑导航(BreadcrumbNavigation)这个概念来自童话故事"汉赛尔和格莱特",当汉赛尔和格莱特穿过森林时,不小心迷路了,但是他们发现在沿途走过的地方都撒下了面包屑,让这些面包屑来帮助他们找到回家的路.所以,面包屑导航的作用是告诉访问者他们目前在网站中的位置以及如何返回.(摘自百度百科) 要实现面包屑导航,也可以直接从nuget搜一些sitemap组件直接使用. 当然,和

MVC5+EF6 入门完整教程13 -- 动态生成多级菜单

稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据model动态产生. 文章提纲 概述要点 && 理论基础 详细步骤 一.分析多级目录的html结构 二.根据html结构构建data model 三.根据data model动态生成树形结构 四.解析树形结构成html 总结 概述要点 && 理论基础 要实现动态菜单,只要解决两个问题:

动态生成页面(二)

在上篇文章<动态生成页面(一)--ASP.NET中Literal使用>中,介绍了通过Literal容器动态加载页面.但在取值过程中遇到了一些问题.但是因为拼接的控件textbox为服务器控件,所以在取值过程中遇到一些问题. 几经周转,最后无奈改变了实现方法.直接实例化出控件,然后添加到页面中.具体实现过程如下: 前台页面: <body> <form id="form1" runat="server"> <div id=&qu

动态生成页面(一)——ASP.NET中Literal使用

在页面中加入内容时,假设是静态内容.无需使用容器,能够直接将标记作为HTML直接加入到页面中:可是,假设是动态内容,则必须借助容器将内容加入到页面中.典型的容器有:Label控件.Literal控件.Panel控件和PlaceHolder控件. 一.控件选择:Literal Literal控件与Lable控件的差别在于,Literal控件不向文本中加入不论什么HTML元素:而Label控件呈现一个span元素. Panel和PlaceHolder控件呈现为DIV元素.这将在页面上创建离散块,与L

MVC 根据模板动态生成静态页面

不是自己想出来的,找了好久没有找到相关的内容,根据源码发现 返回视图时时返回的ActionResult 类型的对象,然后执行ExecuteResult 方法,源码如下: 1 public override void ExecuteResult(ControllerContext context) 2 { 3 if (context == null) 4 { 5 throw new ArgumentNullException("context"); 6 } 7 if (string.Is