【mobx-入门与思考】

介绍

mobx 是 nodejs生态中的框架, 主要用于做状态管理,可以监控变量状态的变化。
nodejs中除了mobx,还有个redux,也是做状态管理的,都是比较成熟的框架,二者的选择可以参考 【nodejs状态管理: Redux VS Mobx】


mobx整体还是可用的,但还是忍不住吐槽下,

  • 官方文档,有些部分介绍的很抽象,有些tip和使用上,说了很多,但是很难理解,反而容易绕进去。
  • 越升级越不直观,mobx5→6 有些之前比较好用的语法糖反而没有了。

吐槽结束,下面继续

运行环境

前后端都能用,Nodejs环境 或 浏览器中都能用。

典型用法

import { makeObservable, observable, computed, action } from "mobx"class Doubler {valueconstructor(value) {makeObservable(this, {value: observable,double: computed,increment: action,})this.value = value}get double() {return this.value * 2}increment() {this.value++}
}

mobx 主旨

mobx用于状态变化管理,管理就涉及到 状态的改变 和 状态的监控,mobx根据实际场景,引申抽象了如下概念,

  1. Actions(动作)
  2. State(状态)
  3. Derivations(派生)
  4. Reactions (变化)

举个例子:

  • 场景:一款前端h5角色扮演小游戏,当你按上键的时候,看到主角向上移动,同时会记录移动的步数。

    这里向上移动就是Action,改变的是主角位置State,记录移动步数就是由State变化引起的Derivations派生,看到画面的变化就是Reactions。

木乃伊迷宫

四者关系

关系示意图

看图说话, Action导致State变化,影响Reactions。
如果有派生,则也会导致派生变化,最终影响Reactions。
从数据变化的角度 ,有2条路线

action → state → reaction
action → state → computed value → reaction

mobx 实践如何用

主旨和用法的对照

上面我们知道了 mobx的设计主旨, 看下对应mobx的实践使用。主旨中提到的4个部分,对应到mobx框架,以及代码里。

Action: mobx action
State:mobx observeable
Computed: mobx computed
Reactions: 这部分是要你自己组合的逻辑,比如数据变了,使用react或者vue进行新的页面渲染。

下面继续介绍下mobx框架中action,observeable,computed的使用示例。

示例

基础写法

import { observable, computed, action, makeObservable, autorun} from "mobx";class Doubler {value: number;constructor(value) {makeObservable(this, {value: observable,double: computed,increment: action,})this.value = value}get double() {return this.value * 2}increment() {this.value++}
}let d = new Doubler(1);
autorun(() => {console.log(`value changed to : ${d.value}`)console.log(`value.double changed to : ${d.double}`)
});
d.increment();

注意:建议对observable字段的修改(value),最好通过在action(increment)里面完成。

// 运行 npx tsx Doubler.ts ,输出
value changed to : 1
value.double changed to : 2
value changed to : 2
value.double changed to : 4

装饰器写法

import { observable, computed, action, autorun } from "mobx"class Doubler {@observable accessor valueconstructor(value) {this.value = value}@computedget double() {return this.value * 2}@actionincrement() {this.value++}}let d = new Doubler(1);
autorun(() => {console.log(`value changed to : ${d.value}`)
});
d.increment();

PS: 这种写法看起来最优雅,但是实际上autorun 捕捉不到第二次value的变化,不知道是我本地mobx库版本,还是ts编译的问题。 有知道的小伙伴,欢迎评论区留言。

自动装配


import { autorun, makeAutoObservable } from "mobx"function createDoubler(value) {return makeAutoObservable({value,get double() {return this.value * 2},increment() {this.value++}})
}let d = createDoubler(1);
autorun(() => {console.log(`value changed to : ${d.value}`)console.log(`value.double changed to : ${d.double}`)
});
d.increment();

import { autorun, makeAutoObservable } from "mobx"class Doubler {value = 1;get double() { return this.value * 2; }increment() { this.value++; }constructor() {makeAutoObservable(this);}
}let d = new Doubler();
autorun(() => {console.log(`value changed to : ${d.value}`)console.log(`value.double changed to : ${d.double}`)
});
d.increment();

