跳转到正文
OrbZ入门React 与 Next.js

React 与 Next.js

Orbz 不发布 React 组件。React 和 Next.js 与其他框架一样使用 <orb-z> 元素。

React

在客户端应用入口或浏览器运行的组件模块中导入一次浏览器入口:

import "@neongate-ai/orbz/react-types"; import "@neongate-ai/orbz/browser"; import { useState } from "react"; import type { OrbzState } from "@neongate-ai/orbz"; export function AssistantPresence() { const [state, setState] = useState<OrbzState>("idle"); return ( <div role="status" aria-live="polite"> <orb-z state={state} size="300px" /> <span>Assistant is {state}</span> <button type="button" onClick={() => setState("listening")}> Listen </button> </div> ); }

Next.js App Router

将注册和交互状态放在客户端边界内。服务器组件仍可正常渲染该客户端组件。

"use client"; import "@neongate-ai/orbz/react-types"; import "@neongate-ai/orbz/browser"; export function AssistantPresence() { return <orb-z state="thinking" size="300px" />; }

浏览器入口支持安全 SSR:customElements 不可用时不执行操作,在客户端包执行时定义元素。

为自定义标签提供类型

在 React 或 Next.js TypeScript 应用中导入一次可选 JSX 类型扩展:

import '@neongate-ai/orbz/react-types'

这让 TypeScript 识别原生 <orb-z>,不会在 Orbz 运行时中创建 React 组件、包装器、运行时适配器或 React 依赖。

设置结构化属性

语音引擎、对话流程和智能提供器是 JavaScript 对象,不是 HTML 属性。首次安排对话运行前,通过 ref 赋值:

"use client"; import "@neongate-ai/orbz/react-types"; import "@neongate-ai/orbz/browser"; import { useCallback } from "react"; import type { OrbzElement, OrbzVoiceEnginePort } from "@neongate-ai/orbz"; interface ProductPresenceProps { voiceEngine: OrbzVoiceEnginePort; } export function ProductPresence(props: ProductPresenceProps) { const setElement = useCallback( (element: HTMLElement | null) => { if (element) { (element as OrbzElement).voiceEngine = props.voiceEngine; } }, [props.voiceEngine] ); return <orb-z ref={setElement} state="idle" />; }

仓库中的 React 和 Next.js 示例采用此原生元素方式。

最近更新于