夜猫子的知识栈 夜猫子的知识栈
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

夜猫子

前端练习生
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 核心概念

  • 高级指引

  • Hook

  • 案例演示

  • Router

  • Redux

  • Jotai

  • Mobx

    • Mobx
    • observable state
    • actions
    • computeds
      • 示例
      • 最佳实践
      • Options {🚀}
        • name
        • equals
        • 内置 comparers
        • 示例结构比较{👀}
        • keepAlive
    • reactions
  • 其他

  • 《React》笔记
  • Mobx
夜猫子
2023-09-05
目录

computeds

# 计算属性

基于 state 二次处理数据。

标识:computed,或使用 makeAutoObservable 自动将所有的 getters 标识为 computed。

# 示例

下面的示例依靠 Reactions {🚀} (opens new window) 高级部分中的 autorun (opens new window) 来辅助说明计算值的意义。

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)
// (不会重新计算!)
// 0

order.amount = 5
// Computing...
// (无需 autorun)

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

stop()

order.price = 3
// 计算值和 autorun 都不会被重新计算.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

computed graph

# 最佳实践

  1. 它们不应该有副作用或者更新其他可观察对象。
  2. 避免创建和返回新的可观察对象。
  3. 它们不应该依赖非可观察对象的值

# Options {🚀}

# name

该字符串在 Spy event listeners (opens new window) 和 MobX developer tools (opens new window) 中用作调试名称。

# equals

默认设置为 comparer.default。它充当一个比较函数,用于比较上一个值和下一个值。如果该函数认为两个值相等,那么观察者们将不会被重新计算。

# 内置 comparers

MobX 提供了四种内置的 comparer 方法,这些方法满足 computed 的 equals 选项的大多数需求:

  • comparer.identity 使用全等 (===)运算符确定两个值是否相同。
  • comparer.default 与 comparer.identity 相同,但是其认为 NaN 等于 NaN。
  • comparer.structural 执行深层的结构比较以确定两个值是否相同。
  • comparer.shallow 执行浅层的结构比较以确定两个值是否相同。

# 示例结构比较{👀}

当返回一个新的对象时,即时值一样,观察者们也会默认数据不一样,并会触发监察者。

如果需要进行结构比较可以使用 computed.struct。

点击查看代码
class Box {
    width = 0
    height = 0

    constructor() {
        makeObsevable(this, {
            x: observable,
            y: observable,
            topRight: computed({equals:'structural'})
        })
    }

    get topRight() {
        return {
            x: this.width,
            y: this.height
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# keepAlive

使计算属性的值在未被观察时被暂时停用。

编辑 (opens new window)
上次更新: 2024/12/19 17:25:54
actions
reactions

← actions reactions→

最近更新
01
IoC 解决了什么痛点问题?
03-10
02
如何调试 Nest 项目
03-10
03
Provider注入对象
03-10
更多文章>
Copyright © 2019-2025 Study | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式