Zag-基于状态机的组件库

简介: 本文适合对状态机感兴趣的小伙伴阅读

一、前言


官方介绍:

Zag 是一个与框架无关的工具包,用于设计系统和 Web 应用程序中实现复杂、交互式和可访问的 UI 组件。

可以在 ReactSolid Vue 中构建可访问的 UI 组件,无需为逻辑而烦恼。


简单理解:使用状态机方法实现常见的组件模式


背景介绍

过去我们经历了太多与我们如何协调事件、管理状态和副作用有关的小问题和错误。大多数这些错误都与useEffect编排useMemo有关useCallback。


二、Zag的特性


Why Zag?

由状态机提供支持:Zag 建立在状态图中的最新理念之上。不遵循 SCXML 规范,创建了一个我们认为可以帮助我们快速构建更复杂组件的 API。

一次编写,随处使用:组件交互以与框架无关的方式建模。我们为 JS 框架提供了适配器,因此可以在 React、Solid 或 Vue 3 中使用它。

关注可访问性:Zag 在构建时考虑了可访问性。处理了与键盘交互、焦点管理、咏叹调角色和属性相关的许多细节。

Headless:machine APIs完全没有样式,让用户可以控制使用自己喜欢的任何样式解决方案。增量采用:根据需要采用机器。每个组件机器都是一个 NPM 包,可以单独安装,以便用户可以增量使用它们。


三、安装


Zag 可以在大多数 JS 框架中使用,例如 Vue、React 和 Solid。

@zag-js/vue

image.png

@zag-js/react

image.png

@zag-js/solid

image.png


1.为自己感兴趣的组件安装机器

npm i --save @zag-js/{component}
# or
yarn add @zag-js/{component}


2.为自己选择的框架安装适配器,命令如下:

# react
npm install @zag-js/react
# or
yarn add @zag-js/react
# vue
npm install @zag-js/vue
# or
yarn add @zag-js/vue
# solid
npm install @zag-js/solid
# or
yarn add @zag-js/solid


四、demo


一、React项目中使用的toggle machine的示例:

import { useMachine, useSetup } from "@zag-js/react"
import * as toggle from "@zag-js/toggle"
export function Toggle() {
  const [state, send] = useMachine(toggle.machine)
  const ref = useSetup({ send, id: "1" })
  const api = toggle.connect(state, send)
  return (
    <button ref={ref} {...api.buttonProps}>
      {api.isPressed ? "开" : "关"}
    </button>
  )
}

由于machine hook中使用了 useSnapshot 挂钩,Zag 在幕后使用 valtio 来提供自动渲染优化。


二、与 Vue 3 (JSX) 一起使用Zag 与 Vue 的 JSX 方法无缝协作。在 Vue 中使用相同的toggle逻辑:

import { computed, defineComponent, h, Fragment } from "vue"
import * as toggle from "@zag-js/toggle"
import { useMachine, useSetup, normalizeProps } from "@zag-js/vue"
export default defineComponent({
  name: "Toggle",
  setup() {
    const [state, send] = useMachine(toggle.machine)
    const ref = useSetup({ send, id: "1" })
    const apiRef = computed(() => toggle.connect(state, send, normalizeProps))
    return () => {
      const api = apiRef.value
      return (
        <button ref={ref} {...api.buttonProps}>
          {api.isPressed ? "开" : "关"}
        </button>
      )
    }
  },
})


三、与 Solid.js 一起使用如何在 Solid 中使用相同的toggle逻辑:

import { createMemo } from "solid-js"
import * as toggle from "@zag-js/toggle"
import { useMachine, useSetup, normalizeProps } from "@zag-js/solid"
export default function Toggle() {
  const [state, send] = useMachine(toggle.machine)
  const ref = useSetup({ send, id: "1" })
  const api = createMemo(() => toggle.connect(state, send, normalizeProps))
  return (
    <button ref={ref} {...api().buttonProps}>
      {api().isPressed ? "开" : "关"}
    </button>
  )
}


有兴趣的小伙伴可以深入学习~社区传送门:https://discord.com/


五、最后


相关文章
|
存储 搜索推荐 NoSQL
ES 和 clickhouse 对比选型
clickhouse 是列式存储所以无法进行全文检索,所以更适合数据分析的需求。elasticsearch更适合高并发并且查询返回结果较少的全文检索,如搜索引擎。
3802 0
|
3月前
|
人工智能 IDE API
还在配置规则文件和智能体?Roo Commander:预置90+领域专家,开箱即用的AI编程新体验
Roo指挥官是一款创新AI编程助手,通过智能调度90多位虚拟技术专家,实现对复杂项目的自主规划与高效执行。用户无需手动选择专家或反复调整提示,只需提交需求,系统即可自动分析、拆解任务并协调最合适的技术角色完成开发。文中以构建3D互动简历为例,展示了其从需求分析到项目落地的全流程自动化能力,显著提升开发效率,开启AI驱动的智能化编程新体验。
196 0
|
12月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
703 1
|
存储 安全 Linux
Podman入门全指南:安装、配置与运行容器
Podman入门全指南:安装、配置与运行容器
8295 1
|
存储 数据库 数据安全/隐私保护
基于SpringBoot+Vue人口老龄化社区服务与管理平台(源码+部署说明+演示视频+源码介绍)(3)
基于SpringBoot+Vue人口老龄化社区服务与管理平台(源码+部署说明+演示视频+源码介绍)
210 0
|
存储 JavaScript API
vuex和pinia区别
vuex和pinia区别
247 0
|
自然语言处理 前端开发
深入解析 React-i18next:在 React 中实现国际化(二)
深入解析 React-i18next:在 React 中实现国际化(二)
358 0
|
关系型数据库 数据库连接 API
Supabase
Supabase 是一款开源的后端服务平台,可以帮助开发人员快速构建和部署应用程序。Supabase 提供了基于 PostgreSQL 数据库的服务,支持实时数据同步、身份验证和授权等功能。
2564 1
|
Ubuntu 安全 Linux
Debian系Linux软件源配置详解与常用的国内软件源汇总
Debian系Linux软件源配置详解与常用的国内软件源汇总
15100 2
Debian系Linux软件源配置详解与常用的国内软件源汇总