Skip to content

Commit cfafa21

Browse files
committed
Versión sin subcomponentes
1 parent 617e281 commit cfafa21

2 files changed

Lines changed: 57 additions & 140 deletions

File tree

geoapp/src/components/TableList/TableList.js

Lines changed: 22 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,5 @@
11
import React, { Component } from "react";
22
import PubSub from "pubsub-js";
3-
// import './TableList.css';
4-
5-
const TableHeader = (props) => {
6-
if (props) {
7-
let features = props.features;
8-
if (features) {
9-
let rowName = "";
10-
features.map((f) => {
11-
rowName = Object.keys(f.properties);
12-
});
13-
14-
return (
15-
<thead>
16-
<tr>
17-
<th> </th>
18-
{rowName.map((th) => (
19-
<th> {th.toUpperCase()} </th>
20-
))}
21-
</tr>
22-
</thead>
23-
);
24-
}
25-
}
26-
};
27-
28-
const TableRows = (props) => {
29-
if (props) {
30-
let features = props.features;
31-
if (features) {
32-
let row = "";
33-
features.map((f) => {
34-
row = Object.values(f.properties);
35-
});
36-
37-
return (
38-
<tbody>
39-
{features &&
40-
features.map((f) => (
41-
<tr key={f.id}>
42-
<td>
43-
<ButtonZoom coor={f.geometry.coordinates} />
44-
</td>
45-
{row.map((td) => (
46-
<td> {td} </td>
47-
))}
48-
</tr>
49-
))}
50-
</tbody>
51-
);
52-
}
53-
}
54-
};
553

564
class ButtonZoom extends Component {
575
zoomFeatrue = () => {
@@ -68,11 +16,8 @@ class ButtonZoom extends Component {
6816
);
6917
}
7018
}
71-
7219
export default class TableList extends Component {
73-
7420
render() {
75-
7621
const { features } = this.props.data;
7722

7823
if (!features) {
@@ -84,11 +29,29 @@ export default class TableList extends Component {
8429
);
8530
} else {
8631
return (
87-
<table className="table table-striped">
88-
<TableHeader features={features} />
89-
<TableRows features={features} />
32+
<table className="table table-striped">
33+
<thead>
34+
<tr>
35+
<th> </th>
36+
<th>CODMUN</th>
37+
<th>CENTRO</th>
38+
<th>TIPO CENTRO</th>
39+
<th>TITULARIDAD</th>
40+
</tr>
41+
</thead>
42+
<tbody>
43+
{features &&
44+
features.map((f) => (
45+
<tr key={f.id}>
46+
<td> <ButtonZoom coor={f.geometry.coordinates} /> </td>
47+
<td> {f.properties.codmun} </td>
48+
<td> {f.properties.centro} </td>
49+
<td> {f.properties.tipocentro} </td>
50+
<td> {f.properties.titularida} </td>
51+
</tr>
52+
))}
53+
</tbody>
9054
</table>
91-
9255
);
9356
}
9457
}

sprint.md

Lines changed: 35 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -38,74 +38,7 @@ Los temas aprendidos sobre React a partir del desarrollo de estas tareas son los
3838

3939
En este último componente vamos a **presentar en formato tabla los resultados obtenidos desde el servicio WFS** de la Junta de Andalucía con datos sobre servicios sanitarios. Son los mismos datos que usamos para [añadir el GeoJSON al mapa](http://www.sigdeletras.com/2020/side-project-4-react-y-leaflet-wfs/).
4040

41-
Queremos que sea totalmente reutilizable. Es decir en un futuro desarrollo una funcionalidad que permitiera consultar otra capa de datos, seguramente los atributos (properties) serían distintas respecto a su denominación y número.Para solucionar esto he creado dentro *TableList* dos "subcompontes" funcionales.
42-
43-
El primero llamado *TableHeader* se va a encargar de obtener los nombres de las columnas. La información se encuentra del objeto GeoJSON. He usado la función *map()* para obtener los datos y el método [Object.keys()](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Object/keys) que devuelve un array de las propiedades *names* del objeto. Los datos los añadimos al elemento *th* dentro de la tabla.
44-
45-
```javascript
46-
//TableList.js
47-
...
48-
const TableHeader = (props) => {
49-
if (props) {
50-
let features = props.features;
51-
if (features) {
52-
let rowName = "";
53-
features.map((f) => {
54-
rowName = Object.keys(f.properties);
55-
});
56-
57-
return (
58-
<thead>
59-
<tr>
60-
<th> </th>
61-
{rowName.map((th) => (
62-
<th> {th.toUpperCase()} </th>
63-
))}
64-
</tr>
65-
</thead>
66-
);
67-
}
68-
}
69-
};
70-
71-
```
72-
73-
Para las filas, seguimos el mismo procedimiento, pero en esta ocasión usamos [Object.values()](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Object/values) que *"devuelve un array con los valores correspondientes a las propiedades enumerables de un objeto".*
74-
75-
```javascript
76-
//TableList.js
77-
...
78-
const TableRows = (props) => {
79-
if (props) {
80-
let features = props.features;
81-
if (features) {
82-
let row = "";
83-
features.map((f) => {
84-
row = Object.values(f.properties);
85-
});
86-
87-
return (
88-
<tbody>
89-
{features &&
90-
features.map((f) => (
91-
<tr key={f.id}>
92-
<td>
93-
<ButtonZoom coor={f.geometry.coordinates} />
94-
</td>
95-
{row.map((td) => (
96-
<td> {td} </td>
97-
))}
98-
</tr>
99-
))}
100-
</tbody>
101-
);
102-
}
103-
}
104-
};
105-
...
106-
```
107-
108-
El componente *TableList* quedará así.
41+
Para el componente usamos los datos que nos vienen desde sus propiedades y montamos una tabla con cabecera y cuerpo de datos que devuelve la información usando la función map(). El componente *TableList* quedará así.
10942

11043
```javascript
11144
//TablaList
@@ -114,33 +47,54 @@ export default class TableList extends Component {
11447
render() {
11548
const { features } = this.props.data;
11649

117-
if (!features) {
50+
if (!features) {
11851
return (
11952
<p className="col-12 text-center mt-4 font-weight-bold">
120-
Select a municipality from the list. <br /> Then press the <i>Load</i> button
53+
Select a municipality from the list. <br /> Then press the Load button
12154
to view the results
12255
</p>
12356
);
12457
} else {
12558
return (
12659
<table className="table table-striped">
127-
<TableHeader features={features} />
128-
<TableRows features={features} />
60+
<thead>
61+
<tr>
62+
<th> </th>
63+
<th>CODMUN</th>
64+
<th>CENTRO</th>
65+
<th>TIPO CENTRO</th>
66+
<th>TITULARIDAD</th>
67+
</tr>
68+
</thead>
69+
<tbody>
70+
{features &&
71+
features.map((f) => (
72+
<tr key={f.id}>
73+
<td> <ButtonZoom coor={f.geometry.coordinates} /> </td>
74+
<td> {f.properties.codmun} </td>
75+
<td> {f.properties.centro} </td>
76+
<td> {f.properties.tipocentro} </td>
77+
<td> {f.properties.titularida} </td>
78+
</tr>
79+
))}
80+
</tbody>
12981
</table>
13082
);
13183
}
13284
}
13385
}
86+
87+
Para futuras mejoras, se debería refactorizar el código y que pudiera servir para cualquier tipo de datos temáticos que se consultaran. Ahora mismos está desarrollado pensando en el modelo de datos de servicios sanitarios.
88+
13489
```
13590

13691
# Implementando un botón de zum con el patrón de diseño Pub-Sub.
13792

138-
Es interesante añadir un **bótón que permita hacer zum al elemento dentro desde la tabla**. Para obtener una comunicación directa entre componentes, y que permita usar ejecutar el método *flyTo()* de Leaflet en el compomente *MapView*, he usado el [**patrón de diseño **observador**](https://es.wikipedia.org/wiki/Observer_(patr%C3%B3n_de_dise%C3%B1o))
139-
93+
Es interesante añadir un **bótón que permita hacer zum al elemento dentro desde la tabla**. Para obtener una comunicación directa entre componentes, y que ejecute el método *flyTo()* de Leaflet en el compomente *MapView*, he usado el [**patrón de diseño **Observador**](https://es.wikipedia.org/wiki/Observer_(patr%C3%B3n_de_dise%C3%B1o))
14094

141-
Este patrón permite definir una dependencia de uno a muchos entre objetos, de forma que cuando un objeto (sujeto) cambie de estado se notifique y se actualicen automáticamente todos los objetos (observadores) que depende de él. Esta notificación se realiza normalmente a través de uno de sus métodos.
95+
Este patrón define una dependencia de uno a muchos entre objetos, de forma que cuando un objeto (sujeto) cambie de estado, se notifique y se actualicen automáticamente todos los objetos (observadores) que depende de él. Esta notificación se realiza normalmente a través de uno de sus métodos.
14296

143-
El patrón se ha usado para comunicar dos componentes hijos, en este caso *ButtonZoom* que obtiene las coordenadas desde las propiedades de cada *TableRows* y *MapView* que es donde se encuentra el evento del zum a las coordenadas pasadas.
97+
El patrón se ha usado para comunicar dos componentes hijos, en este caso *ButtonZoom* que obtiene las coordenadas desde las propiedades de cada fila y *MapView* que es donde se encuentra el evento del zum a las coordenadas pasadas.
14498

14599
Para ser más específicos se ha usado el **patrón Pub-Sub(Publisher-Subscriber)** que añade un evento intermedio. La implementación de este patrón se a realizado gracias a la librería [PubSub](https://www.npmjs.com/package/pubsub-js). En esta [entrada](https://medium.com/@Aida_Pro_/observer-vs-eventbus-patrones-de-dise%C3%B1o-cd8178f48c7d) es donde he obtenido la parte teórica sobre el usos de ambos patrones.
146100

@@ -174,11 +128,11 @@ class ButtonZoom extends Component {
174128
}
175129
}
176130
```
177-
*ButtonZoom* es usado dentro del componente TableRows y tiene como propiedades el array de coordenadas del elemento.
131+
*ButtonZoom* es usado dentro del componente *TableList* y tiene como propiedades el array de coordenadas del elemento.
178132

179133
![04_button.png](img/04_button.png)
180134

181-
Ahora vamos a definir los observadores/suscriptores de nuetro evento. En la aplicación será el compomente MapView que es donde podemos usar los métodos de Leaflet gracias al [uso de referencias en React como comentamos en el artículo anterior](http://www.sigdeletras.com/2020/side-project-4-react-y-leaflet-wfs/). La suscripción la hacemos dentro del cliclo de vida *componentDidMount()*. Es importante también eliminar la suscripción ya puede ocurrir fugas de memoria. Esto lo haremos con el método *component WillUnmount()* mediante *PubSub.unsubscribe*.
135+
Vamos a definir los observadores/suscriptores de nuetro evento. En la aplicación será el compomente MapView que es donde podemos usar los métodos de Leaflet gracias al [uso de referencias en React como comentamos en el artículo anterior](http://www.sigdeletras.com/2020/side-project-4-react-y-leaflet-wfs/). La suscripción la hacemos dentro del cliclo de vida *componentDidMount()*. Es importante también eliminar la suscripción ya puede ocurrir fugas de memoria. Esto lo haremos con el método *component WillUnmount()* mediante *PubSub.unsubscribe*.
182136

183137
```javascript
184138
import React from "react";
@@ -202,9 +156,9 @@ export default class MapView extends React.Component {
202156
})
203157
}
204158

205-
// componentWillUnmount(){
206-
// PubSub.unsubscribe('zoomFromTableRow')
207-
// }
159+
componentWillUnmount(){
160+
PubSub.unsubscribe('zoomFromTableRow')
161+
}
208162
...
209163
```
210164

0 commit comments

Comments
 (0)