septiembre 2021

Pedro Lara {Dev}

Código, Libros y Podcast

Creando rutas dinámicas en React Next | Pedro Lara

No hay comentarios

Desde hace un tiempo considerable decidí migrar a Next, y desde entonces no me arrepiento: son muchas las ventajas que podría enumerar las cuales me han hecho enamorar de este framework. Me encanta la manera en que trabajan las rutas, lo profesional que se trabaja la navegación entre páginas., en fin me encanta este framework de React JS.

Sin embargo, en esta ocasión no vengo a tratar de convencer a ningún desarrollador de React JS de migrar a este framework. Si te sientes cómodo trabajando con create react App, con Gatsby o con cualquier otro framework  siéntete libre de seguir y no cedas a la presión, aún más si trabajas y vives de los ingresos que te genera tu trabajo.

En esa ocasión lo que deseo es mostrar uno de esos aspectos que me fascinan de Next el cual es la facilidad con la que podemos crear rutas dinámicas dentro de nuestras páginas.

En Next, las páginas se convierten en rutas automáticamente al momento de crearlas. Supongamos que tenemos un Proyecto de Next, y deseamos crear una ruta llamada “lecturas” . Lo que debemos hacer es crear un nuevo fichero llamado “lecturas” dentro del directorio “Pages”:



Ahora, si colocamos el nombre de nuestro nuevo fichero (lecturas) el la barra de direcciones, podremos acceder al contenido de esta nueva página. Vamos a colocar un h2 con el título “Lecturas”, para poder confirmar esto:






Rutas Dinámicas


Ya vimos como podemos crear páginas y rutas automáticamente. Ahora veremos como podemos crear rutas dinámicas. No te asustes, porque es tan fácil como crear una ruta estática. Sólo basta con crear un nuevo directorio, dentro creamos un directorio especial cuya sintaxis es la siguiente: [id] donde el “id” sería los parámetros que le vamos a pasar de manera dinámica a nuestra nueva ruta.

Supongamos que deseamos crear la ruta dinámica “lecturas”, según lo que acabamos de decir, sería tan sencillo como hacer lo siguiente: llecturas/[id]/index.js




Probemos

Ahora para acceder a nuestra nueva ruta dinámica, debemos escribir el nombre de nuestro directorio seguido de los parametros que deseamos pasarle, en este caso:

http://localhost:3000/admin/lecturas/123

 

Sin embargo, también es posible crear un directorio y dentro crear un fichero con la siguiente sintaxis: [id].js



¿Cómo obtener los parámetros pasados a las rutas dinámicas?

Next también nos permite poder obtener los parámetros que son pasados en las rutas dinámicas. Para esto sólo debemos hacer uso de la propiedad “query” del router:










No hay comentarios :

Publicar un comentario

Evento onPress en FlatGrid react-native-super-grid

No hay comentarios
Pedro Lara



Trabajar con Grid puede ser una ventaja ya que permite construir interfaz mas amigables. En ese sentido un grid muy usado en React Native es FlatGrid. Este grid permite diseñar pantallas bastantes decentes y con clares agradables los cuales puedes ajustar a tu preferencia.

En esta ocasión tengo un Screen creado con FlatGrid


Aquí un código de ejemplo:
import React from 'react';
import { StyleSheet, View, Text } from 'react-native';
import { FlatGrid } from 'react-native-super-grid';

export default function Example() {
  const [items, setItems] = React.useState([
    { name: 'TURQUOISE', code: '#1abc9c' },
    { name: 'EMERALD', code: '#2ecc71' },
    { name: 'PETER RIVER', code: '#3498db' },
    { name: 'AMETHYST', code: '#9b59b6' },
    { name: 'WET ASPHALT', code: '#34495e' },
    { name: 'GREEN SEA', code: '#16a085' },
    { name: 'NEPHRITIS', code: '#27ae60' },
    { name: 'BELIZE HOLE', code: '#2980b9' },
    { name: 'WISTERIA', code: '#8e44ad' },
    { name: 'MIDNIGHT BLUE', code: '#2c3e50' },
    { name: 'SUN FLOWER', code: '#f1c40f' },
    { name: 'CARROT', code: '#e67e22' },
    { name: 'ALIZARIN', code: '#e74c3c' },
    { name: 'CLOUDS', code: '#ecf0f1' },
    { name: 'CONCRETE', code: '#95a5a6' },
    { name: 'ORANGE', code: '#f39c12' },
    { name: 'PUMPKIN', code: '#d35400' },
    { name: 'POMEGRANATE', code: '#c0392b' },
    { name: 'SILVER', code: '#bdc3c7' },
    { name: 'ASBESTOS', code: '#7f8c8d' },
  ]);

  return (
    <FlatGrid
      itemDimension={130}
      data={items}
      style={styles.gridView}
      // staticDimension={300}
      // fixed
      spacing={10}
      renderItem={({ item }) => (
        <View style={[styles.itemContainer, { backgroundColor: item.code }]}>
          <Text style={styles.itemName}>{item.name}</Text>
          <Text style={styles.itemCode}>{item.code}</Text>
        </View>
      )}
    />
  );
}

