【nodejs状态库mobx之computed规则】

news2024/11/24 12:04:52

The above example nicely demonstrates the benefits of a computed value, it acts as a caching point. Even though we change the amount, and this will trigger the total to recompute, it won’t trigger the autorun, as total will detect its output hasn’t been affected, so there is no need to update the autorun

上述描述了,computed 复合属性total的计算过程,复合属性total包含price和amount两个子属性,total = price * amount。当computed返回值price * amount不变,则不会触发autorun中total changed的回调函数。

示例

import { makeObservable, observable, computed, autorun } from "mobx"

class OrderLine {
    price = 0
    amount = 1

    constructor(price) {
        makeObservable(this, {
            price: observable,
            amount: observable,
            total: computed
        })
        this.price = price
    }

    get total() {
        console.log("Computing...")
        return this.price * this.amount
    }
}

const order = new OrderLine(0)

const stop = autorun(() => {
    console.log("Total: " + order.total)
})
// Computing...
// Total: 0

console.log(order.total)
// (No recomputing!)
// 0

order.amount = 5
// Computing...
// (No autorun)

order.price = 2
// Computing...
// Total: 10

stop()

order.price = 3
// Neither the computation nor autorun will be recomputed.

3个computed使用规则

Rules When using computed values there are a couple of best practices to follow:

They should not have side effects or update other observables. Avoid creating and returning new observables. They should not depend on non-observable values.

它们不应该有副作用或更新其他可观察对象。

computed值应该是纯粹的,这意味着它们不应该改变任何状态,也不应该有任何副作用。它们只应该根据它们的依赖项计算新的值。

class Store {
  @observable value = 0;
  @observable otherValue = 0;

  @computed get double() {
    // Good: This computed value doesn't have any side effects
    return this.value * 2;

    // Bad: This computed value has a side effect
    // this.otherValue = this.value * 2;
    // return this.otherValue;
  }
}

避免创建和返回新的可观察对象。

computed值应该返回一个简单的值,而不是一个新的可观察对象。如果你的computed值返回一个新的可观察对象,那么每次这个computed值被重新计算时,都会创建一个新的可观察对象。

class Store {
  @observable value = 0;

  @computed get double() {
    // Good: This computed value returns a simple value
    return this.value * 2;

    // Bad: This computed value returns a new observable
    // return observable({ double: this.value * 2 });
  }
}

它们不应该依赖非可观察值。

computed值应该只依赖可观察对象的状态。如果你的computed值依赖非可观察值,那么当这个值改变时,MobX无法知道需要重新计算computed值。

class Store {
  @observable value = 0;
  nonObservableValue = 0;

