发布于 2026-01-06 1 阅读
0

从状态机和 Xstate 开始!DEV 全球展示挑战赛,由 Mux 呈现:展示你的项目!

从状态机和 Xstate 开始!

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

作为软件开发人员,我们肯定都听说过状态机。有限状态机在算法设计中非常常见,例如根据一系列输入计算输出,或者根据当前状态和前一个状态的输出计算下一个状态。

状态机有很多常见的例子,你一定听说过。

  • 交通信号灯🚦
  • 自动售货机⚒️
  • 电梯🚪

由于状态机是一种非常紧凑的方式来表示一组复杂的规则和条件,所以让我们来看看如何扩展它在前端应用程序中的使用。

为什么前端需要状态机?

浏览器中的状态管理一直是一个棘手的问题,尤其是在开发具有复杂状态管理的大型应用程序时。UI框架扮演着至关重要的角色,它负责接收应用程序状态并将其传递给DOM节点,以实现预期的结果。

状态机是一种非常有效的应用程序状态建模方法,它能确保应用程序在任何给定时间点都只能处于一种状态。所有这些优势都有助于我们解决应用程序扩展性方面的问题,因为扩展性最终需要处理新的事件、新的边界情况等等。

从我们的应用程序开始。

让我们首先使用Xstate在Vue.js中创建一个简单的待办事项应用程序。

第一步是确定创建待办事项列表所需的所有可能的用户界面状态。我开始记录应用程序所需的基本状态和操作。

  • 会有一些基本状态,例如空闲、加载中、已解决、已拒绝。

  • 应用程序中需要执行的操作包括:更新列表、创建新的待办事项、更新待办事项和删除待办事项。

  • 编辑、删除和创建将处于并行状态,用户可以同时执行这三个操作。

根据以上提示,我在Xstate Viz上创建了一个基本状态图,涵盖了我的应用程序的所有状态和操作。

替代文字

状态机定义代码:

Machine(
  {
    id: 'Todo',
    initial: 'idle',
    context: {
      user: null,
      todoList: [],
      delay: 0
    },
    states: {
      idle: {
        on: {
          fetch: 'list'
        }
      },
      list: {
        invoke: {
          id: 'fetchList',
          src: (context, event) => {
            return context.todoList
          },
          onDone: {
            target: 'resolved'
          },
          onError: 'rejected'
        },
        on: {
          listItems: {
            target: 'todoItemActions',
            actions: 'addListItem'
            //   actions: ['fetchListItems']
          }
        }
      },
      resolved: {
        type: 'final'
      },
      rejected: {
        on: {
          fetch: 'list'
        }
      },
      todoItemActions: {
        type: 'parallel',
        states: {
          createTodoItem: {
            initial: 'add_details',
            states: {
              idle: {
                on: {
                  create: 'add_details'
                }
              },
              add_details: {
                on: {
                  fillDetails: {
                    target: 'createSuccess',
                    actions: 'createNewTodoItem'
                  }
                }
              },
              createSuccess: {}
            }
          },
          deleteTodoItem: {
            initial: 'idle',
            states: {
              idle: {
                on: {
                  select_item: 'deleteItem'
                }
              },
              deleteItem: {
                on: {
                  delete: {
                    target: 'deleteSuccess',
                    actions: 'deleteTodoItem'
                  }
                }
              },
              deleteSuccess: {}
            }
          },
          editTodoItem: {
            initial: 'idle',
            states: {
              idle: {
                on: {
                  edit: 'edit_details'
                }
              },
              edit_details: {
                on: {
                  fill_details: {
                    target: 'editSuccess',
                    actions: 'editTodoItem'
                  }
                }
              },
              editSuccess: {}
            }
          }
        }
      }
    }
  },
  {
    actions: {
      createNewTodoItem: (context, event) => {
        console.log('create new todo item', context)
      },
      addListItem: (context, event) => {
        console.log('add list item', context, event)
      },
      deleteTodoItem: (context, event) => {
        console.log("delete todo item", context, event)
      },
      editTodoItem:  (context, event) => {
        console.log("edit todo item", context, event)
      }
    }
  }
)
Enter fullscreen mode Exit fullscreen mode

您可以在可视化工具中查看上述状态机定义。

下一篇文章,我将介绍如何使用 Vue js 中的 Xstate 集成和创建待办事项应用程序。

我从网上几篇很棒的文章中获得了灵感,一定要去看看!🙈

文章来源:https://dev.to/jasmin/starting-with-state-machine-and-xstate-1972