当使用自动装配,不用显示的声明observable,computed,action等。 mobx会自动的根据函数的特征来判断,所有的属性都会被定义为observable,get开头的会被认为computed的,改变属性的函数被认为是action。

结语

以上便是对于mobx入门与思考,通过对mobx主旨的思考,掌握其主旨下对应的框架实现,以及基础使用。恭喜你,入门了!🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/674693.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Buuctf-Misc题目练习

打开后是一个gif动图,可以使用stegsolve工具进行逐帧看。 File Format:文件格式 Data Extract:数据提取 Steregram Solve:立体试图 可以左右控制偏移 Frame Browser:帧浏览器 Image Combiner:拼图,图片拼接 所以可以知道我们要选这个Frame Browser …

Pycharm远程同步的mapping与sync

用Pycharm进行项目远程部署的时候会遇到两个同步文件,一个是点击 tools—>deployment—>configration——>mapping 一个是链接虚拟环境的时候会有一个sync,那么这两种同步有什么区别呢? 区别就是,2包括1,要用…

力扣437. 路径总和 III

Problem: 437. 路径总和 III 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义int类型函数rootSum(root, targetSum),用于求取每一个节点等于目标函数的路径数: 1.1.易知rootSum(root, targetSum)求出的数量等于rootSum(root.left, targetSum - va…

2024.5.6 关于 SpringCloud 的基本认知

目录 引言 微服务框架所包含的技术栈 微服务架构演变 单体架构 分布式架构 微服务架构 微服务技术对比 认识 SpringCloud SpringBoot 版本兼容关系 服务拆分和远程调用 服务拆分注意事项 远程调用 引言 微服务是一种框架风格,按照业务板块来划分应用代码…

Android版本依赖Version catalog

曾经我们使用config.gradle文件进行版本依赖配置,然后在project的build.gradle.kts中使用如下方式引入: apply(from "./config.gradle") 缺点:在project的module中引用无任何提示,无法跳转到指定引用 一、创建versio…

如何全面规避医疗数据安全风险?“一中心三大管控域”打开新思路!

作为医院的核心基础设施,数据库已然演变成了一种具有“资产”属性的重要元素。而随着不断变化的医疗业务场景和日趋严格的合规性要求,如何让安全全方位贯穿医疗数据的生命周期,是一项系统性的建设工作,难点诸多。 基于多年的数据…

js 图片渐变

1. 点击图片,使其渐变为另一张图片 通过定义keyframes来创建一个淡入淡出的动画效果。当图片被点击时,先添加淡出动画使图片透明度从0渐变到1,然后在1秒后切换图片源并添加淡入动画使新图片透明度从0渐变到1,实现图片渐变效果。 …

交易复盘-20240507

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 蔚蓝生物 (5)|[9:25]|[36187万]|4.86 百合花…

深入理解nginx http响应限速功能

目录 1. 引言2. 配置参数2.1 limit_rate 配置指令2.2 limit_rate_after 配置指令2.3 其他限速配置 3. 源码分析 1. 引言 在现代互联网应用中,服务器的性能和响应速度是至关重要的。为了保证服务器的稳定性和可靠性,限制客户端对服务器的访问速度是一项重…

嵌入式linux学习第三天汇编语言点灯

嵌入式linux学习第三天汇编语言点灯 今天学习如何在linux板子上点灯。 I.MX6U GPIO 详解 我们发现I.MX6U GPIO是分为两类的,:SNVS 域的和通用的。在讨论i.MX6U或类似的复杂微处理器时,了解其GPIO(通用输入输出)引脚…

docker jenkins 部署springboot项目

1、创建jenkins容器 1,首先,我们需要创建一个 Jenkins 数据卷,用于存储 Jenkins 的配置信息。可以通过以下命令创建一个数据卷: docker volume create jenkins_data启动 Jenkins 容器并挂载数据卷: docker run -dit…

笔记本连接不上远程桌面,笔记本无法连接远程桌面的可能原因及解决方法

在使用远程桌面功能时,笔记本无法成功连接的情况可能由多种原因引起。为了有效地解决这个问题,我们需要逐一排查这些可能的原因,并采取相应的解决措施。 首先,网络连接稳定性是远程桌面连接成功的关键。请确保笔记本和远程计算机之…