使用RxJS管理React应用状态的介绍


当前第2页 返回上一页

1

2

3

dispatch("count", {

  type: "plus"

})

异步数据

RxJS的一大优势就在于能够统一同步和异步,使用observable处理数据你不需要关注同步还是异步。

下面的例子我们使用操作符frompromise转换为observable

指定observable作为状态的初始值(首次推送数据)

1

2

3

4

5

6

7

8

9

const todos$ = state({

  name: "todos",

     

  // `observable`推送的数据将作为状态的初始值

  initial: from(getAsyncData())

     

  //...

   

});

producer推送observable

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

const todos$ = state({

  name: "todos",

     

  defaultValue: []

     

  // 数据推送的生产者函数

  producer(next, value, action) {

    switch (action.type) {

      case "getAsyncData":

        next(

          from(getAsyncData())

        );

        break;

    }

  }

});

执行getAsyncData之后,from(getAsyncData())的推送数据将成为状态的最新值。

衍生状态

由于状态todos$是一个observable,所以可以很自然地使用RxJS操作符转换得到另一个新的observable。并且这个observable的推送来自todos$;也就是说只要todos$推送新数据,它也会推送;效果类似于Vue的计算属性。

1

2

3

4

5

6

7

8

9

10

// 未完成任务数量

const undoneCount$ = todos$.pipe(

  map(todos => {

    let _conut = 0;

    todos.forEach(item => {

      if (!item.check) ++_conut;

    });

    return _conut;

  })

);

React视图渲染

我们可能会在组件的生命周期内订阅observable得到数据渲染视图。

1

2

3

4

5

6

7

8

9

class Todos extends React.Component {

  componentWillMount() {

    todos$.subscribe(data => {

      this.setState({

        todos: data

      });

    });

  }

}

我们可以再优化下,利用高阶组件封装一个装饰器函数@subscription,顾名思义,就是为React组件订阅observable以响应推送数据的变化;它会将observable推送的数据转换为React组件的props

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

@subscription({

  todos: todos$

})

class TodoList extends React.Component {

  render() {

    return (

      <p className="todolist">

        <h1 className="header">任务列表</h1>

        {this.props.todos.map((item, n) => {

          return <TodoItem item={item} key={item.desc} />;

        })}

      </p>

    );

  }

}

总结

使用RxJS越久,越令人受益匪浅。

  • 因为它基于observable序列提供了较高层次的抽象,并且是观察者模式,可以尽可能地减少各组件各模块之间的耦合度,大大减轻了定位BUG和重构的负担。
  • 因为是基于observable序列来编写代码的,所以遇到复杂的业务场景,总能按照一定的顺序使用observable描述出来,代码的可读性很强。并且当需求变动时,我可能只需要调整下observable的顺序,或者加个操作符就行了。再也不必因为一个复杂的业务流程改动了,需要去改好几个地方的代码(而且还容易改出BUG,笑~)。

所以,以上基于RxJS的状态管理方案,对我们来说是一个必需品,因为我们项目中大量使用了RxJS,如果状态数据也是observable,对我们抽象可复用可扩展的业务模型是一个非常大的助力。当然了,如果你的项目中没有使用RxJS,也许ReduxMobx是更合适的选择。

这套基于RxJS的状态管理方案,我们已经用于开发公司的商用项目,反馈还不错。所以我们决定把这套方案整理成一个js lib,取名为:Floway,并在github上开源:

  • github源码:https://github.com/shayeLee/floway
  • 使用文档:https://shayelee.github.io/floway

【相关推荐:react视频教程】

以上就是使用RxJS管理React应用状态的介绍的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

javascript中map方法怎么用

javascript中的arguments对象的用法介绍

javascript怎么实现按钮点击进行跳转

layui怎么固定表格的表头

节流阀和去抖动的基本实现方法介绍

javascript实现继承的方式有哪些

javascript怎么将字符串转小写

javascript怎么判断是否数字

如何提取图片的主题色?

了解javascript有必要使用服务端渲染吗

更多相关阅读请进入《mobx》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...