客户端 SDK 的 React JS 绑定。 包括钩子、组件和 实用程序,以便在 Telegram 迷你应用程序平台上轻松使用 React JS。安装 在此之前,假定您已经安装了 react 软件包,因为 是该软件包的同级依赖关系。 pnpm : - pnpm i @telegram-apps/sdk-react
复制代码npm : - npm i @telegram-apps/sdk-react
复制代码yarn : - yarn add @telegram-apps/sdk-react
复制代码 SDKProviderSDKProvider 是负责提供 SDK 功能的组件。 它接受 ,如 acceptCustomStyles: boolean 和 debug: boolean 等属性。 两者都是可选的。 acceptCustomStyles 属性负责接受来自 Telegram 网页版的自定义样式。 debug 属性负责启用调试模式。 - import { SDKProvider } from '@telegram-apps/sdk-react';
2 w7 T7 }+ e2 F: H% n2 ^ - " ?# {! z; |) H# A% p- I
- /**
. q) ^ X6 ]( j; p6 c - * Root component for the whole project.
: ]4 \- R: [$ l0 o _: q - *// `- G; ~! B3 d6 Q) u6 u# k( `
- export function Root() {) g6 [1 Q n8 X; B; z
- return (
1 B( n) }' h: U7 w9 q - <SDKProvider acceptCustomStyles debug>
; x8 J2 d. t2 o$ o - <div>My application!</div>
; J1 ^" C; K5 X5 j - </SDKProvider>+ f8 k1 X4 t$ F" P C, G
- );: M" n3 D! ]: o
- }
复制代码 Hooks为了更好地理解,每个组件钩子都使用各自与组件相关的 init 函数。 如果 init 函数返回的是非承诺值,钩子将立即检索该值。 如果 init 函数 是异步的,那么当组件仍在 初始化时,钩子将返回一个 undefined 值。 然后,它将更新为初始化值。 本软件包中的所有组件钩子分为两部分: - 读取实际的初始函数值。 这些钩子是非后缀的,如 useBackButton。
- 检索与初始函数值相关的元项目。 这些钩子包括一个后缀,如 ,如 Raw,如 useBackButtonRaw。. E c) A1 S; S6 P+ n+ t
第一类钩子返回实际的初始函数值。 如果 在组件初始化过程中出现问题,它们就会出错。 第二类钩子会返回一个包含初始化进程信息的对象。 下面是物体的形状: - export interface SDKContextItem<T> {
: y7 M& ]0 p1 F3 X! U& a - /**
3 o$ m4 D D, r, | - * This item execution result. The property may be missing
; ~( b2 b4 a: ^+ _) u/ ` - * in case the execution is async., O4 n6 N; ^, j" n, V
- */
7 i _7 C5 k* ?# @0 h$ c D* F - result?: T;
6 a$ o- D1 A' z2 O - /**, W; z/ S( a7 M
- * Function to clean up item side effects.2 A' ?6 Z! x3 |/ Y6 U
- */
: }$ m/ n ?7 d - cleanup?(): void;; x5 r2 L& A5 s. g( G4 i
- /**
! Y8 ]% P' @7 d1 j" S - * An error occurred during execution.
6 N- i( ~" ] @ ^- g; b - */
* ~$ o. J4 B& L" U - error?: unknown;
8 ?; e" B+ A) u! s9 ]6 @' q - }
复制代码使用第二类钩子,可以提取错误而不抛出错误。 下面是完整的使用示例: - import {
; @$ W3 n8 V5 ~8 x6 x - useBackButton,
2 f1 S: _0 u6 y& [ - useBackButtonRaw,) _0 h; J6 A4 G( k: q
- useViewport,
\: A( V' R( a - useViewportRaw,
( u8 E0 E2 d& ^$ E - useBiometryManagerRaw,
2 l0 L/ `5 }8 @1 D* X - } from '@telegram-apps/sdk-react';
9 I2 ^; c1 J/ ]3 B5 X4 c$ Q2 _ - import { useEffect } from 'react';2 x. S4 l% F% d
. G- @0 B* x+ J" n7 n- // BackButton initializes synchronously. So, bb will be
: {5 y# h/ i( [7 [2 f - // the BackButton instance.' \/ U3 c- K: f4 u) t5 t# ]1 O" Y
- const bb = useBackButton();
]& ?& Y; F% k* f
* L9 u1 y8 W& U D* ?5 A" w- // Viewport is being initialized asynchronously, so signal may return undefined.5 Q; |$ E% {: c: K% B7 Q
- // After some time it will receive a valid value.
|" C0 }4 c9 X. Z( f - const vp = useViewport();
0 N+ V$ V7 B2 ?6 g; H1 }
5 p' Y' `! _% w& ^: C0 z- useEffect(() => {& o# u( V. }( A
- console.log(vp); // will be undefined and then Viewport instance.8 A9 e. q% h! ~( m
- }, [vp]);& @9 `9 X; e; b, h6 W+ _" ~
$ u7 N+ G* u3 |- const bm = useBiometryManagerRaw();
7 d7 [# J: U w+ f
9 `2 m3 z% s% L) U2 a# f; q, @- useEffect(() => {
# \7 k7 |( i' s. g* f - if (bm.error) {' C/ k, t2 h: L; e! W
- console.error('Something went wrong for BiometryManager', bm.error);
+ l% p2 e2 Q. Y8 W& P* ] - }3 }. k: r' q9 t- u
- }, [bm]);
复制代码 SSR该软件包还支持在 Next.js 等流行框架中广泛使用的 SSR 模式。 在服务器端使用 软件包钩子时,必须将 true 作为第一个参数传递。 这将通知钩子 服务器端模式已启用。 如果不指定此值,在服务器端 上调用钩子将导致错误。 服务器端模式会为服务器端的每个组件钩子返回 undefined,也会在挂载当前组件之前返回 undefined。这对于服务器端和客户端渲染的树之间的持久性是必需的。 - import { useBackButton } from '@telegram-apps/sdk-react';6 J- O; {# e2 g! P+ K
- import { useEffect } from 'react';, R. k/ w8 j, r& B: b% k
- 2 o o. ~$ t: Q
- function Component() {
4 l8 c7 \. @- M# \* g5 T - const bb = useBackButton(true); // will be undefined or BackButton.
* ?+ O `4 ^3 U5 U$ W) I
2 K/ S* f5 Y2 R: ~- useEffect(() => {+ Y2 X* l! D5 j) _9 v$ s
- if (bb) {
# \* @1 J% O6 U$ @3 ^2 P1 o3 G - // Here we can safely work with the BackButton." o8 e& A n* b! P$ b
- }* P7 s9 u3 n$ L0 J( y! v
- }, [bb]);
6 U C0 j9 G' w7 _5 s, X - }
复制代码 HOCs所有软件包的高阶组件都使用前面描述的钩子。 使用方法相当 简单: - import { withBackButton } from '@telegram-apps/sdk-react';
( l& }7 n4 A7 u - import { useEffect } from 'react';( q' H/ ? [/ U" ^
" ^7 N' M2 J+ n: D& b# H8 C7 f1 h- const A = withBackButton('bb', false, ({ bb }) => {3 ~* Z, p9 g2 [6 _- k; [
- useEffect(() => {8 y7 |! m5 m. w, q3 t
- bb.show();
5 J3 b$ z% b# O0 a @% ? - }, [bb]);
& T( v* H/ K7 B$ r9 a7 N6 b. ]5 u - return null;7 p2 b, u4 i0 `) _# Q+ D
- }); U! P* `. G& O: y1 @
- 9 f/ C9 i) c: m' ?
- const B = withBackButton('bb', true, ({ bb }) => {( Y8 q( K1 r6 V+ ?5 a6 D
- useEffect(() => {0 S- r. x) b, U+ M) s
- bb && bb.show();
' _+ n$ Z) W9 }5 I. X7 ? - }, [bb]);+ X. q( |! K' m; G( p/ G
- return null;( N7 f) u5 Q1 u. y/ V
- });
复制代码 作为第一个参数,您必须传递一个值,该值负责接收 钩子结果的组件属性名称。 第二个参数是 SSR 标志模式,将传递给钩子,内部使用 。4 j0 W7 F- z5 V% p/ I1 a
+ r% h8 ?3 I" O/ G1 S" }! U' xHooks 和 HOC 列表Hook and HOC (Raw) | Hook and HOC (Result) | Returned value | useBackButtonRaw, withBackButtonRaw | useBackButton, withBackButton | BackButton | useBiometryManagerRaw, withBiometryManagerRaw | useBiometryManager, withBiometryManager | BiometryManager 或 undefined | useClosingBehaviorRaw, withClosingBehaviorRaw | useClosingBehavior, withClosingBehavior | ClosingBehavior | useCloudStorageRaw, withCloudStorageRaw | useCloudStorage, withCloudStorage | CloudStorage | useHapticFeedbackRaw, withHapticFeedbackRaw | useHapticFeedback, withHapticFeedback | HapticFeedback | useInitDataRaw, withInitDataRaw | useInitData, withInitData | InitData | useInvoiceRaw, withInvoiceRaw | useInvoice, withInvoice | Invoice | | useLaunchParams | Launch params | useMainButtonRaw, withMainButtonRaw | useMainButton, withMainButton | MainButton | useMiniAppRaw, withMiniAppRaw | useMiniApp, withMiniApp | MiniApp | usePopupRaw, withPopupRaw | usePopup, withPopup | Popup | useQRScannerRaw, withQRScannerRaw | useQRScanner, withQRScanner | QRScanner | useSettingsButtonRaw, withSettingsButtonRaw | useSettingsButton, withSettingsButton | SettingsButton | useSwipeBehaviorRaw, withSwipeBehaviorRaw | useSwipeBehavior, withSwipeBehavior | SwipeBehavior | useThemeParamsRaw, withThemeParamsRaw | useThemeParams, withThemeParams | ThemeParams | useUtilsRaw, withUtilsRaw | useUtils, withUtils | Utils | useViewportRaw, withViewportRaw | useViewport, withViewport | Viewport 或 undefined |
9 W( u7 j6 `& |; M2 |# m$ y模板我们已经创建了一个用于 React JS 的 模板,它使用了当前软件包,因此您可以使用它。
' a7 H, ~' i4 v* s
2 t6 R( p, i @( }' \ |