
MobX 学习 - 03 makeAutoObservable 和 makeObservable
发布日期:2021-05-08 18:18:40
浏览次数:19
分类:精选文章
本文共 1814 字,大约阅读时间需要 6 分钟。
makeAutoObservable 详解
makeAutoObservable(target, overrides?, options?)
target
:将目标对象中的属性和方法设置为 Observable State 和 Actionoverrides
:覆盖默认设置,将target
对象中的某些属性或方法设置为普通属性- 因为并不是所有的属性或方法都需要转化
overrides
对象中的key
是需要覆盖的属性或方法的名称,value
为false
的会被设置成普通属性
options
:配置对象
// 将 reset 方法设置为普通属性,再通过 reset 方法修改状态 MobX 会发出警告(Warning)constructor() { makeAutoObservable(this, { reset: false })}
// autoBind:使 Action 方法始终拥有正确的 this 指向// --------- 定义 store 的 class ---------constructor() { makeAutoObservable(this, {}, {autoBind: true})}reset() { console.log(this); this.count = 0}// --------- 组件中调用方法 ---------// 正确 this 指向// 错误 this 指向// this 指向 undefined// 开启了 autoBind 后 this 会指向 Store 实例对象
状态变化更新视图的必要条件
总结一下状态变化更新视图的必要条件:
- 状态需要被标记为 Observer State
- 更改状态的方法需要被标记为 Action
- 组件视图必须通过
observer
(mobx-react-lite 提供) 方法包裹
makeObservable 手动转化
makeAutoObservable
方法会自动转化 target
对象的属性和方法。
MobX 还提供了 makeObservable
方法,可以手动转化指定的属性或方法。
makeAutoObservable(target, annotations?, options?)
target
:指定要转化的目标实例对象annotations
:注解对象key
:指定要转化的属性或方法value
:annotation(注解,从 mobx 引入的方法),指定要转换成什么,例如:observable
:Observable Stateaction
:Action
import { makeObservable, observable, action } from "mobx"class CounterStore { // 数值状态 count = 10 constructor() { // 将参数对象的属性设置为 Observable State // 将参数对象的方法设置为 Action makeObservable(this, { count: observable, increment: action, reset: action }) } // 使数值+1 increment() { this.count += 1 } // 重置数值状态 reset() { this.count = 0 }}export default CounterStore
更正 this 指向
使用 makeObservable
手动转化的 action,无法通过 options 配置 autoBind 为 true 更正 this 指向。
需要在指定转化类型的时候使用 action.bound
makeObservable(this, { reset: action}, { autoBind: true // reset this 指向未变更})
makeObservable(this, { reset: action.bound // reset this 指向变更})
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月27日 14时18分19秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
idea的安装和无限期试用
2021-05-09
Oracle VM VirtualBox安装PVE虚拟机
2021-05-09
【转】如何用css限制文字长度,使溢出的内容用省略号…显示
2021-05-09
Android MediaPlayer setDataSource failed
2021-05-09
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
2021-05-09
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
2021-05-09
大前端的自动化工厂(1)——Yeoman
2021-05-09
数据仓库建模方法论
2021-05-09
虚拟机搭建hadoop环境
2021-05-09
DataStax Bulk Loader教程(四)
2021-05-09
.NET应用框架架构设计实践 - 概述
2021-05-09
Rust 内置 trait :PartialEq 和 Eq
2021-05-09
Hibernate(十四)抓取策略
2021-05-09
[菜鸟的设计模式之旅]观察者模式
2021-05-09
Spring-继承JdbcDaoSupport类后简化配置文件内容
2021-05-09
Java基础IO流(一)
2021-05-09
Hibernate入门(四)---------一级缓存
2021-05-09
MySQL事务(学习笔记)
2021-05-09
一个web前端开发者的日常唠叨
2021-05-09