当前位置: 首页 > news >正文

react dva 复习subscriptions: setup

  • Flux,单向数据流方案,以 Redux 为代表
  • Reactive,响应式数据流方案,以 Mobx 为代表

dva = React-Router + Redux + Redux-saga

 

import dva from 'dva';

const App = () => <div>Hello dva</div>;

 

// 创建应用

const app = dva();

// 注册视图

app.router(() => <App />);

// 启动应用

app.start('#root');

 

 

// 继承react-redux

mport { connect } from 'dva';

 

function mapStateToProps(state) {

return { todos: state.todos };

}

connect(mapStateToProps)(App);

 

 

/// dva最简单模型

 

// 创建应用

const app = dva();

 

// 注册 Model

app.model({

namespace: 'count',

state: 0,

reducers: {

add(state) { return state + 1 },

},

effects: {

*addAfter1Second(action, { call, put }) {

yield call(delay, 1000);

yield put({ type: 'add' });

},

},

});

 

// 注册视图

app.router(() => <ConnectedApp />);

 

// 启动应用

app.start('#root');

 

 

// 数据层modle

app.model

dva 提供 app.model 这个对象,所有的应用逻辑都定义在它上面。

 

const app = dva();

 

// 新增这一行

app.model({ /**/ });

 

app.router(() => <App />);

app.start('#root');

// modle对象的例子

 

Model 对象的例子

{

namespace: 'count',

state: 0,

reducers: {

add(state) { return state + 1 },

},

effects: {

*addAfter1Second(action, { call, put }) {

yield call(delay, 1000);

yield put({ type: 'add' });

},

},

}

 

 

// 属性

Model 对象的属性

namespace: 当前 Model 的名称。整个应用的 State,由多个小的 Model 的 State 以 namespace 为 key 合成

state: 该 Model 当前的状态。数据保存在这里,直接决定了视图层的输出

reducers: Action 处理器,处理同步动作,用来算出最新的 State

effects:Action 处理器,处理异步动作

#

 

call 和 put

dva 提供多个 effect 函数内部的处理函数,比较常用的是 call 和 put。

 

call:执行异步函数

put:发出一个 Action,类似于 dispatch

#

 

 

剧透:dva 是个函数,返回一了个 app 的对象。

 

剧透2:目前 dva 的源码核心部分包含两部分,dva 和 dva-core。前者用高阶组件 React-redux 实现了 view 层,后者是用 redux-saga 解决了 model 层。

 

 

setupApp(app) 是从 dva 里传过来的,主要是使用 patchHistory 函数代理 history.linsten,即强化了 redux 和 router 的联系,是的路径变化可以引起 state 的变化,进而听过监听 state 的变化来触发回调。

 

这也是 core 中唯一使用 this 的地方,逼得 dva 中必须使用 oldStart.call(app) 来进行调用。

 

// Setup app

setupApp(app);

 

// Run subscriptions

const unlisteners = {};

for (const model of this._models) {

if (model.subscriptions) {

unlisteners[model.namespace] = runSubscription(model.subscriptions, model, app, onError);

}

}

setup用来监听变化router变化

subscriptions: {

setup({ dispatch, history }) {

history.listen((location) => {

if (location.pathname === '/stock/reportDiff') {

dispatch({

type: 'queryDepot',

payload: { ...location.query, rows: 10 },

});

dispatch({

type: 'queryDate',

payload: {},

});

}

});

},

},

 

 

 

 

相关文章:

  • pm2 pm2 --help 使用指南
  • 驳斥一些不看好Flash的观点
  • eruda . 移动端console输出日志调试工具
  • referer
  • 2006年3GSM全球大会10佳手机
  • H5 postMessage方法 以及监听
  • 浏览器和node某方面执行顺序不一样
  • 大餐还是鸡肋?让我们谈谈Flash Lite
  • gulp中的同步异步问题
  • 小试一把 64 位 Windows 编程
  • 什么是options请求?为什么会有options请求?
  • 网站完全恢复
  • rel=noopener可以提升性能
  • node.js开发:nodemon
  • 网站备份策略
  • 【个人向】《HTTP图解》阅后小结
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CentOS 7 防火墙操作
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Docker 笔记(2):Dockerfile
  • IDEA常用插件整理
  • input的行数自动增减
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java多线程(4):使用线程池执行定时任务
  • Java精华积累:初学者都应该搞懂的问题
  • PHP变量
  • vue脚手架vue-cli
  • vue自定义指令实现v-tap插件
  • 和 || 运算
  • 前端知识点整理(待续)
  • 区块链技术特点之去中心化特性
  • 使用parted解决大于2T的磁盘分区
  • 微服务核心架构梳理
  • 微信小程序填坑清单
  • 微信支付JSAPI,实测!终极方案
  • 详解移动APP与web APP的区别
  • 阿里云移动端播放器高级功能介绍
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #include<初见C语言之指针(5)>
  • #pragma 指令
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (30)数组元素和与数字和的绝对差
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (三)Honghu Cloud云架构一定时调度平台
  • (推荐)叮当——中文语音对话机器人
  • (五)MySQL的备份及恢复
  • (循环依赖问题)学习spring的第九天
  • (转)一些感悟
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ***详解账号泄露:全球约1亿用户已泄露
  • .aanva
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core WebAPI中封装Swagger配置