# React Native
URL: /docs/examples/react-native.mdx
Integre a API brapi.dev em aplicações React Native. Componentes para exibir cotações de ações da B3 em apps mobile.
***
title: 'React Native'
description: >-
Integre a API brapi.dev em aplicações React Native. Componentes para exibir
cotações de ações da B3 em apps mobile.
full: false
keywords: brapi, api, react native, mobile, cotações, hooks
openGraph:
title: Integração React Native - brapi.dev
description: Componentes React Native para cotações da B3
type: website
locale: pt\_BR
lastUpdated: '2025-10-12T17:30:00.000Z'
lang: pt-BR
-----------
Integre a API brapi.dev em suas aplicações React Native.
## Componente Básico
```javascript
import React, { useState, useEffect } from 'react';
import { View, Text, StyleSheet, ActivityIndicator } from 'react-native';
const StockPrice = ({ ticker }) => {
const [price, setPrice] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const token = 'SEU_TOKEN';
const fetchPrice = async () => {
try {
const response = await fetch(
`https://brapi.dev/api/quote/${ticker}?token=${token}`
);
if (!response.ok) {
throw new Error('Erro ao buscar cotação');
}
const data = await response.json();
setPrice(data.results[0]);
} catch (error) {
setError(error.message);
} finally {
setLoading(false);
}
};
fetchPrice();
}, [ticker]);
if (loading) {
return (
);
}
if (error) {
return (
{error}
);
}
if (!price) return null;
const isPositive = price.regularMarketChangePercent > 0;
return (
{price.symbol}
{price.shortName}
R$ {price.regularMarketPrice.toFixed(2)}
{isPositive ? '+' : ''}{price.regularMarketChangePercent.toFixed(2)}%
);
};
const styles = StyleSheet.create({
container: {
padding: 16,
backgroundColor: '#ffffff',
borderRadius: 12,
marginBottom: 12,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
elevation: 3,
},
ticker: {
fontSize: 18,
fontWeight: 'bold',
color: '#333',
},
name: {
fontSize: 14,
color: '#666',
marginTop: 4,
},
price: {
fontSize: 24,
fontWeight: 'bold',
color: '#000',
marginTop: 8,
},
change: {
fontSize: 16,
fontWeight: '600',
marginTop: 4,
},
positive: {
color: '#10b981',
},
negative: {
color: '#ef4444',
},
error: {
color: '#ef4444',
fontSize: 14,
},
});
export default StockPrice;
```
## Com Custom Hook
```javascript
import { useState, useEffect } from 'react';
const useBrapiQuote = (ticker, token) => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
let isMounted = true;
const fetchQuote = async () => {
try {
const response = await fetch(
`https://brapi.dev/api/quote/${ticker}?token=${token}`
);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const json = await response.json();
if (isMounted) {
setData(json.results[0]);
setError(null);
}
} catch (err) {
if (isMounted) {
setError(err.message);
setData(null);
}
} finally {
if (isMounted) {
setLoading(false);
}
}
};
fetchQuote();
return () => {
isMounted = false;
};
}, [ticker, token]);
return { data, loading, error };
};
// Uso
const StockCard = ({ ticker }) => {
const { data, loading, error } = useBrapiQuote(ticker, 'SEU_TOKEN');
if (loading) return ;
if (error) return Erro: {error};
if (!data) return null;
return (
{data.symbol}: R$ {data.regularMarketPrice.toFixed(2)}
);
};
```
## Lista de Cotações
```javascript
import React from 'react';
import { FlatList, View } from 'react-native';
const StockList = () => {
const tickers = ['PETR4', 'VALE3', 'ITUB4', 'BBDC4', 'MGLU3'];
return (
item}
renderItem={({ item }) => }
contentContainerStyle={{ padding: 16 }}
/>
);
};
```
## Próximos Passos
* Veja exemplos em [TypeScript](/docs/examples/typescript)
* Explore [outros exemplos](/docs/examples)