返回顶部
首页 > 资讯 > 精选 >Fish Redux中的Dispatch如何实现
  • 505
分享到

Fish Redux中的Dispatch如何实现

2023-06-04 07:06:48 505人浏览 泡泡鱼
摘要

这篇文章主要为大家展示了“Fish Redux中的Dispatch如何实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Fish Redux中的Dispatch如何实现”这篇文章吧。前言我们在使

这篇文章主要为大家展示了“Fish Redux中的Dispatch如何实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Fish Redux中的Dispatch如何实现”这篇文章吧。

前言

我们在使用fish-redux构建应用的时候,界面代码(view)和事件的处理逻辑(reducer,effect)是完全解耦的,界面需要处理事件的时候将action分发给对应的事件处理逻辑去进行处理,而这个分发的过程就是下面要讲的dispatch, 通过本篇的内容,你可以更深刻的理解一个action是如何一步步去进行分发的。

从example开始

为了更好的理解action的dispatch过程,我们就先以todolistpage中一条todo条目的勾选事件为例,来看点击后事件的传递过程,通过断点debug我们很容易就能够发现点击时候发生的一切,具体过程如下:

  1. 用户点击勾选框,GestureDetector的onTap会被回调

  2. 通过buildView传入的dispatch函数对doneAction进行分发,发现todo_component的effect中无法处理此doneAction,所以将其交给pageStore的dispatch继续进行分发

  3. pageStore的dispatch会将action交给reducer进行处理,故doneAction对应的_markDone会被执行,对state进行clone,并修改clone后的state的状态,然后将这个全新的state返回

  4. 然后pageStore的dispatch会通知所有的listeners,其中负责界面重绘的_viewUpdater发现state发生变化,通知界面进行重绘更新

Dispatch实现分析

Dispatch在fish-redux中的定义如下

typedef Dispatch = void Function(Action action);

本质上就是一个action的处理函数,接受一个action,然后对action进行分发。

下面我门通过源码来进行详细的分析。

0component->ComponentWidget->ComponentState->_mainCtx->_dispatch而 _mainCtx的初始化则是通过componet的createContext方法来创建的,顺着方法下去我们看到了dispatch的初始化

  1. // redux_component/context.dart DefaultContext初始化方法

  2.  DefaultContext({

  3.    @required this.factors,

  4.    @required this.store,

  5.    @required BuildContext buildContext,

  6.    @required this.getState,

  7.  })  : assert(factors != null),

  8.        assert(store != null),

  9.        assert(buildContext != null),

  10.        assert(getState != null),

  11.        _buildContext = buildContext {

  12.    final OnAction onAction = factors.createHandlerOnAction(this);

  13.    /// create Dispatch

  14.    _dispatch = factors.createDispatch(onAction, this, store.dispatch);

  15.    /// ReGISter inter-component broadcast

  16.    _onBroadcast =

  17.        factors.createHandlerOnBroadcast(onAction, this, store.dispatch);

  18.    registerOnDisposed(store.registerReceiver(_onBroadcast));

  19.  }

context中的dispatch是通过factors来进行创建的,factors其实就是当前component,factors创建dispatch的时候传入了onAction函数,以及context自己和store的dispatch。onAction主要是进行Effect处理。这边还可以看到,进行context初始化的最后,还将自己的onAction包装注册到store的广播中去,这样就可以接收到别人发出的action广播。

Component继承自Logic

  1. // redux_component/logic.dart

  2.  @override

  3.  Dispatch createDispatch(

  4.      OnAction onAction, Context<T> ctx, Dispatch parentDispatch) {

  5.    Dispatch dispatch = (Action action) {

  6.      throw Exception(

  7.          'Dispatching while appending your effect & onError to dispatch is not allowed.');

  8.    };

  9.    /// attach to store.dispatch

  10.    dispatch = _applyOnAction<T>(onAction, ctx)(

  11.      dispatch: (Action action) => dispatch(action),

  12.      getState: () => ctx.state,

  13.    )(parentDispatch);

  14.    return dispatch;

  15.  }

  16.    static Middleware<T> _applyOnAction<T>(OnAction onAction, Context<T> ctx) {

  17.    return ({Dispatch dispatch, Get<T> getState}) {

  18.      return (Dispatch next) {

  19.        return (Action action) {

  20.          final Object result = onAction?.call(action);

  21.          if (result != null && result != false) {

  22.            return;

  23.          }

  24.          //skip-lifecycle-actions

  25.          if (action.type is Lifecycle) {

  26.            return;

  27.          }

  28.          if (!shouldBeInterruptedBeforeReducer(action)) {

  29.            ctx.pageBroadcast(action);

  30.          }

  31.          next(action);

  32.        };

  33.      };

  34.    };

  35.  }

  36. }

