Desarrollar un dashboard interactivo y visualmente intuitivo utilizando tecnologías web modernas, como React, que permita a los usuarios monitorear en tiempo real métricas clave del clima.
En src/components/IndicatorWeather.tsx, con el siguiente código:
Componente IndicatorWeather
: export default function IndicatorWeather() {
return (
<>
Componente IndicatorWeather
</>
)
}
En App.tsx:
<IndicatorWeather />
en el Grid. import IndicatorWeather from './components/IndicatorWeather';
function App() {
return (
<Grid container spacing={5}>
{/* Indicadores */}
<Grid size={ ... }> <IndicatorWeather /> </Grid>
<Grid size={ ... }> <IndicatorWeather /> </Grid>
<Grid size={ ... }> <IndicatorWeather /> </Grid>
<Grid size={ ... }> <IndicatorWeather /> </Grid>
...
</Grid>
)
}
export default App
En src/components/IndicatorWeather.tsx:
...
interface Indicator {
title?: String;
subtitle?: String;
value?: String;
}
export default function IndicatorWeather(config: Indicator) {
return (
<>
{config.title}<br/>
{config.value}<br/>
{config.subtitle}
</>
)
}
En App.tsx:
import IndicatorWeather from './components/IndicatorWeather';
function App() {
return (
<Grid container spacing={5}>
{/* Indicadores */}
<Grid size={ ... }>
<IndicatorWeather title={'Indicator 1'} subtitle={'Unidad 1'} value={"1.23"} />
</Grid>
<Grid size={ ... }>
<IndicatorWeather title={'Indicator 2'} subtitle={'Unidad 2'} value={"3.12"} />
</Grid>
<Grid size={ ... }>
<IndicatorWeather title={'Indicator 3'} subtitle={'Unidad 3'} value={"2.31"} />
</Grid>
<Grid size={ ... }>
<IndicatorWeather title={'Indicator 4'} subtitle={'Unidad 4'} value={"3.21"} />
</Grid>
...
</Grid>
)
}
export default App
En src/components/IndicatorWeather.tsx:
import Typography from '@mui/material/Typography';
import Paper from '@mui/material/Paper';
interface Indicator { ... }
export default function IndicatorWeather(config: Indicator) {
return (
<Paper
sx={{
p: 2,
display: 'flex',
flexDirection: 'column'
}}
>
<Typography component="h2" variant="h6"
color="primary" gutterBottom>
{config.title}
</Typography>
<Typography component="p" variant="h4">
{config.value}
</Typography>
<Typography color="text.secondary" sx={{ flex: 1 }}>
{config.subtitle}
</Typography>
</Paper>
)
}
En src/components/ControlWeather.tsx, con el siguiente código:
{/* Componentes MUI */}
import Paper from '@mui/material/Paper';
import Typography from '@mui/material/Typography';
import Box from '@mui/material/Box';
import InputLabel from '@mui/material/InputLabel';
import MenuItem from '@mui/material/MenuItem';
import FormControl from '@mui/material/FormControl';
import Select from '@mui/material/Select';
export default function ControlWeather() {
{/* Arreglo de objetos */}
let items = [
{"name":"Precipitación", "description":"Cantidad de agua que cae sobre una superficie en un período específico."},
{"name": "Humedad", "description":"Cantidad de vapor de agua presente en el aire, generalmente expresada como un porcentaje."},
{"name":"Nubosidad", "description":"Grado de cobertura del cielo por nubes, afectando la visibilidad y la cantidad de luz solar recibida."}
]
{/* Arreglo de elementos JSX */}
let options = items.map( (item, key) => <MenuItem key={key} value={key}>{item["name"]}</MenuItem> )
{/* JSX */}
return (
<Paper
sx={{
p: 2,
display: 'flex',
flexDirection: 'column'
}}
>
<Typography mb={2} component="h3" variant="h6" color="primary">
Variables Meteorológicas
</Typography>
<Box sx={{ minWidth: 120 }}>
<FormControl fullWidth>
<InputLabel id="simple-select-label">Variables</InputLabel>
<Select
labelId="simple-select-label"
id="simple-select"
label="Variables"
defaultValue='-1'
>
<MenuItem key="-1" value="-1" disabled>Seleccione una variable</MenuItem>
{options}
</Select>
</FormControl>
</Box>
</Paper>
)
}
Cree el componente src/components/TableWeather.tsx, y:
import * as React from 'react';
sx
en el elemento <Table />
.En App.tsx:
<TableWeather/>
y <ControlWeather />
en el Grid. ...
import TableWeather from './components/TableWeather';
import ControlWeather from './components/ControlWeather';
function App() {
return (
<Grid container spacing={5}>
...
{/* Tabla */}
<Grid size={ ... }>
{/* Grid Anidado */}
<Grid container spacing={2}>
<Grid size={{ xs: 12, xl: 3 }}>
<ControlWeather/>
</Grid>
<Grid size={{ xs: 12, xl: 9 }}>
<TableWeather/>
</Grid>
</Grid>
</Grid>
...
</Grid>
)
}
export default App
Desde la línea de comandos, instale React MUI X con:
npm install @mui/x-charts
Cree el componente src/components/LineChartWeather.tsx, con el siguiente código:
import Paper from '@mui/material/Paper';
import { LineChart } from '@mui/x-charts/LineChart';
const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490];
const pData = [2400, 1398, 9800, 3908, 4800, 3800, 4300];
const xLabels = [
'Page A',
'Page B',
'Page C',
'Page D',
'Page E',
'Page F',
'Page G',
];
export default function LineChartWeather() {
return (
<Paper
sx={{
p: 2,
display: 'flex',
flexDirection: 'column'
}}
>
{/* Componente para un gráfico de líneas */}
<LineChart
width={400}
height={250}
series={[
{ data: pData, label: 'pv' },
{ data: uData, label: 'uv' },
]}
xAxis={[{ scaleType: 'point', data: xLabels }]}
/>
</Paper>
);
}
En App.tsx:
<LineChartWeather />
en el Grid. ...
import LineChartWeather from './components/LineChartWeather';
function App() {
return (
<Grid container spacing={5}>
...
{/* Gráfico */}
<Grid size={ ... }>
<LineChartWeather/>
</Grid>
</Grid>
)
}
export default App
⚛️ Do you know how to name React components with the Base + Composite + Suffix Pattern?
— George Moller (@_georgemoller) November 6, 2023
You can use this pattern to create clear and consistent component names in your projects. pic.twitter.com/xxopzpmvwJ
component, interface, props