const styles = StyleSheet.create({
  gridView: {
    marginTop: 10,
    flex: 1,
  },
  itemContainer: {
    justifyContent: 'flex-end',
    borderRadius: 5,
    padding: 10,
    height: 150,
  },
  itemName: {
    fontSize: 16,
    color: '#fff',
    fontWeight: '600',
  },
  itemCode: {
    fontWeight: '600',
    fontSize: 12,
    color: '#fff',
  },
});
Sin embargo, el problema es cuando deseamos agregar un evento onPress a cada una de las cuadrillas de este Grid. Si seguimos la practica tradicional, lo que haríamos seria colocar un TouchableOpacity
y dentro de este agregar un onPress. No obstante, si se hace de esta manera no va a funcionar. Po ejemplo, supongamos que deseamos navegar hacia otra pantalla al hacer un onPress dentro de una de las cuadrillas de nuestro Grid.

<TouchableOpacity
onPress={()=>navigation.navigate('Search')}
>

De esta manera no va a funcionar

¿ Cómo  logramos agregar el evento onPreess, entonces ?

Para esto, debemos seguir algunos pasos extras, veamos:

Debemos crear una constante donde colocaremos los datos que deseamos renderizar dentro de cada cuadrilla.


renderItem = ({ item, index }) => {
return (
<TouchableOpacity
onPress={() => alert(
'Haz seleccionado' + item.name
)}
>
<View style={[styles.itemContainer, { backgroundColor: item.code }]}
>
<Text style={styles.itemName}
>{item.name}</Text>
</View>
</TouchableOpacity>
);
};

Dentro del TouchableOpacity que hemos colocado en el interior de la función renderItem colocamos el evento onPress. Luego, sustituimos todo el código que tenemos dentro del parámetro  renderItem por la llamada a nuestra función   renderItem . Veamos:

Sustituimos esto:

renderItem={({ item }) => (
<TouchableOpacity
onPress={()=>navigation.navigate('Search')}
>
<View style={[styles.itemContainer, { backgroundColor: item.code }]}
>
<Text style={styles.itemName}
>{item.name}</Text>
</View>
</TouchableOpacity>
)}


Por esto:

renderItem={renderItem}

De esta manera ya podrás hacer uso de cualquier evento dentro del FlatGrid



No hay comentarios :

Publicar un comentario

Interfaz de mensajes con React Native y expo | Pedro Lara

No hay comentarios
Interfaz de Mensajes en React Native



No hay comentarios :

Publicar un comentario

Error: ENOENT: no such file or directory, open 'credentials.json'

No hay comentarios

Corrección de Error: ENOENT: no such file or directory, open '' al hacer deploy en Firebase Functions

Pedro Lara




Cuando estamos trabajando con Firebase Functions desde Windows, y hacemos uso de las credenciales de Firebase para la coneccion a la base de datos de Firebase y la autenticación, es común encontrarse con el error: Error: ENOENT: no such file or directory, open 'credentials.json'

Este error surge cuando ejecutamos el comando "firebase deploy", para subir nuestro código al servidor de Firebase.

Aunque es un error sencillo, las posibles soluciones pueden complicar las cosas. 

admin.initializeApp({
  credentials: admin.credential.cert('./credentials.json'),
  databaseURL: "https://prueba-default-rtdb.firebaseio.com"
})

Este error está relacionado con la ruta del fichero que conteine las credenciales que nos proporciona Firebase. Aunque una posible solución es reemplazar admin.credential.cert('./credentials.json')  por 

admin.credential.aplicationDefault(),   sin embargo, en su lugar recomiendo hacer un requiere() del fichero y luego incluirlo dentro de la función admin.credential.cert()    

const {Router= require('express');
const admin = require('firebase-admin')
const fs = require('./credentials.json')
const router = Router();

admin.initializeApp({
  credentials: admin.credential.cert(fs),
  databaseURL: "https://prueba-default-rtdb.firebaseio.com"
})

De esta manera  funcionaraá perfectamente.

No hay comentarios :

Publicar un comentario