Fish Redux中的Dispatch如何实现

上面分发的逻辑大概可以通过上图来表示

  1. 通过onAction将action交给component对应的effect进行处理

  2. 当effect无法处理此action,且此action非lifecycle-actions,且不需中断则广播给当前Page的其余所有effects

  3. 最后就是继续将action分发给store的dispatch(parentDispatch传入的其实就是store.dispatch)

0

  • // redux/create_store.dart


  •  final Dispatch dispatch = (Action action) {

  •    _throwIfNot(action != null, 'Expected the action to be non-null value.');

  •    _throwIfNot(

  •        action.type != null, 'Expected the action.type to be non-null value.');

  •    _throwIfNot(!isDispatching, 'Reducers may not dispatch actions.');


  •    try {

  •      isDispatching = true;

  •      state = reducer(state, action);

  •    } finally {

  •      isDispatching = false;

  •    }


  •    final List<_VoidCallback> _notifyListeners = listeners.toList(

  •      growable: false,

  •    );

  •    for (_VoidCallback listener in _notifyListeners) {

  •      listener();

  •    }


  •    notifyController.add(state);

  •  };

  • store的dispatch过程比较简单,主要就是进行reducer的调用,处理完成后通知监听者。

    0

  • // redux_component/component.dart


  •  Widget buildPage(P param) {

  •    return wrapper(_PageWidget<T>(

  •      component: this,

  •      storeBuilder: () => createPageStore<T>(

  •            initState(param),

  •            reducer,

  •            applyMiddleware<T>(buildMiddleware(middleware)),

  •          ),

  •    ));

  •  }


  • // redux_component/page_store.dart


  • PageStore<T> createPageStore<T>(T preloadedState, Reducer<T> reducer,

  •        [StoreEnhancer<T> enhancer]) =>

  •    _PageStore<T>(createStore(preloadedState, reducer, enhancer));


  • // redux/create_store.dart


  • Store<T> createStore<T>(T preloadedState, Reducer<T> reducer,

  •        [StoreEnhancer<T> enhancer]) =>

  •    enhancer != null

  •        ? enhancer(_createStore)(preloadedState, reducer)

  •        : _createStore(preloadedState, reducer);

  • 所以这里可以看到,当传入enhancer时,createStore的工作被enhancer代理了,会返回一个经过enhancer处理过的store。而PageStore创建的时候传入的是中间件的enhancer。

    1. // redux/apply_middleware.dart


    2. StoreEnhancer<T> applyMiddleware<T>(List<Middleware<T>> middleware) {

    3.  return middleware == null || middleware.isEmpty

    4.      ? null

    5.      : (StoreCreator<T> creator) => (T initState, Reducer<T> reducer) {

    6.            assert(middleware != null && middleware.isNotEmpty);


    7.            final Store<T> store = creator(initState, reducer);

    8.            final Dispatch initialValue = store.dispatch;

    9.            store.dispatch = (Action action) {

    10.              throw Exception(

    11.                  'Dispatching while constructing your middleware is not allowed. '

    12.                  'Other middleware would not be applied to this dispatch.');

    13.            };

    14.            store.dispatch = middleware

    15.                .map((Middleware<T> middleware) => middleware(

    16.                      dispatch: (Action action) => store.dispatch(action),

    17.                      getState: store.getState,

    18.                    ))

    19.                .fold(

    20.                  initialValue,

    21.                  (Dispatch previousValue,

    22.                          Dispatch Function(Dispatch) element) =>

    23.                      element(previousValue),

    24.                );


    25.            return store;

    26.          };

    27. }

    这里的逻辑其实就是将所有的middleware的处理函数都串到store的dispatch,这样当store进行dispatch的时候所有的中间件的处理函数也会被调用。下面为各个处理函数的执行顺序,

    Fish Redux中的Dispatch如何实现

    首先还是component中的dispatch D1 会被执行,然后传递给store的dispatch,而此时store的dispatch已经经过中间件的增强,所以会执行中间件的处理函数,最终store的原始dispatch函数D2会被执行。

以上是“Fish Redux中的Dispatch如何实现”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Fish Redux中的Dispatch如何实现

