Este novo gancho pode ajudar a simplificar muitos códigos clichê.
Os aplicativos React que você desenvolve geralmente buscam dados de uma API externa, e a equipe React fez questão de atender a essa necessidade. O usar() hook simplifica o processo de busca de dados.
Usando esse gancho, você reduzirá a quantidade de código padrão necessário para definir promessas e atualizar o estado do aplicativo. Saiba tudo sobre React usar() hook e como usá-lo em seus projetos React.
O componente básico
Considere o seguinte componente, por exemplo:
import {useEffect, useState} from"react"
exportfunctionData({ url }) {
const [isLoading, setIsLoading] = useState(true)
const [isError, setIsError] = useState(false)
const [data, setData] = useState()useEffect(() => {
setIsError(false)
setIsLoading(true)
setData(undefined)fetch(url)
.then(res => res.json())
.then(setData)
.catch(() => setIsError(true))
.finally(() => setIsLoading(false))
})
return isLoading? (
Loading...</h1>
): isError? (Error</h1>
): ({JSON.stringify(data, null, 2)}</pre>
)
}
Depois que o React renderiza esse componente, ele consome a API usando fetch(). Em seguida, ele salva os dados no estado do componente se a solicitação for bem-sucedida ou define o éErro variável para true se não fosse.
Dependendo do estado, ele renderiza dados da API ou uma mensagem de erro. Enquanto a solicitação da API está pendente, ela mostra o texto "Carregando..." na página.
A implementação useHook()
O componente acima é um pouco complicado, pois está cheio de código clichê. Para resolver esse problema, traga o usar() conecte e refatore seu código.
Com o gancho use(), você pode reduzir o componente acima para apenas duas linhas de código. Mas antes de fazer isso, observe que este gancho é bastante novo, então você só pode usá-lo na versão experimental do React. Portanto, certifique-se de usar essa versão:
// package.json
"dependencies": {
"react": "experimental",
"react-dom": "experimental"
}
...
Agora você está pronto para usar o gancho, começando substituindo o usarEstado e useEfeito importações com apenas usar:
import {use} from"react"
Dentro de Dados componente, a única coisa que você manterá é a solicitação de busca. Mas você precisará agrupar a solicitação de busca dentro do seu usar() gancho; ele retorna dados JSON ou um erro. Em seguida, defina a resposta para uma variável chamada dados:
exportfunctionData({ url }) {
const data = use(fetch(url).then(res => res.json()))
return<pre>{JSON.stringify(data, null, 2)}pre>
}
Isso é tudo! Como você pode ver, o código acima reduz o componente a apenas duas linhas de código. Isso demonstra o quão útil o gancho use() pode ser em cenários como este.
Estado de carregamento (suspensão)
Uma parte importante do usar() hook está lidando com os estados de carregamento e erro. Você pode fazer isso dentro do componente pai do Dados.
Para implementar a funcionalidade de carregamento, envolva o Dados componente com Suspense. Este componente usa um suporte substituto que será renderizado sempre que você estiver no estado de carregamento:
exportdefaultfunctionApp () {
const [url, setUrl] = useState(URL.USERS)
return (
<>Loading...</div>}>
</Suspense>
</>
)
}
O usar() hook no componente Data aciona esse suspense para carregar. Embora a promessa ainda não tenha sido resolvida, o Aplicativo componente renderizará o estado de fallback. Então, quando o Dados componente recebe os dados de resposta, ele renderiza o conteúdo em vez do estado de carregamento.
Tratamento de erros com limite de erro
Quando se trata de detectar erros, você precisa saber como funciona o limite de erro para usá-lo. Normalmente, você o usará quando estiver trabalhando com o Suspense.
Um exemplo de limite de erro está no código a seguir:
import React from"react"
classErrorBoundaryextendsReact.Component{
state = { hasError: false, error: null }static getDerivedStateFromError(error) {
return {
hasError: true,
error
}
}render() {
if (this.state.hasError) {
returnthis.props.fallback
}returnthis.props.children
}
}
exportdefault ErrorBoundary;
Este exemplo de limite de erro possui um objeto de estado que rastreia o estado do erro e qual é o erro. A seguir, ele obtém o estado derivado desse erro. O renderizar() A função exibe o elemento substituto se houver um erro. Caso contrário, ele renderiza tudo o que estiver dentro do .
O componente acima funciona praticamente da mesma forma que o Suspense. Então, no componente App, você pode agrupar tudo dentro do Limite de erro componente assim:
exportdefaultfunctionApp () {
const [url, setUrl] = useState(URL.USERS)
return (
<>Oops! There's an error.
</Suspense>
</ErrorBoundary>
</>
)
}
Se algum código aninhado gerar um erro, seu limite de erro irá capturá-lo por meio de getDerivedStateFromError() e atualize o estado, que por sua vez renderiza o texto substituto, "Oops! Há um erro."
As regras do gancho use()
Portanto, o gancho use() pode ajudar a reduzir a quantidade de código padrão e facilita o carregamento e os estados de erro. Mas o gancho use() também tem outro uso muito útil.
Vamos supor que você esteja enviando um deveria buscar booleano como suporte para o Dados componente, e você só deseja executar a solicitação de busca se deveria buscar é verdadeiro.
Você não pode embrulhar o ganchos React tradicionais dentro de um se declaração, mas o usar() gancho é diferente. Você pode usá-lo praticamente em qualquer lugar que quiser (embrulhado em um para laço, se declaração, etc.):
exportfunctionData({ url, shouldFetch }) {
let data = "Default data"if (shouldFetch) {
const data = use(fetch(url).then(res => res.json()))
}
return<pre>{JSON.stringify(data, null, 2)}pre>
}
Com o código acima, o React renderizará “Dados padrão” por padrão. Mas se você disser para fazer uma busca passando o deveria buscar prop do pai, ele fará a solicitação e atribuirá a resposta a dados.
Outra coisa interessante sobre o usar() O gancho é que você não precisa usá-lo apenas com promessas. Por exemplo, no momento da escrita, você pode passar em um contexto:
exportfunctionData({ url, shouldFetch }) {
let data = "Default data"if (shouldFetch) {
const data = use(Context)
}
return<pre>{JSON.stringify(data, null, 2)}pre>
}
Embora usar useContext() seja perfeitamente adequado, você não pode usá-lo dentro de instruções if e loops. Mas você pode envolver o gancho use() dentro de instruções if e loops for.
Melhores práticas para ganchos React
O gancho use() é apenas um dos muitos ganchos fornecidos pelo React. Familiarizar-se com esses ganchos e a melhor forma de usá-los é essencial para melhorar seu conhecimento sobre React.