• [XState] Delay Transitions


    import { createMachine, assign, interpret } from "xstate";
    
    const elBox = document.querySelector("#box");
    const elBody = document.body;
    
    const assignPoint = assign({
      px: (context, event) => event.clientX,
      py: (context, event) => event.clientY,
    });
    
    const assignPosition = assign({
      x: (context, event) => {
        return context.x + context.dx;
      },
      y: (context, event) => {
        return context.y + context.dy;
      },
      dx: 0,
      dy: 0,
      px: 0,
      py: 0,
    });
    
    const assignDelta = assign({
      dx: (context, event) => {
        return event.clientX - context.px;
      },
      dy: (context, event) => {
        return event.clientY - context.py;
      },
    });
    
    const resetPosition = assign({
      dx: 0,
      dy: 0,
      px: 0,
      py: 0,
    });
    
    const dragDropMachine = createMachine(
      {
        initial: "idle",
        context: {
          x: 0,
          y: 0,
          dx: 0,
          dy: 0,
          px: 0,
          py: 0,
        },
        states: {
          idle: {
            on: {
              mousedown: {
                actions: assignPoint,
                target: "dragging",
              },
            },
          },
          dragging: {
            // cancel the dragging after 2 seconds
            after: {
              DRAGGING_TIMEOUT: {
                target: "idle",
           actions: resetPosition  }, },
    on: { mousemove: { actions: assignDelta, internal:
    false, }, mouseup: { actions: [assignPosition], target: "idle", }, "keyup.escape": { target: "idle", actions: resetPosition, }, }, // Transition to 'idle' after 2 seconds // using a delayed transition. // ... }, }, }, { delays: { DRAGGING_TIMEOUT: 2000, }, } ); const service = interpret(dragDropMachine); service.onTransition((state) => { elBox.dataset.state = state.value; if (state.changed) { elBox.style.setProperty("--dx", state.context.dx); elBox.style.setProperty("--dy", state.context.dy); elBox.style.setProperty("--x", state.context.x); elBox.style.setProperty("--y", state.context.y); } }); service.start(); elBox.addEventListener("mousedown", (event) => { service.send(event); }); elBody.addEventListener("mousemove", (event) => { service.send(event); }); elBody.addEventListener("mouseup", (event) => { service.send(event); }); elBody.addEventListener("keyup", (e) => { if (e.key === "Escape") { service.send("keyup.escape"); } });
  • 相关阅读:
    Github 极简教程,上千万软件免费下,速度还快
    【ASP.NET Core】模型绑定:重命名绑定字段
    Mac安装指定版本的node
    基于Mybatis插件方式实现数据脱敏处理
    Android ProgressBar 详解 改变 ProgressBar 颜色
    rabbitmq的基础使用
    pom中引用本地jar
    在线课堂前端代码梳理
    windows下的图片反向代理
    CompleTableFuture
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13399308.html
Copyright © 2020-2023  润新知