本文链接: https://lsjlt.com/news/236935.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Fish Redux中的Dispatch如何实现
    这篇文章主要为大家展示了“Fish Redux中的Dispatch如何实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Fish Redux中的Dispatch如何实现”这篇文章吧。前言我们在使...
    99+
    2023-06-04
  • linux中如何使用Fish
    这篇文章主要介绍了linux中如何使用Fish,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Fish(友好的交互式 shell)是一个智能且用户友好的命令行 shell,可在...
    99+
    2023-06-16
  • 如何实现react+redux的升级版todoList
    这篇文章主要为大家展示了“如何实现react+redux的升级版todoList”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现react+redux的升...
    99+
    2024-04-02
  • 微信小程序中如何实现Redux绑定
    这篇文章给大家分享的是有关微信小程序中如何实现Redux绑定的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。微信小程序Redux绑定实例安装clone或者下载代码库到本地:git&...
    99+
    2024-04-02
  • react的dispatch方法如何使用
    这篇文章主要介绍“react的dispatch方法如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react的dispatch方法如何使用”文章能帮助大家解决问题。react的dispatch...
    99+
    2023-07-04
  • React中如何使用Redux
    这篇文章主要讲解了“React中如何使用Redux”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React中如何使用Redux”吧!Redux 是一种状态容器 JS 库,提供可预测的状态管理...
    99+
    2023-07-02
  • react18中react-redux状态管理的实现
    react的状态管理还是挺多的现在流行的有以下五种: RecoilMobXXStateReduxContext 今天我们来讲一下react众多状态管理之一的redux,虽然这个我不太...
    99+
    2024-04-02
  • 实现redux, koa, express中间件的示例分析
    小编给大家分享一下实现redux, koa, express中间件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如果你...
    99+
    2024-04-02
  • 如何在React中直接使用Redux
    React中使用Redux 开始之前需要强调一下,redux和react没有直接的关系,你完全可以在React, Angular, Ember, jQuery, or vanilla...
    99+
    2022-11-13
    React使用Redux React Redux用法
  • react18中react-redux状态管理怎么实现
    这篇文章主要介绍“react18中react-redux状态管理怎么实现”,在日常操作中,相信很多人在react18中react-redux状态管理怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”rea...
    99+
    2023-06-30
  • 简易的redux createStore手写实现示例
    目录1.首先创建一个store2.其次创建一个my-redux书写getState()方法书写dispatch方法书写subscribe方法特别注意:3.创建一个Test组件进行检测...
    99+
    2022-11-13
    手写redux createStore redux createStore
  • 如何进行Redux的源码解析
    如何进行Redux的源码解析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。预热redux 函数内部包含了大量柯里化函数以及代码...
    99+
    2024-04-02
  • 在React-Native中如何持久化redux数据
    这篇文章主要为大家展示了“在React-Native中如何持久化redux数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在React-Native中如何持久...
    99+
    2024-04-02
  • React在组件中如何监听redux中state状态的改变
    目录在组件中监听redux中state状态的改变解决方式React和redux的状态处理在组件中监听redux中state状态的改变 解决方式 1、在组件中引入store 2、在co...
    99+
    2022-11-13
    React组件 监听state的改变 监听redux中state改变
  • redis中hash如何实现的
    这篇文章主要介绍redis中hash如何实现的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!0.前言redis是KV型的内存数据库, 数据库存储的核心就是Hash表, 我们执行sel...
    99+
    2024-04-02
  • css中的单选如何实现
    这篇文章主要介绍了css中的单选如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在css中,可以使用ra...
    99+
    2024-04-02
  • Java中的继承如何实现
    本篇内容主要讲解“Java中的继承如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的继承如何实现”吧!一. 继承众所周知,我们Java语言是一种面向对象的编程语言,每当我们提到J...
    99+
    2023-06-29
  • C++中的多态如何实现
    这篇文章主要介绍“C++中的多态如何实现”,在日常操作中,相信很多人在C++中的多态如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++中的多态如何实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-30
  • java中的多态如何实现
    在Java中实现多态的方式是通过方法的重写和方法的重载。多态是指相同的方法名在不同的类中具有不同的实现,使得可以通过父类引用指向子类...
    99+
    2024-03-14
    java
  • ZooKeeper中的事务如何实现
    在ZooKeeper中,事务是通过分布式原子性操作(Atomicity)实现的。ZooKeeper提供了一种称为“multi”操作的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作