@solana/react-hooks

@solana/react-hooks добавляет React-провайдер, хуки и удобные для suspense хелперы для запросов поверх @solana/client. Вы по-прежнему настраиваете один клиент, но хуки предоставляют доступ к состоянию кошелька, балансу, транзакциям и программным запросам без ручной настройки хранилищ или подписок.

Установка

Terminal
$
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 (
<form
onSubmit={(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?

Управляется

© 2026 Фонд Solana.
Все права защищены.
Подключиться