DevToolsManager
class DevToolsManager implements Manager
Integra-se ao Redux DevTools para acompanhar o estado e as actions. Nota: não integra o time-travel.
Adicione a extensão do Chrome ou a extensão do Firefox ao seu navegador para começar.
DevToolsManager implementa Manager
constructor(options?, skipLogging?)
options
Argumentos a enviar ao redux devtools.
Por exemplo, podemos habilitar a opção trace para ajudar a descobrir de onde as actions são despachadas.
- Web
- React Native
- NextJS
- Expo
import { DataProvider, getDefaultManagers } from '@data-client/react';
import { createRoot } from 'react-dom/client';
import App from './App';
const managers = getDefaultManagers({
devToolsManager: { trace: true },
});
createRoot(document.body).render(
<DataProvider managers={managers}>
<App />
</DataProvider>,
);
import { DataProvider, getDefaultManagers } from '@data-client/react';
import { AppRegistry } from 'react-native';
import App from './App';
const managers = getDefaultManagers({
devToolsManager: { trace: true },
});
const Root = () => (
<DataProvider managers={managers}>
<App />
</DataProvider>
);
AppRegistry.registerComponent('MyApp', () => Root);
'use client';
import { getDefaultManagers } from '@data-client/react';
import { DataProvider } from '@data-client/react/nextjs';
const managers = getDefaultManagers({
devToolsManager: { trace: true },
});
export default function Provider({
children,
}: {
children: React.ReactNode;
}) {
return <DataProvider managers={managers}>{children}</DataProvider>;
}
import Provider from './Provider';
export default function RootLayout({ children }) {
return (
<html>
<body>
<Provider>{children}</Provider>
</body>
</html>
);
}
import { Stack } from 'expo-router';
import { DataProvider, getDefaultManagers } from '@data-client/react';
const managers = getDefaultManagers({
devToolsManager: { trace: true },
});
export default function RootLayout() {
return (
<DataProvider managers={managers}>
<Stack>
<Stack.Screen name="index" />
</Stack>
</DataProvider>
);
}
skipLogging
(action: ActionTypes) => boolean
Permite ignorar o registro de algumas actions no devtool do navegador.
Por padrão, ignora as fetch actions em andamento
- Web
- React Native
- NextJS
- Expo
import {
DataProvider,
DevToolsManager,
getDefaultManagers,
} from '@data-client/react';
import { createRoot } from 'react-dom/client';
import App from './App';
// production builds leave out DevToolsManager
const managers = getDefaultManagers({
devToolsManager: new DevToolsManager(undefined, () => true),
});
createRoot(document.body).render(
<DataProvider managers={managers}>
<App />
</DataProvider>,
);
import {
DataProvider,
DevToolsManager,
getDefaultManagers,
} from '@data-client/react';
import { AppRegistry } from 'react-native';
import App from './App';
// production builds leave out DevToolsManager
const managers = getDefaultManagers({
devToolsManager: new DevToolsManager(undefined, () => true),
});
const Root = () => (
<DataProvider managers={managers}>
<App />
</DataProvider>
);
AppRegistry.registerComponent('MyApp', () => Root);
'use client';
import { DevToolsManager, getDefaultManagers } from '@data-client/react';
import { DataProvider } from '@data-client/react/nextjs';
// production builds leave out DevToolsManager
const managers = getDefaultManagers({
devToolsManager: new DevToolsManager(undefined, () => true),
});
export default function Provider({
children,
}: {
children: React.ReactNode;
}) {
return <DataProvider managers={managers}>{children}</DataProvider>;
}
import Provider from './Provider';
export default function RootLayout({ children }) {
return (
<html>
<body>
<Provider>{children}</Provider>
</body>
</html>
);
}
import { Stack } from 'expo-router';
import {
DataProvider,
DevToolsManager,
getDefaultManagers,
} from '@data-client/react';
// production builds leave out DevToolsManager
const managers = getDefaultManagers({
devToolsManager: new DevToolsManager(undefined, () => true),
});
export default function RootLayout() {
return (
<DataProvider managers={managers}>
<Stack>
<Stack.Screen name="index" />
</Stack>
</DataProvider>
);
}
Ignorando atualizações de alta frequência
Ao usar WebSockets ou outras fontes de dados em tempo real,
atualizações de alta frequência podem sobrecarregar a extensão DevTools. Use a opção predicate para
filtrar tipos de action ou schemas específicos:
import { getDefaultManagers, actionTypes } from '@data-client/react';
import { Ticker } from './resources/Ticker';
const managers = getDefaultManagers({
devToolsManager: {
// Increase latency buffer for high-frequency updates
latency: 1000,
// Skip WebSocket SET actions for Ticker to reduce log spam
// (including batched set([Ticker], rows) writes)
predicate: (state, action) =>
action.type !== actionTypes.SET ||
(action.schema !== Ticker && action.schema[0] !== Ticker),
},
});
Acesso programático à store
Em modo de desenvolvimento, o DevToolsManager registra cada Controller em
globalThis.__DC_CONTROLLERS__ — um Map indexado pelo nome da conexão do devtools. Isso funciona
em navegadores, React Native e Node.
// List all registered providers
__DC_CONTROLLERS__.keys();
// Get state from the first provider
__DC_CONTROLLERS__.values().next().value.getState();
// Get state by name
__DC_CONTROLLERS__.get('Data Client: My App').getState();
Isso é útil para assistentes de programação com IA que usam o Chrome DevTools MCP ou o Expo MCP para inspecionar e interagir programaticamente com a store. Cada DataProvider se registra de forma independente, portanto vários providers na mesma página são totalmente suportados.
Os Controllers são removidos do mapa quando cleanup() é chamado.
Mais informações
Usar este Manager permite depurar e inspecionar a store no navegador.