zoukankan      html  css  js  c++  java
  • [XState] Guarded Transitions

    Garuded Transitions, it prevents the state goes from current sate to its target state is condition is falsy.

    const machine = createMachine(
      {
        initial: "idle",
        context: {
          x: 0,
          y: 0,
          dx: 0,
          dy: 0,
          px: 0,
          py: 0,
          drags: 0,
        },
        states: {
          idle: {
            on: {
              mousedown:{
                cond: "noMoreThanFiveTimes",
                actions: assignPoint,
                target: "dragging",
              },
            },
          },
          dragging: {
            entry: countDrags,
            on: {
              mousemove: {
                actions: assignDelta,
              },
              mouseup: {
                actions: [assignPosition],
                target: "idle",
              },
              "keyup.escape": {
                target: "idle",
                actions: resetPosition,
              },
            },
          },
        },
      },
      {
        guards: {
          noMoreThanFiveTimes: (context) => {
            return context.drags >= 5 ? false : true;
          },
        },
      }
    );

    In the code, users cannot drag more than 5 times. So it preventing going to 'dragging' state by 'cond: "noMoreThanFiveTimes"'.

    So if we cannot go 'dragging' state after five times drags... what should we do then?

    We can introduce a final state "draggedOut":

    const machine = createMachine(
      {
        initial: "idle",
        context: {
          x: 0,
          y: 0,
          dx: 0,
          dy: 0,
          px: 0,
          py: 0,
          drags: 0,
        },
        states: {
          idle: {
            on: {
              // if use Array with cond,
              // for first cond which is false
              // then it continue to second state 'draggedOut'
              mousedown: [
                {
                  cond: "noMoreThanFiveTimes",
                  actions: assignPoint,
                  target: "dragging",
                },
                {
                  target: "draggedOut",
                },
              ],
            },
          },
          draggedOut: {
            type: "final",
          },
          dragging: {
            entry: countDrags,
            on: {
              mousemove: {
                actions: assignDelta,
              },
              mouseup: {
                actions: [assignPosition],
                target: "idle",
              },
              "keyup.escape": {
                target: "idle",
                actions: resetPosition,
              },
            },
          },
        },
      },
      {
        guards: {
          noMoreThanFiveTimes: (context) => {
            return context.drags >= 5 ? false : true;
          },
        },
      }
    );

    So in 'mousedown' event, we use 'Array' type, so it try first target 'dragging' with condition. If the condition is false, then it will try second target 'draggedOut' which is our final state.

  • 相关阅读:
    结对编程:黄金点小游戏
    在win7环境下如何安装Microsoft Visual Studio
    软件工程第一次作业
    Android关于保存数据(Saving data)
    Android bitmap和canvas小记(转)
    java/android开发中删除文件
    博客园的第一篇
    安卓初学者必看实例,(计算圆面积)
    安卓初学者必看实例,(文件管理器简单实现)
    安卓初学者必看实例,(访问sqlite)
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13363059.html
Copyright © 2011-2022 走看看