03.生命周期事件

為了跟蹤或執(zhí)行當(dāng)轉(zhuǎn)換動(dòng)作發(fā)生時(shí)的行為,有以下五個(gè)通用生命周期事件可以觀測(cè):

  • onBeforeTransition - 執(zhí)行任意轉(zhuǎn)換動(dòng)作前被觸發(fā)
  • onLeaveState - 離開(kāi)任意狀態(tài)時(shí)被觸發(fā)
  • onTransition - 執(zhí)行任意轉(zhuǎn)換動(dòng)作期間被觸發(fā)
  • onEnterState - 剛進(jìn)入任意狀態(tài)時(shí)被觸發(fā)
  • onAfterTransition - 執(zhí)行任意轉(zhuǎn)換動(dòng)作后被觸發(fā)

除了通用事件之外,還可以使用特定的轉(zhuǎn)換動(dòng)作和狀態(tài)名稱(chēng)來(lái)觀察:

  • onBefore<TRANSITION> - 執(zhí)行指定轉(zhuǎn)換動(dòng)作前被觸發(fā)
  • onLeave<STATE> - 離開(kāi)指定狀態(tài)時(shí)被觸發(fā)
  • onEnter<STATE> - 剛進(jìn)入指定狀態(tài)時(shí)被觸發(fā)
  • onAfter<TRANSITION> - 執(zhí)行指定轉(zhuǎn)換動(dòng)作后被觸發(fā)

為了方便起見(jiàn),兩個(gè)最有用的事件可以進(jìn)行縮寫(xiě):

  • on<TRANSITION> - onAfter<TRANSITION>的簡(jiǎn)寫(xiě)
  • on<STATE> - onEnter<STATE>的簡(jiǎn)寫(xiě)

觀測(cè)生命周期

使用觀察者方法觀察單個(gè)生命周期事件:

  fsm.observe('onStep', function() {
    console.log('stepped');
  });

使用觀察者方法觀察多個(gè)生命周期事件:

  fsm.observe({
    onStep: function() { console.log('stepped');         }
    onA:    function() { console.log('entered state A'); }
    onB:    function() { console.log('entered state B'); }
  });

狀態(tài)機(jī)觀察自己的生命周期:

  var fsm = new StateMachine({
    init: 'A',
    transitions: [
      { name: 'step', from: 'A', to: 'B' }
    ],
    methods: {
      onStep: function() { console.log('stepped');         }
      onA:    function() { console.log('entered state A'); }
      onB:    function() { console.log('entered state B'); }
    }
  });

生命周期事件的參數(shù)

具有以下屬性的lifecycle對(duì)象將作為參數(shù)傳遞給觀察者:

  • transition - 轉(zhuǎn)換動(dòng)作的名稱(chēng)
  • from - 上一個(gè)狀態(tài)
  • to - 下一個(gè)狀態(tài)

除了lifecycle參數(shù),觀察者還接收任意個(gè)傳遞給轉(zhuǎn)換方法的參數(shù)。

  var fsm = new StateMachine({
    transitions: [
      { name: 'step', from: 'A', to: 'B' }
    ],
    methods: {
      onTransition: function(lifecycle, arg1, arg2) {
        console.log(lifecycle.transition); // 'step'
        console.log(lifecycle.from);       // 'A'
        console.log(lifecycle.to);         // 'B'
        console.log(arg1);                 // 42
        console.log(arg2);                 // 'hello'
      }
    }
  });

  fsm.step(42, 'hello');

生命周期事件名

生命周期事件名總是使用標(biāo)準(zhǔn)的js駝峰命名法。 即便你的轉(zhuǎn)換方法和狀態(tài)沒(méi)有這樣命名:

  var fsm = new StateMachine({
    transitions: [
      { name: 'do-with-dash',       from: 'has-dash',        to: 'has_underscore'   },
      { name: 'do_with_underscore', from: 'has_underscore',  to: 'alreadyCamelized' },
      { name: 'doAlreadyCamelized', from: 'alreadyCamelize', to: 'has-dash'         }
    ],
    methods: {
      onBeforeDoWithDash:         function() { /* ... */ },
      onBeforeDoWithUnderscore:   function() { /* ... */ },
      onBeforeDoAlreadyCamelized: function() { /* ... */ },
      onLeaveHasDash:             function() { /* ... */ },
      onLeaveHasUnderscore:       function() { /* ... */ },
      onLeaveAlreadyCamelized:    function() { /* ... */ },
      onEnterHasDash:             function() { /* ... */ },
      onEnterHasUnderscore:       function() { /* ... */ },
      onEnterAlreadyCamelized:    function() { /* ... */ },
      onAfterDoWithDash:          function() { /* ... */ },
      onAfterDoWithUnderscore:    function() { /* ... */ },
      onAfterDoAlreadyCamelized:  function() { /* ... */ }
    }
  });

生命周期事件執(zhí)行順序列表

綜上所述,轉(zhuǎn)換的生命周期按以下順序執(zhí)行:

  • onBeforeTransition - 執(zhí)行任意轉(zhuǎn)換動(dòng)作前被觸發(fā)
  • onBefore<TRANSITION> - 執(zhí)行指定轉(zhuǎn)換動(dòng)作前被觸發(fā)
  • onLeaveState - 離開(kāi)任意狀態(tài)時(shí)被觸發(fā)
  • onLeave<STATE> - 離開(kāi)指定狀態(tài)時(shí)被觸發(fā)
  • onTransition - 執(zhí)行任意轉(zhuǎn)換動(dòng)作期間被觸發(fā)
  • onEnterState - 剛進(jìn)入任意狀態(tài)時(shí)被觸發(fā)
  • onEnter<STATE> - 剛進(jìn)入指定狀態(tài)時(shí)被觸發(fā)
  • on<STATE> - onEnter<STATE>的簡(jiǎn)寫(xiě)
  • onAfterTransition - 執(zhí)行任意轉(zhuǎn)換動(dòng)作后被觸發(fā)
  • onAfter<TRANSITION> - 執(zhí)行指定轉(zhuǎn)換動(dòng)作后被觸發(fā)
  • on<TRANSITION> - onAfter<TRANSITION>的簡(jiǎn)寫(xiě)

取消轉(zhuǎn)換動(dòng)作

在下列任意生命周期事件中,觀察者都可以通過(guò)顯式的返回false來(lái)取消轉(zhuǎn)換動(dòng)作

  • onBeforeTransition
  • onBefore<TRANSITION>
  • onLeaveState
  • onLeave<STATE>
  • onTransition

所有后續(xù)生命周期事件都將被取消,狀態(tài)將保持不變。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容