@solana/react-hooks добавляет React-провайдер, хуки и удобные для suspense
хелперы для запросов поверх @solana/client. Вы по-прежнему настраиваете один
клиент, но хуки предоставляют доступ к состоянию кошелька, балансу, транзакциям
и программным запросам без ручной настройки хранилищ или подписок.
Установка
$npm install @solana/client @solana/react-hooks
Оба пакета необходимы, потому что хуки используют рантайм клиента для управления кошельками, RPC и кэшами.
Оберните дерево один раз
Создайте клиент, при необходимости выберите коннекторы кошелька, затем оберните
ваше React-дерево в SolanaProvider. Каждый хук читает из общего экземпляра
клиента.
"use client";import { autoDiscover, createClient } from "@solana/client";import { SolanaProvider } from "@solana/react-hooks";const client = createClient({endpoint: "https://api.devnet.solana.com",websocketEndpoint: "wss://api.devnet.solana.com",walletConnectors: autoDiscover()});export function Providers({ children }: { children: React.ReactNode }) {return <SolanaProvider client={client}>{children}</SolanaProvider>;}
Хуки повторяют логику рантайма клиента
- Кошелёк + коннекторы:
useWallet,useWalletConnection,useConnectWalletиuseDisconnectWalletпредоставляют тот же реестр, который используется клиентом. - Баланс + отслеживание аккаунтов:
useBalance,useAccount,useSolBalance, иuseProgramAccountsтранслируют обновления от внутренних вотчеров и разделяют кэш с действиями. - Транзакции + SPL-хелперы:
useSolTransfer,useSplToken,useTransactionPoolиuseSendTransactionиспользуют набор хелперов клиента, поэтому хуки наследуют обновление blockhash, определение fee payer и логирование.
function WalletPanel() {const { connectors, connect, disconnect, wallet, status } =useWalletConnection();const balance = useBalance(wallet?.account.address);if (status === "connected") {return (<div><p>{wallet?.account.address.toString()}</p><p>Lamports: {balance.lamports?.toString() ?? "loading…"}</p><button onClick={disconnect}>Disconnect</button></div>);}return (<div>{connectors.map((connector) => (<button key={connector.id} onClick={() => connect(connector.id)}>Connect {connector.name}</button>))}</div>);}
Паттерны запросов и кэширования
SolanaQueryProvider добавляет совместимые с React Query примитивы поверх
хранилища клиента, чтобы Solana-специфичные запросы могли приостанавливаться,
обновляться и синхронизироваться с подписками программ.
import { SolanaQueryProvider, useProgramAccounts } from "@solana/react-hooks";function ProgramAccounts({ program }: { program: string }) {const query = useProgramAccounts(program);if (query.isLoading) return <p>Loading…</p>;if (query.isError) return <p role="alert">RPC error</p>;return (<div><button onClick={() => query.refresh()}>Refresh</button><ul>{query.accounts.map(({ pubkey }) => (<li key={pubkey.toString()}>{pubkey.toString()}</li>))}</ul></div>);}export function ProgramAccountsSection({ program }: { program: string }) {return (<SolanaQueryProvider><ProgramAccounts program={program} /></SolanaQueryProvider>);}
Декларативные потоки транзакций
Хуки предоставляют те же хелперы для транзакций, что и клиент, но берут на себя управление состояниями загрузки и ошибок. Используйте их для переводов SOL, работы с токенами SPL или произвольных пакетов инструкций.
import { useSolTransfer } from "@solana/react-hooks";function SolTransferForm({ destination }: { destination: string }) {const transfer = useSolTransfer();return (<formonSubmit={(event) => {event.preventDefault();void transfer.send({ destination, lamports: 100_000_000n });}}><button type="submit" disabled={transfer.isSending}>{transfer.isSending ? "Sending…" : "Send 0.1 SOL"}</button>{transfer.signature ? <p>Signature: {transfer.signature}</p> : null}{transfer.error ? <p role="alert">{String(transfer.error)}</p> : null}</form>);}
Нужны сырые инструкции? useSendTransaction принимает instructions и
необязательные переопределения prepare, предоставляя вам сигнатуру и
отслеживание статуса после завершения запроса.
import { useSendTransaction, useWallet } from "@solana/react-hooks";import { getTransferSolInstruction } from "@solana-program/system";import { address, lamports } from "@solana/kit";function CustomTransactionForm({ destination }: { destination: string }) {const wallet = useWallet();const { send, isSending, signature, error } = useSendTransaction();async function handleSend() {if (wallet.status !== "connected") return;const instruction = getTransferSolInstruction({source: wallet.session.account,destination: address(destination),amount: lamports(100_000_000n)});await send({ instructions: [instruction] });}return (<div><button onClick={handleSend} disabled={isSending}>{isSending ? "Sending…" : "Send 0.1 SOL"}</button>{signature ? <p>Signature: {signature}</p> : null}{error ? <p role="alert">{String(error)}</p> : null}</div>);}
Общие паттерны для Solana-разработчиков
- Общий runtime, несколько приложений: Настройте клиент один раз (например, в core- пакете) и используйте его в вебе, мобильном вебе или встроенных React-островках.
- UI-first разработка: Хуки повторяют самые распространённые сценарии работы с Solana (подключение кошелька, получение баланса, отправка SOL, чтение SPL-баланса), чтобы вы могли сосредоточиться на UX, а не на RPC-интеграции.
- Постепенное улучшение: Начните с headless-режима с помощью
@solana/client, затем добавьте хуки в те области, где вам нужны React-состояния и удобная работа с данными через suspense. - Тестирование: Мокайте возвращаемые значения хуков или передавайте мокнутый
клиент в
SolanaProvider, чтобы симулировать кошельки, успешные или неудачные RPC-запросы в юнит-тестах. - Поддержка server components: Помечайте только конечные компоненты,
вызывающие хуки, с помощью
"use client"; всё остальное может оставаться на сервере и получать гидратированные пропсы от дочерних компонентов с хуками.
Используйте это руководство вместе с @solana/client overview, чтобы понять, на каком runtime строится каждый хук.
Is this page helpful?