【react框架之dvajs】dva数据流你可能还不知道的subscriptions隐藏的秘密

news/2024/11/6 21:44:46/

Subscriptions 是一种从 源 获取数据的方法,它来自于 elm。 语义是订阅,用于订阅一个数据源,然后根据条件 dispatch 需要的 action。数据源可以是当前的时间、服务器的 websocket连接、keyboard 输入、geolocation 变化、history 路由变化等等。

简单点说,就是在里面写的方法,在页面一加载的时候就会执行。

  • 方法是普通函数,不能是getor函数
  • 实参有dispatch/history两个属性
  • history:包含路由跳转监听的history对象
  • dispatch: 派发reducer里面的同步方法

实现效果

请添加图片描述

代码分析

import key from "keymaster";const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
export default {namespace: "products",state: {count: 0,lists: [{ name: "dva", id: 1 },{ name: "antd", id: 2 },],},// 同步更新的方法reducers: {delete(state, { id }) {return {...state,lists: state.lists.filter((item) => item.id !== id),};},addCount(state) {return { ...state, count: state.count + 1 };},minusCount(state) {return { ...state, count: state.count - 1 };},},effects: {// *addCountAsync(action, effects) {//   const { put, select, call } = effects;//   const data = yield select();//   console.log("我被点击了");//   yield call(delay, 2000);//   yield put({ type: "addCount" });// },// 设置不同类型的监听器,监听器类型有takeLatest, takeEvery, throttle, debounceaddCountAsync: [function* (action, effects) {const { put, call } = effects;yield call(delay, 2000);yield put({ type: "addCount" });},{type: "takeLatest",},],*minusCountAsync(action, effects) {const { put, call } = effects;yield call(delay, 2000);yield put({ type: "minusCount" });},},subscriptions: {async init(params) {const { dispatch } = params;console.log("初始化被执行了", params);await delay(2000);dispatch({ type: "addCount" });},setup(params) {console.log("订阅被执行了", params);},keyEvent({ dispatch }) {key("⌘+up, ctrl+up", () => {dispatch({ type: "addCount" });});key("⌘+down, ctrl+down", () => {dispatch({ type: "minusCount" });});},},
};

页面初始化后,自动diapatchaddCount方法。数据+1。

另外我们也注册了键盘事件keyEvent

请添加图片描述

  • 注意点
    • init及setup都只会初始化执行一次,后续不会再执行
    • 要做路由监听,需要使用history.listen,第一次会执行,之后每次路由切换的时候都会调用。

请添加图片描述
可以在这里做针对页面切换时的业务处理。对location进行结构,获取pathname,对具体的路由进行监测即可。

async init(params) {const { dispatch, history } = params;console.log("初始化被执行了", params);await delay(2000);dispatch({ type: "addCount" });// 返回一个函数,用于在组件卸载时取消监听const unListen = history.listen((location) => {if (location.pathname === "/product") {dispatch({ type: "addCount" });//  移除监听unListen();}console.log("监听被执行了", location);});
}

请添加图片描述


http://www.ppmy.cn/news/1544886.html

相关文章

机器学习—前向传播的一般实现

可以写一个函数来实现一个密集的层,那是神经网络的单层,所以定义稠密函数,它将上一层的激活作为输入以及给定层神经元的参数w和b。看下边图片所展示的例子,把所有这些权重向量堆叠成一个矩阵,wnp.array([[1,-3,5][2,4,…

机器学习,生成式Ai ,LLM大模型,人工智能,他们之间的关系是什么?有什么不同?

这些概念都是现代计算机科学和人工智能领域的重要组成部分,它们之间既有联系,也有区别。以下是它们的关系和不同之处: 人工智能 (AI) 人工智能是一个广义的概念,指的是计算机系统能够执行通常需要人类智能才能完成的任务&#x…

MySQL数据库的使用

一 关系数据库基本概念 关系数据库是一种使用关系模型来组织和管理数据的数据库。它使用了一种称为表的结构来存储数据,并通过表之间的关系来描述数据之间的联系。每个表由一组行和列组成,每一行代表一个记录,每一列代表一个属性。关系数据…

Go:接口和反射

接口 定义 在传统的面向对象的语言中,是会存在类和继承的概念的,但是Go并没有 那Go如何实现类似的方法呢?它提供了接口的概念,可以实现很多面向对象的特性 接口定义会实现一组方法集,但是这些方法不包含实现的代码…

【机器学习导引】ch4-决策树

基本流程 两个需要解决的问题 属性顺序: 问题:哪些属性在前面,哪些属性在后面?这个问题指的是在处理数据或进行排序时,需要确定属性的排列顺序,以便更好地进行数据处理或分析。 属性选择: 问题…

C++中,如何找到一个vector中最大的元素

动态规划中,经常需要找到一个线性表中最大的元素,C 最常用的是vector,而不是 C 中的数组,虽然结构更加复杂,但是用起来更方便。就连 C 创始人 Bjarne Stroustrup 都推荐使用vector,如下是《A Tour of C Thi…

什么是分布式光伏发电?设备构成、应用形式讲解

分布式光伏发电系统,又称分散式发电或分布式供能,是指在用户现场或靠近用电现场配置较小的光伏发电供电系统,以满足特定用户的需求,支持现存配电网的经济运行,或者同时满足这两个方面的要求。 分布式光伏发电由哪些设备…

python-21-理解python切片这一概念

python-21-理解python切片这一概念 一.简介 在python基础系列还有一个概念,python切片,切片这一使用频率特别多,大量python实例、真实项目中也是频繁出现,所以把这一概念单独整理出来,以便大家学习和复习&#xff01…