MongoDB Charts incorporando SDK com React
Avalie esse Tutorial
Na postagem de blog anterior desta série, criamos um site da React que estava recuperando uma lista de países usando o Axios e uma REST API hospedada no MongoDB Realm.
Nesta publicação do blog, continuaremos a desenvolver esta base e a criar um painel com gráficosCOVID-19 , criado com oMongoDB Charts e incorporado em um website React com o SDK de Incorporação do MongoDB Charts.
Para adicionar um pouco de tempero à mistura, usaremos nossa lista de países para criar um filtro dinâmico para que possamos filtrar todos os gráficos de COVID-19 por país.
Você pode ver o resultado final aqui que hospedei em um aplicativoMongoDB Realm usando o recurso de hospedagem estática disponível.
1 git clone git@github.com:mongodb-developer/mongodb-charts-embedded-react.git
Para executar este projeto, você precisará do
node
e npm
em uma versão recente. Aqui está o que estou usando atualmente:1 node -v 2 v14.17.1 3 npm -v 4 8.0.0
Você pode executar o projeto localmente da seguinte forma:
1 cd mongodb-realm-react-charts 2 npm install 3 npm start
Nas próximas seções desta postagem do blog, explicarei o que precisamos fazer para que este projeto funcione.
Antes de podermos incorporar nossos gráficos em nosso site React personalizado, precisamos criá-los no MongoDB Charts.
Se você quiser usar os mesmos dados que eu, confira esta publicação do blog sobre o Projeto Open Data CLI-19 e, especialmente , esta seção para duplicar os dados em seu próprio cluster no MongoDB Atlas.
Como você pode ver no painel, meus gráficos não são filtrados por país aqui. Você pode encontrar os dados de todos os países nos quatro gráficos que criei.
Para habilitar a filtragem quando estou incorporando meus gráficos em meu site, devo informar ao MongoDB Charts por qual(is) campo(s) poderei filtrar, com base nos campos disponíveis em minha coleção. Aqui, optei por filtrar por um único campo,
country
, e habilitei o acesso não autenticado para esta postagem pública no blog (veja abaixo).No campo
User Specified Filters
, adicionei country
e optou por usar a opção JavaScript SDK em vez da alternativa iFrame que é menos conveniente de usar em um site React com filtros dinâmicos.Para cada um dos quatro gráficos, preciso recuperar o
Charts Base URL
(exclusivo para um painel) e o Charts IDs
.Agora que temos tudo o que precisamos, podemos ir para o código React.
1 npm i @mongodb-js/charts-embed-dom
Ele já está feito no projeto que forneci acima, mas não é feito se você estiver seguindo desde a primeira postagem do blog.
A raiz
index.js
do projeto está apenas chamando o componente de funçãoDashboard
.1 import React from 'react'; 2 import ReactDOM from 'react-dom'; 3 import Dashboard from "./Dashboard"; 4 5 ReactDOM.render(<React.StrictMode> 6 <Dashboard/> 7 </React.StrictMode>, document.getElementById('root'));
O
Dashboard
é a peça central do projeto:1 import './Dashboard.css'; 2 import {useEffect, useState} from "react"; 3 import axios from "axios"; 4 import Chart from "./Chart"; 5 6 const Dashboard = () => { 7 const url = 'https://webhooks.mongodb-stitch.com/api/client/v2.0/app/covid-19-qppza/service/REST-API/incoming_webhook/metadata'; 8 const [countries, setCountries] = useState([]); 9 const [selectedCountry, setSelectedCountry] = useState(""); 10 const [filterCountry, setFilterCountry] = useState({}); 11 12 function getRandomInt(max) { 13 return Math.floor(Math.random() * max); 14 } 15 16 useEffect(() => { 17 axios.get(url).then(res => { 18 setCountries(res.data.countries); 19 const randomCountryNumber = getRandomInt(res.data.countries.length); 20 let randomCountry = res.data.countries[randomCountryNumber]; 21 setSelectedCountry(randomCountry); 22 setFilterCountry({"country": randomCountry}); 23 }) 24 }, []) 25 26 useEffect(() => { 27 if (selectedCountry !== "") { 28 setFilterCountry({"country": selectedCountry}); 29 } 30 }, [selectedCountry]) 31 32 return <div className="App"> 33 <h1 className="title">MongoDB Charts</h1> 34 <h2 className="title">COVID-19 Dashboard with Filters</h2> 35 <div className="form"> 36 {countries.map(c => <div className="elem" key={c}> 37 <input type="radio" name="country" value={c} onChange={() => setSelectedCountry(c)} checked={c === selectedCountry}/> 38 <label htmlFor={c} title={c}>{c}</label> 39 </div>)} 40 </div> 41 <div className="charts"> 42 <Chart height={'600px'} width={'800px'} filter={filterCountry} chartId={'6e3cc5ef-2be2-421a-b913-512c80f492b3'}/> 43 <Chart height={'600px'} width={'800px'} filter={filterCountry} chartId={'be3faa53-220c-438f-aed8-3708203b0a67'}/> 44 <Chart height={'600px'} width={'800px'} filter={filterCountry} chartId={'7ebbba33-a92a-46a5-9e80-ba7e8f3b13de'}/> 45 <Chart height={'600px'} width={'800px'} filter={filterCountry} chartId={'64f3435e-3b83-4478-8bbc-02a695c1a8e2'}/> 46 </div> 47 </div> 48 }; 49 50 export default Dashboard;
Ele é responsável por algumas coisas:
- Linha 17 - Recupere a lista de países da REST API usando Axios (consulte a postagem anterior do blog).
- Linhas 18-22 - Selecione um país aleatório na lista para o valor inicial.
- Linhas 22 e 26 - Atualizam o filtro quando um novo valor é selecionado (aleatório ou manual).
- Linha 32
counties.map(...)
- Use a lista de países para construir uma lista de botões de opção para atualizar o filtro. - Linha 32
<Charts .../> x4
- Chame o componenteChart
uma vez para cada gráfico com os acessórios apropriados, incluindo o filtro e a ID do gráfico.
Como você deve ter notado aqui, estou usando o mesmo filtro
fitlerCountry
para todos os gráficos, mas nada me impede de usar um filtro personalizado para cada gráfico.Você também deve ter notado um arquivo CSS bem minimalista
Dashboard.css
. Aqui está:1 .title { 2 text-align: center; 3 } 4 5 .form { 6 border: solid black 1px; 7 } 8 9 .elem { 10 overflow: hidden; 11 display: inline-block; 12 width: 150px; 13 height: 20px; 14 } 15 16 .charts { 17 text-align: center; 18 } 19 20 .chart { 21 border: solid #589636 1px; 22 margin: 5px; 23 display: inline-block; 24 }
O componente
Chart
tem esta aparência:1 import React, {useEffect, useRef, useState} from 'react'; 2 import ChartsEmbedSDK from "@mongodb-js/charts-embed-dom"; 3 4 const Chart = ({filter, chartId, height, width}) => { 5 const sdk = new ChartsEmbedSDK({baseUrl: 'https://charts.mongodb.com/charts-open-data-covid-19-zddgb'}); 6 const chartDiv = useRef(null); 7 const [rendered, setRendered] = useState(false); 8 const [chart] = useState(sdk.createChart({chartId: chartId, height: height, width: width, theme: "dark"})); 9 10 useEffect(() => { 11 chart.render(chartDiv.current).then(() => setRendered(true)).catch(err => console.log("Error during Charts rendering.", err)); 12 }, [chart]); 13 14 useEffect(() => { 15 if (rendered) { 16 chart.setFilter(filter).catch(err => console.log("Error while filtering.", err)); 17 } 18 }, [chart, filter, rendered]); 19 20 return <div className="chart" ref={chartDiv}/>; 21 }; 22 23 export default Chart;
O componente
Chart
não está fazendo muita coisa. É responsável apenas por renderizar o gráfico uma vez quando a página é carregada e recarregar o gráfico se o filtro for atualizado para exibir os dados corretos (graças ao React).Observe que o segundo useEffect (com a chamada
chart.setFilter(filter)
) não deve ser executado se o gráfico não tiver sido renderizado. Portanto, ele é protegido pelo estadorendered
que só é definido como true
quando o gráfico é renderizado na tela.Nesta publicação do blog, você aprenderá como incorporar MongoDB Charts em um siteReact usando o MongoDB Charts Embedding SDK.
Também aprenderam como criar filtros dinâmicos para os Atlas Charts usando
useEffect()
.Não aprenderam como proteger os Charts com um token de autenticação, mas você pode aprender como fazer isso nesta documentação.
Se tiver dúvidas, acesse o site da nossa comunidade de desenvolvedores, no qual os engenheiros e a comunidade do MongoDB ajudarão você a desenvolver sua próxima grande ideia com o MongoDB.
Relacionado
Artigo
Realm Atlas Triggers Mimos e Triggers - Agendamento trigger baseado em documentos
Sep 09, 2024 | 5 min read
Tutorial
Integre os registros do Atlas Application Services no Datadog na AWS
Sep 09, 2024 | 2 min read