makeAutoObservable 详解
makeAutoObservable(target, overrides?, options?)
target
:将目标对象中的属性和方法设置为 Observable State 和 Actionoverrides
:覆盖默认设置,将target
对象中的某些属性或方法设置为普通属性- 因为并不是所有的属性或方法都需要转化
overrides
对象中的key
是需要覆盖的属性或方法的名称,value
为false
的会被设置成普通属性
options
:配置对象
// 将 reset 方法设置为普通属性,再通过 reset 方法修改状态 MobX 会发出警告(Warning)
constructor() {
makeAutoObservable(this, { reset: false })
}
1234
// autoBind:使 Action 方法始终拥有正确的 this 指向
// --------- 定义 store 的 class ---------
constructor() {
makeAutoObservable(this, {}, {autoBind: true})
}
reset() {
console.log(this);
this.count = 0
}
// --------- 组件中调用方法 ---------
// 正确 this 指向
<button onClick={() => counterStore.reset()}>重置</button>
// 错误 this 指向
// this 指向 undefined
// 开启了 autoBind 后 this 会指向 Store 实例对象
<button onClick={counterStore.reset}>重置</button>
状态变化更新视图的必要条件
总结一下状态变化更新视图的必要条件:
- 状态需要被标记为 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 指向未变更
})
12345
makeObservable(this, {
reset: action.bound // reset this 指向变更
})