  @computed get double() {
    // Good: This computed value depends on an observable value
    return this.value * 2;

    // Bad: This computed value depends on a non-observable value
    // return this.nonObservableValue * 2;
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一分钟了解期权合约转仓交易的流程

期权合约转仓交易的流程 期权合约转仓交易是指在期权交易过程中,交易者平掉手中现有的仓位,并选择更高或更低的行权价格,进行买入或卖出开仓的交易方法。转仓交易具有多个优势,包括降低风险、锁定利润、提高资金使用效率以及增加…

关于Github默认分支main和master以及如何在git init时指定默认分支

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

内置对象部分

一,内置对象 二,math对象 不是构造函数,不需要new来调用,而是直接使用里面的属性和方法即可 1.随机方法random 返回一个随机的小数 [0,1) 2.日起格式化 返回的月份会小一,记得加一 周一返回1&#xff…

什么是储能电站的一次设备与二次设备?

随着国家政策导向和扶持,储能电站的建设,在各地均稳步推进,储能电站的设备主要分一次设备和二次设备两种,下面分别介绍这两方面内容: 储能电站一次设备 一次设备是储能电站的电路基础设施,包含变压器、主…

提升你的C编程技能:使用cURL下载Kwai视频

概述 本文将介绍如何利用C语言以及cURL库来实现Kwai视频的下载。cURL作为一个功能强大的网络传输工具,能够在C语言环境下轻松地实现数据的传输。我们还将探讨如何运用代理IP技术,提升爬虫的匿名性和效率,以适应Kwai视频平台的发展趋势。 正…

代码随想录算法训练营day40

题目:343. 整数拆分、96.不同的二叉搜索树 参考链接:代码随想录 343. 整数拆分 思路:五部曲来走。dp数组,dp[i]用于记录拆i得到的最大乘积和,我们要求的也就是dp[n];递推公式,我们想拆分i&am…

简单把玩下SpringAI

Hello大家好,今天写一些不烧脑的文章,我们来体验一下Spring的新框架Spring AI,只是简单玩玩不深入😏 Spring AI 简介 Spring AI是为了简化人工智能相关应用程序的开发Spring AI的诞生,灵感来自于LangChain等项目 Oll…

江苏开放大学2024年春《会计基础 050266》第二次任务:第二次过程性考核参考答案

电大搜题 多的用不完的题库,支持文字、图片搜题,包含国家开放大学、广东开放大学、超星等等多个平台题库,考试作业必备神器。 公众号 答案:更多答案,请关注【电大搜题】微信公众号 答案:更多答案&#…

Windows常见问题(技巧)总结

目录 问题Windows中更改快捷方式图标windows 中网速很慢,如何解决?因为Authenticated Users从其父系继承承权限,你无法删除此对象.Windows下的照片软件在哪个文件夹下?如何批量更改文件名?Windows 电脑pagefile.sys是什么文件,可以删除吗?U盘中打开文件时提示&a…

平衡小车的控制算法--结合自动控制原理学习

单纯的去看自控原理,很多概念有点抽象,最好找些应用去理解相关的概念,就找了实验室的一个平衡小车作为应用,不过主要根据小车去跑matlab去验证一些控制算法。结合台湾国立交通大学林沛群的自控线上课的总结 一、自控原理重要概念 …

Liunx下用C语言模拟实现 —— 封装文件操作接口

一、前提 本篇博客将循序渐进的模拟实现C语言中,简单版的对FILE和一些简单的文件操作接口的实现,在上一篇文件操作原理篇我们知道,实际的实现就是对系统接口的封装,为了巩固和练习之前学到的概念,我们也来简单的实现对…

经典的免费wordpress模板

这款经典的免费WordPress模板以鲜艳的红色为主调,充满了活力与热情。设计简洁而现代,适合各种类型的项目网站。模板采用响应式设计,确保在不同设备和屏幕尺寸上都能呈现出完美的视觉效果。 红色象征着激情、活力和自信,这款模板…

【Python系列】受保护属性

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Redis分布式锁手动实现

Redis分布式锁手动实现 java中锁机制 在 Java 中,锁是用来同步并发访问共享资源的机制。它确保了在一个时间点,只有一个线程可以执行某个代码块或方法,从而防止了数据的不一致和竞态条件。Java 提供了多种锁机制,包括内置锁&…

springBoot集成seata实现分布式事务

背景 日常开发离不开分布式系统,自然避免不了分布式事务问题,seata 是一款阿里开源的主流分布式事务解决方案,但实际工作引入seata感觉有点重,本人之前在商业银行做开发对数据一致性要求很高,但很少团队使用。几年前曾…

PDF加密了无法编辑?解密方法来了!

一下午都在捣鼓各种格式问题,首先是需要合并几个 PDF,然而有一个文件加密了无法操作,碰到加密不能编辑就很头痛,终于让我找到一个可行的方法了, 首先就这个加密文件右键选择打开方式-Google Chrome>>打开>>…

K8s: 公有镜像中心和私有镜像中心的搭建

公有镜像中心的搭建和使用 1 )在 官方docker镜像中心推送 在 hub.docker.com 上注册账号 (国内一般访问不了,原因不多说) 找到 Create Repository 按钮就行仓库的创建 这样就在官方创建了一个仓库,比如地址为: xx/y-y xx 是我的账户名y-y 是…

【服务器部署篇】Jenkins配置后端工程自动化部署

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是,产…

计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密数据恢复流程

网络技术的不断应用与发展,为企业的生产运营带来了极大便利,越来越多的企业依赖网络开展各项工作业务,网络也大大提升了企业的生产运营效率,但网络是一把双刃剑,在为企业提供便利的同时,也为企业的数据安全…

IDEA生成测试类

方法一 具体流程: 选中要生成的测试类------------>选择code选项------------>选择Generate选项---------->选择test选项---------->选择要生成的方法 第一步: 光标选中需要生成测试类的类 找到code选项 选中Generate选项 选中test选项 选中你要生成的测试…