Custom Hooks en React

馃棑 Publicado el 6 de diciembre de 2022


Compilaci贸n de custom hooks que considero 煤tiles y dignos de compartir 鈿涳笍馃獫

Pic for Custom Hooks en React

Intro

Los custom hooks son una nueva adici贸n en React 16.8. Te permiten utilizar el state y otras funcionalidades de React sin escribir una clase. El construir tus propios hooks te permite extraer la l贸gica den componente en funciones reutilizables. A continuaci贸n presento los custom hooks que considero 煤tiles:

useLocalStorageState

Este custom hook sirve para crear una variable de estado que persista su valor en el localStorage del browser, aunque bien se podr铆a implementar usando AsyncStorage, React Native KeyChain, Expo SecureStore o alguna otra librer铆a de almacenamiento

  function useLocalStorageState(
    key,
    defaultValue = '',
  {serialize = JSON.stringify, deserialize = JSON.parse} = {},
  ) {
    const [state, setState] = React.useState(() => {
      const valueInLocalStorage = window.localStorage.getItem(key)
      if (valueInLocalStorage) {
        return deserialize(valueInLocalStorage)
      }
      return typeof defaultValue === 'function' ? defaultValue() : defaultValue
    })

    const prevKeyRef = React.useRef(key)

    React.useEffect(() => {
      const prevKey = prevKeyRef.current
      if (prevKey !== key) {
        window.localStorage.removeItem(prevKey)
      }
      prevKeyRef.current = key
      window.localStorage.setItem(key, serialize(state))
    }, [key, state, serialize])

    return [state, setState]
  }

Este custom hook recibe como par谩metros la llave del valor que queremos guardar, el valor por defecto para inicializar la variable de estado a guardar, y opcionalmente un objeto con una propiedad serialize que debe ser nuestra funci贸n encargada de serializar el dato a guardar, y an谩logamente, una propiedad deserialize que debe ser nuestra funci贸n encargada de desserializar el dato. Como defecto se utiliza JSON.stringify y JSON.parse para estas.

Se crea el estado utilizando lazy initializing del hook useState para aumentar un poco el desempe帽o por las operaciones de i/o en el localStorage.

Posteriormente se utiliza el hook useEffect para observar cambios en el state, comparando el estado previo con el actual y guardando dichos cambios en el localStorage.

Finalmente se retorna un array con el state persistido en localStorage y su funci贸n correspondiente para setearlo/establecerlo.