Skip to content

Instantly share code, notes, and snippets.

@fxcosta
Forked from jeff-pal/README.md
Last active October 16, 2020 00:10
Show Gist options
  • Save fxcosta/d8a530ac8768cec68d3272dae1dd7505 to your computer and use it in GitHub Desktop.
Save fxcosta/d8a530ac8768cec68d3272dae1dd7505 to your computer and use it in GitHub Desktop.
ReactJS - Hook customizado - useState() com Promise.
import { useEffect, useRef, useCallback } from 'react';
const useStateWithPromise = (state, setState) => {
const resolverRef = useRef(null);
useEffect(() => {
if (resolverRef.current) {
resolverRef.current(state);
resolverRef.current = null;
}
/**
* Dado que uma atualização de estado pode ser disparada exatamente com o mesmo estado novamente,
* não é suficiente especificar o estado como a única dependência deste useEffect.
* É por isso que o resolverRef.current também é uma dependência, porque vai garantir que o handler setNewState
* seja chamado na renderização anterior.
*/
}, [resolverRef.current, state]);
const setNewState = useCallback((newState) => {
setState(newState);
return new Promise(resolve => {
resolverRef.current = resolve;
});
}, [setState])
return [setNewState];
};
export default useStateWithPromise;

useStateWithPromise

Esse script é um hook customizado para possibilitar a espera da execução de atualização de estados no ReactJS.

Exemplo de uso:

import React, {useState} from 'react';
import useStateWithPromise from 'useStateWithPromise.js';

function MyComponent() {

  const [myVariable, setMyVariable] = useState();
  const [setNewState] = useStateWithPromise(myVariable, setMyVariable);

  async function foo() {
    console.log(myVariable);
    await setNewState('bar');
    console.log(myVariable);
  }

  return (
    ...
  )
  
  export default MyComponent;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment