Skip to content

Commit 344e920

Browse files
committed
Ejemplo Historial Académico
1 parent 59d84c1 commit 344e920

File tree

2 files changed

+323
-56
lines changed

2 files changed

+323
-56
lines changed

reactjs/docs/modulo06.md

Lines changed: 191 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
# ReactJS
2+
23
## 6. Lists, Keys
4+
35
### 6.1. Transformación de listas en Javascript
4-
* Una de las funciones comúnmente empleadas para manejar listas de componentes es la función `map`.
5-
* Esta función se emplea para realizar operaciones sobre cada uno de los elementos de un arreglo al estilo programación funcional.
6-
* Uno de sus parámetros es una función o *callback* que contiene el código a ejecutar en cada iteración.
6+
7+
- Una de las funciones comúnmente empleadas para manejar listas de componentes es la función `map`.
8+
- Esta función se emplea para realizar operaciones sobre cada uno de los elementos de un arreglo al estilo programación funcional.
9+
- Uno de sus parámetros es una función o _callback_ que contiene el código a ejecutar en cada iteración.
10+
711
##### Ejemplo:
8-
* Obtener un arreglo B cuyos valores de sus elementos correspondan al doble de los valores de un arreglo A
12+
13+
- Obtener un arreglo B cuyos valores de sus elementos correspondan al doble de los valores de un arreglo A
14+
915
```javascript
10-
const arregloA = [1,2,3,4,5];
11-
const arregloB = arregloA.map((numero) => numero * 2 );
16+
const arregloA = [1, 2, 3, 4, 5];
17+
const arregloB = arregloA.map((numero) => numero * 2);
1218
console.log(arregloB);
1319
```
20+
1421
##### Ejemplo:
15-
* Obtener un arreglo de 5 componentes `ul` para formar el siguiente código html:
22+
23+
- Obtener un arreglo de 5 componentes `ul` para formar el siguiente código html:
24+
1625
```html
1726
<ul>
1827
<li>1</li>
@@ -22,21 +31,21 @@ console.log(arregloB);
2231
<li>5</li>
2332
</ul>
2433
```
25-
* Solución:
26-
```jsx
27-
const numeros = [1,2,3,4,5];
28-
const componentes = numeros.map(
29-
(numero) => <li>{numero}</li>
30-
);
31-
ReactDOM.render(
32-
<ul>{componentes}</ul>,
33-
document.getElementById('root')
34-
);
34+
35+
- Solución:
36+
37+
```jsx
38+
const numeros = [1, 2, 3, 4, 5];
39+
const componentes = numeros.map((numero) => <li>{numero}</li>);
40+
ReactDOM.render(<ul>{componentes}</ul>, document.getElementById("root"));
3541
```
36-
* Notar que el código javascript dentro del código JSX se escribe entre `{}`.
42+
43+
- Notar que el código javascript dentro del código JSX se escribe entre `{}`.
44+
3745
##### Ejemplo:
38-
* Crear un componente llamado `<NumberList>`.
39-
* El componente recibirá un arreglo de números como parámetro y deberá generar una salida similar al ejemplo anterior.
46+
47+
- Crear un componente llamado `<NumberList>`.
48+
- El componente recibirá un arreglo de números como parámetro y deberá generar una salida similar al ejemplo anterior.
4049

4150
```jsx
4251
function NumberList(props){
@@ -55,61 +64,81 @@ ReactDOM.render(
5564
document.getElementById('root');
5665
);
5766
```
58-
* Al ejecutar el código anterior se obtendrá el siguiente warning:
59-
``` javascript
67+
68+
- Al ejecutar el código anterior se obtendrá el siguiente warning:
69+
70+
```javascript
6071
Warning: Each child in a list should have a unique "key" prop.
6172
```
62-
* Una llave o key hace referencia a un atributo especial que se requiere agregar a los componentes JSX cuando se generan listas.
73+
74+
- Una llave o key hace referencia a un atributo especial que se requiere agregar a los componentes JSX cuando se generan listas.
75+
6376
#### 6.2 Keys
64-
* Las Keys ayudan a ReactJS a identificar si alguno de los elementos de dicha lista ha cambiado o si alguno de sus elementos ha sido eliminado.
65-
* Cada elemento de la lista debe contar con valor *único* asignado como *key*. Típicamente su valor corresponde con algún identificador o id.
66-
* Los valores deben ser únicos entre elementos de la misma lista, es decir, los valores se pueden repetir pero en listas diferentes.
67-
* Se emplea el atributo `key` para especificar su valor.
77+
78+
- Las Keys ayudan a ReactJS a identificar si alguno de los elementos de dicha lista ha cambiado o si alguno de sus elementos ha sido eliminado.
79+
- Cada elemento de la lista debe contar con valor _único_ asignado como _key_. Típicamente su valor corresponde con algún identificador o id.
80+
- Los valores deben ser únicos entre elementos de la misma lista, es decir, los valores se pueden repetir pero en listas diferentes.
81+
- Se emplea el atributo `key` para especificar su valor.
82+
6883
##### Ejemplo:
84+
6985
```jsx
70-
const numeros = [1,2,3,4,5];
71-
const items = numeros.map((numero)=>
72-
<Item key = {numero.toString()} value={numero}/>
73-
);
86+
const numeros = [1, 2, 3, 4, 5];
87+
const items = numeros.map((numero) => (
88+
<Item key={numero.toString()} value={numero} />
89+
));
7490
```
75-
* En caso de no contar con algún Id propio, o estos no sean únicos, se puede emplear el índice de la propia lista que se proporciona como parte de los argumentos del método `map`.
91+
92+
- En caso de no contar con algún Id propio, o estos no sean únicos, se puede emplear el índice de la propia lista que se proporciona como parte de los argumentos del método `map`.
93+
7694
```jsx
77-
const numeros = [1,1,2,2,2];
78-
const items = numeros.map((numero,index)=>
79-
<Item key = {index} value={index + 1 }/>
80-
);
95+
const numeros = [1, 1, 2, 2, 2];
96+
const items = numeros.map((numero, index) => (
97+
<Item key={index} value={index + 1} />
98+
));
8199
```
82-
* Ojo: No emplear índices si el orden de los elementos de la lista cambia.
100+
101+
- Ojo: No emplear índices si el orden de los elementos de la lista cambia.
102+
83103
#### 6.3 Generación de objetos JSX con keys.
84-
* La asignación de la *key* a cada elemento de la lista se debe realizar cuando se escribe el elemento JSX en lugar de hacerlo con los elementos HTML estándar.
85-
* Por ejemplo, suponer que se tiene un componente `ListItem` que define a un elemento `<li>valor</li>`, la definición del atributo key debe asignarse al usar `<ListItem>` en lugar de hacerlo con el elemento `<li>`
104+
105+
- La asignación de la _key_ a cada elemento de la lista se debe realizar cuando se escribe el elemento JSX en lugar de hacerlo con los elementos HTML estándar.
106+
- Por ejemplo, suponer que se tiene un componente `ListItem` que define a un elemento `<li>valor</li>`, la definición del atributo key debe asignarse al usar `<ListItem>` en lugar de hacerlo con el elemento `<li>`
107+
86108
##### Ejemplo:
109+
87110
```jsx
88-
function Producto(props){
111+
function Producto(props) {
89112
// forma correcta. Aquí no se hace uso de key
90-
return <li>{props.numProducto + 1} - {props.nombre}</li>;
113+
return (
114+
<li>
115+
{props.numProducto + 1} - {props.nombre}
116+
</li>
117+
);
91118
}
92119

93-
function OrdenCompra(props){
120+
function OrdenCompra(props) {
94121
const productos = props.productos;
95-
const productosJsx = productos.map((prod,index) =>
122+
const productosJsx = productos.map((prod, index) => (
96123
//forma correcta, aquí se debe asignar a la key
97-
<Producto key ={index} nombre ={prod} numProducto ={index} />
98-
);
99-
return <ul>{productosJsx}</ul>
124+
<Producto key={index} nombre={prod} numProducto={index} />
125+
));
126+
return <ul>{productosJsx}</ul>;
100127
}
101128

102-
const productos = ['Laptop','Mouse','Mochila'];
129+
const productos = ["Laptop", "Mouse", "Mochila"];
103130
ReactDOM.render(
104-
<OrdenCompra productos={productos}/>,
105-
document.getElementById('root')
131+
<OrdenCompra productos={productos} />,
132+
document.getElementById("root")
106133
);
107134
```
108-
* Notar que en el componente `Producto` se incluye su `key`, así como su nombre y un atributo llamado `numProducto`.
109-
* Observar que este último atributo también contiene al valor de la `key`.
110-
* Este atributo es necesario cuando se desee mostrar en el componente el valor de la `key`.
111-
* El atributo `key` es empleado por ReactJS para detectar cambios, pero este no está disponible como property. Si se desea mostrarlo, se usa otro property con nombre diferente, en este caso al atributo `numProducto`.
112-
* Una forma más compacta de hacer uso de la función `map` es emplearla directamente en la instrucción `return` y evitar así la declaración de la variable `productosJsx`
135+
136+
- Notar que en el componente `Producto` se incluye su `key`, así como su nombre y un atributo llamado `numProducto`.
137+
- Observar que este último atributo también contiene al valor de la `key`.
138+
- Este atributo es necesario cuando se desee mostrar en el componente el valor de la `key`.
139+
- El atributo `key` es empleado por ReactJS para detectar cambios, pero este no está disponible como property. Si se desea mostrarlo, se usa otro property con nombre diferente, en este caso al atributo `numProducto`.
140+
- Una forma más compacta de hacer uso de la función `map` es emplearla directamente en la instrucción `return` y evitar así la declaración de la variable `productosJsx`
141+
113142
```jsx
114143
function OrdenCompra(props){
115144
const productos = props.productos;
@@ -120,6 +149,112 @@ function OrdenCompra(props){
120149
}</ul>
121150
}
122151
```
123-
* Tener cuidado ya que esto puede generar código complicado de leer.
124-
* Ver la carpeta `ejemplos` para revisar el código fuente.
152+
153+
- Tener cuidado ya que esto puede generar código complicado de leer.
154+
- Ver la carpeta `ejemplos` para revisar el código fuente.
155+
156+
##### Ejemplo:
157+
158+
- Crear una página que muestre el historial académico de un alumno para un semestre en específico (se debe incluir el nombre del alumno, el semestre y una tabla con los datos de las materias cursadas y sus correspondientes calificaciones). Si alguna calificación es menor a siete se debe resaltar el texto en color rojo.
159+
- Emplear Bootstrap para dar estilos a la tabla.
160+
161+
```jsx
162+
const Materia = (props) => {
163+
const item = props.item;
164+
const index = props.index;
165+
const className = item.calificacion < 7 ? "text-danger font-weight-bold" : "";
166+
return (
167+
<tr className={className}>
168+
<th scope="row">{index + 1}</th>
169+
<td>{item.asignatura}</td>
170+
<td className="text-center">{item.creditos}</td>
171+
<td>{item.profesor}</td>
172+
<td className="text-center">{item.grupo}</td>
173+
<td className="text-center">{item.calificacion}</td>
174+
</tr>
175+
);
176+
};
177+
178+
const Calificaciones = (props) => {
179+
const calificaciones = props.calificaciones;
180+
return (
181+
<div>
182+
<table className="table table-striped">
183+
<thead>
184+
<tr>
185+
<th scope="col">#</th>
186+
<th scope="col">Asignatura</th>
187+
<th scope="col" className="text-center">
188+
Créditos
189+
</th>
190+
<th scope="col">Profesor</th>
191+
<th scope="col" className="text-center">
192+
Grupo
193+
</th>
194+
<th scope="col" className="text-center">
195+
Calificación
196+
</th>
197+
</tr>
198+
</thead>
199+
<tbody>
200+
{calificaciones.map((item, index) => (
201+
<Materia key={index} item={item} index={index} />
202+
))}
203+
</tbody>
204+
</table>
205+
</div>
206+
);
207+
};
208+
209+
const RegistroAlumno = (props) => {
210+
const alumno = props.alumno;
211+
return (
212+
<div>
213+
<h1 className="mt-5">Historial Académico</h1>
214+
<p className="mb-0">
215+
<span className="font-weight-bold">Nombre:</span> {alumno.nombre}
216+
</p>
217+
<p>
218+
<span className="font-weight-bold">Semestre:</span> {alumno.semestre}
219+
</p>
220+
<h4>Detalle de las calificaciones:</h4>
221+
<Calificaciones calificaciones={alumno.calificaciones} />
222+
</div>
223+
);
224+
};
225+
226+
const alumno = {
227+
nombre: "Juanito López",
228+
semestre: "2020-2",
229+
calificaciones: [
230+
{
231+
asignatura: "Bases de Datos",
232+
creditos: 8,
233+
profesor: "Jorge A. Rodríguez Campos",
234+
grupo: 1,
235+
calificacion: 10,
236+
},
237+
{
238+
asignatura: "Diseño Digital",
239+
creditos: 8,
240+
profesor: "Juan Flores López",
241+
grupo: 3,
242+
calificacion: 7,
243+
},
244+
{
245+
asignatura: "Economía",
246+
creditos: 8,
247+
profesor: "Andrés Manuel López Obrador",
248+
grupo: 4,
249+
calificacion: 6,
250+
},
251+
],
252+
};
253+
254+
ReactDOM.render(
255+
<RegistroAlumno alumno={alumno} />,
256+
document.getElementById("root")
257+
);
258+
```
259+
125260
##### Fin de módulo.

0 commit comments

Comments
 (0)