XState
https://gyazo.com/3ca83c49c6110e7ea0a2ad058614b4ff
Finite State Machineを定義する
Reactなど向けのpackageもある
Stately製
docs
github
#WIP
なんか型周りが妙に筋が悪いなmrsekut.icon
型安全にするためには追加の設定が少し必要 ref
これがないとevent名などがチェックされない
types: {} as {...}というハック感漂う感じで指定する
stateとcontextが別々の概念なのもよくわからない
XStateで型安全なStateを表現する例
これ過去に発行したeventsを記録したり再生したりできるのかな
できるっぽい
https://stately.ai/blog/2023-10-02-persisting-state
いやこれeventsを記録してるのではなくstateを記録してるだけだ
immutable data model的なことはできなさそうか
例
https://github.com/statelyai/xstate/tree/main/examples/persisted-donut-maker
https://github.com/statelyai/xstate/tree/main/examples/mongodb-persisted-state
2023/12にv5が出た
https://stately.ai/blog/2023-12-01-xstate-v5
Actor Model
https://stately.ai/docs/state-machines-and-statecharts#what-is-a-statechart
Statechart
ステートチャートは、階層、同時実行、通信など、通常のステート マシンでは利用できない追加機能を追加します。
#??
id
XStateのactor
https://stately.ai/docs/actors
state machineのinstanceみたいな感じなんだ
もっとちゃんというとActor Logicのinstanceか
actorはactorを作り出せる
invoked actor
親マシンが呼び出されると開始し、その状態が終了すると消える
プロセスみたいな?
https://stately.ai/docs/invoke
spawned actor
transitionで開始され、stopや親マシンのstop時に停止する
https://stately.ai/docs/spawn
subscribeできる
Actor Logic
https://stately.ai/docs/actors#actor-logic
https://stately.ai/docs/actors#actor-logic-creators
Guards
https://stately.ai/docs/guards
validation
XStateのactions
https://stately.ai/docs/actions
event発生時やstate遷移の前後で起こす副作用
entry
state nodeに入る前に呼ばれる
exit
state nodeから終了する際に呼ばれる
例えば、遅延させたり、通信したり、XStateのcontextを更新したり
例
上の方でactionsを列挙しておいて、状態遷移時にそれを呼ぶんだ
なんで列挙する必要があるんだろう
code:ts
const feedbackMachine = setup({
actions: {
track: (_, params: unknown) => {
track(params);
// Tracks { response: 'good' }
},
showConfetti: () => {
// ...
}
}
}).createMachine({
// ...
states: {
// ...
question: {
on: {
'feedback.good': {
actions: [
{ type: 'track', params: { response: 'good' } }
]
}
},
exit: 'exitAction'
}
thanks: {
entry: 'showConfetti',
}
}
});
XStateのContext
https://stately.ai/docs/context
states:のキーで指定しているのはあくまでも「状態名」ってことかmrsekut.icon
その状態の中でどういう内容を保持しているかはそこで表現されない
その保持したいものがcontextということか
これだけ見てもわからん
code:ts
import { assign, createMachine } from 'xstate';
export const toggleMachine = createMachine({
id: 'toggle',
context: { count: 0 },
initial: 'Inactive',
states: {
Inactive: {
on: { toggle: 'Active' },
},
Active: {
entry: assign({
count: ({ context }) => context.count + 1
}),
on: { toggle: 'Inactive' },
after: { 2000: 'Inactive' },
},
},
});
getSnapShotして現在のやつ取れる
code:ts
const a = createActor(machine);
a.send({ type: 'ADD', item: { id: 1, name: 'foo', completed: false } });
const s = a.getSnapshot().context.state
Stately Studio
https://stately.ai/
visualizerがある
GUIで編集してXStateのコードをexportできる
一部有料?
状態遷移のコードを可視化できるのかなり良いなmrsekut.icon
@xstate/graph
https://github.com/statelyai/xstate/tree/main/packages/xstate-graph
@xstate/test
https://github.com/statelyai/xstate/tree/main/packages/xstate-test
@xstate/inspect
https://github.com/statelyai/xstate/tree/main/packages/xstate-inspect
@xstate/react
https://github.com/statelyai/xstate/tree/main/packages/xstate-react
関連
useStateMachine
https://user-first.ikyu.co.jp/entry/2023/12/22/190342
https://product.st.inc/entry/2022/04/14/105719