-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
MobX #192
Comments
React用のステート管理ライブラリ。 関数型リアクティブプログラミング(Functional Reactive Programming) |
インストール
MobX は ES5 の環境で動作する。 |
コンセプト3つの概念が重要
Stateの定義import { makeObservable, observable, action } from "mobx"
class Todo {
id = Math.random()
title = ""
finished = false
constructor(title) {
makeObservable(this, {
title: observable,
finished: observable,
toggle: action
})
this.title = title
}
toggle() {
this.finished = !this.finished
}
} |
ObserverMobXはプロパティ、オブジェクト、配列など、さまざまなものを監視(observe)対象とすることができる。 makeObservable()class CounterState {
value = 0;
constructor() {
makeObservable(this, {
value: observable,
increment: action,
});
}
increment() {
this.value++;
}
}
ゲッターメソッドであっても、ステートだけでなく引数にも依存するメソッドの場合はアノテーションは不要で、キャッシュはされないらしい。(メモリリーク対策とのこと) makeAutoObservable()class CounterState {
value = 0;
constructor() {
makeAutoObservable(this);
}
increment() {
this.value++;
}
}
サブクラスでは使用できない。 アノテーションのルールは以下の通り
observable()const todosById = observable({
"TODO-123": {
title: "find a decent task management system",
done: false
}
}) 第一変数を監視する。 |
Actionaction はトランザクション内で実行される。 strictモードが有効な場合、action以外からステートの値を変更することはできない。 メソッドを action としてアノテーションするには action()const state = observable({ value: 0 });
const increment = action(state => {
state.value++
}); action は関数なので action のなかで action を実行するということもある。 イベントハンドラの中で複数のステート変更を行う場合、イベントハンドラ自体を action とすると良い。 const ResetButton = ({ formState }) => (
<button
onClick={action(e => {
formState.resetPendingUploads()
formState.resetValues()
e.preventDefault()
})}
>
Reset form
</button>
) runInAction()const state = observable({ value: 0 });
runInAction(() => {
state.value++
}); すぐに起動される一時的なアクションを作成する。 |
asObservableObject()
|
observable()
内部的には
に振り分ける。 observable.box()
const state = mobx.observable.box(0);
mobx.autorun(() => {
console.log(state.get());
});
setInterval(() => {
state.set(state.get() + 1);
}, 1000); 値には observable.object()let state = mobx.observable.object({
counter: 0,
});
mobx.autorun(() => {
console.log(state.counter);
});
setInterval(() => {
state.counter++;
}, 1000); 与えたオブジェクトと同じプロパティを持つオブジェクトを返す(Proxyを使える環境ではProxy)。 Proxy を使える環境では 仕組みとしては与えられたオブジェクトのプロパティ名を取得し、そのプロパティ名のsetter/getterを持つオブジェクトを新たに作ってるっぽい。
asObservableObject( target )
|
Reflect.defineProperty() vs Object.defineProperty()if (proxyTrap) {
if (!Reflect.defineProperty(this.target_, key, descriptor)) {
return false
}
} else {
defineProperty(this.target_, key, descriptor)
}
|
ObservableObjectAdministration監視対象のオブジェクトの 実際にデータを持っているのはオブジェクトではなくこのインスタンス。 |
autorun()第一引数で渡す関数は引数としてReactionのインスタンスを取得する。
ReactionReactionは特別なderivationsである。通常のリアクティブ計算とは異なる点がいくつかあります。
リアクションのステートマシンは以下の通りです。
runReactionsHelper()
runReaction_()Reactionインスタンスの関数。
Derivationhttps://medium.com/hackernoon/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254#.xvbh6qd74 export interface IDerivation extends IDepTreeNode {
observing_: IObservable[]
newObserving_: null | IObservable[]
dependenciesState_: IDerivationState_
runId_: number
unboundDepsCount_: number
onBecomeStale_(): void
isTracing_: TraceMode
requiresObservable_?: boolean
} |
async/await ではなく
|
https://mobx.js.org/README.html
The text was updated successfully, but these errors were encountered: