Javascript – DebugEverything https://blog.debugeverything.com Uma nova maneira de aprender programação Sun, 17 Dec 2023 11:14:34 +0000 pt-BR hourly 1 https://wordpress.org/?v=7.1.4 https://blog.debugeverything.com/wp-content/uploads/2021/04/cropped-DE_white-32x32.png Javascript – DebugEverything https://blog.debugeverything.com 32 32 8 truques simples para filtrar arrays de forma eficiente e eficaz https://blog.debugeverything.com/pt/8-truques-simples-para-filtrar-arrays-de-forma-eficiente-e-eficaz/ https://blog.debugeverything.com/pt/8-truques-simples-para-filtrar-arrays-de-forma-eficiente-e-eficaz/#respond Sun, 17 Dec 2023 11:14:33 +0000 https://blog.debugeverything.com/?p=2770 Neste post vou falar sobre alguns truques do JavaScript filter() que você precisa saber. Esses truques vão te ajudar a usar o método filter() de forma mais eficiente e eficaz.

O método filter() é uma ferramenta fácil de entender, mas pode ser um pouco complicado de usar, especialmente quando você quer fazer coisas mais avançadas. Essas dicas que vou compartilhar vão te ajudar a evitar alguns dos problemas mais comuns.

Introdução

Quer limpar, remover ou simplesmente selecionar alguns elementos específicos? O filter() é a sua ferramenta principal.

Já precisou tratar um conjunto de dados gigante usando JavaScript? A propósito, existem maneiras de evitar isso, como paginação, mas não vou entrar nesse mérito aqui mas vamos imaginar que você já recebeu no front-end ou em algum aplicativo Node.js, uma lista ou um objeto de dados gigante que você precisa tratar.

O filter() talvez seja a sua primeira opção porque ele cria um novo array com elementos que passam por um teste específico definido por uma função, isso já diminui a quantidade de dados que você precisa tratar.

O método filter() recebe uma função callback como argumento e esta função é chamada para cada elemento do array. Se a função callback retornar true, o elemento é incluído no novo array, simples assim.

A propósito, o array original não é alterado.

1. Filtrar um array usando múltiplas condições com o método filter()

Você pode usar o método filter() para criar um novo array que contenha apenas elementos que atendem a múltiplas condições. Por exemplo, para criar um novo array que contenha apenas números que sejam pares e maiores que 5:

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
const numerosParesMaioresQueCinco = numbers.filter(number => number % 2 === 0 && number > 5); 

No trecho de código acima, a função callback verifica se o número é par e maior que 5. Se for, o elemento é incluído no novo array numerosParesMaioresQueCinco.

E aqui o exemplo contrário, filtrar o array para incluir apenas números ímpares e menores que 5:

const oddNumbersGreaterThan5 = numbers.filter(number => number % 2 !== 0 && number < 5); 

Você pode usar o método filter() para filtrar arrays com qualquer número de condições.

2. Filtrar um array pelo tipo de dados usando o método filter()

Suponha que você tenha um array com diferentes tipos de dados, como este:

const mixedArray = [1, "string", true, {}, [], null];

Você pode usar o método filter() para criar um novo array que contenha apenas elementos de um tipo específico. Por exemplo, para criar um novo array que contenha apenas strings, você faria o seguinte:

const strings = mixedArray.filter(element => typeof element === "string");

Se o elemento for uma string, ele será incluído no novo array strings (o operador typeof retorna o tipo de dado de um valor).

Você pode usar o método filter() para filtrar arrays por qualquer tipo de dado, números, objetos, arrays e até null e undefined.

E aqui para filtrar o array para incluir apenas números:

const numbers = mixedArray.filter(element => typeof element === "number");

Ou apenas elementos que sejam objetos:

const objects = mixedArray.filter(element => typeof element === "object");

3. Filtrar um array pela propriedade de um objeto usando o método filter()

Ok, suponha que você tenha um array de objetos, como este:

const users = [
  { name: "Alice", age: 25, occupation: "Software Engineer", location: "United States" },
  { name: "Bob", age: 30, occupation: "Business Analyst", location: "Bahamas" },
  { name: "Carol", age: 20, occupation: "Analyst Programmer", location: "London" },
];

Você pode usar o método filter() para criar um novo array que contenha apenas objetos onde uma propriedade específica tenha um valor específico.

Por exemplo, para criar um novo array que contenha apenas usuários com mais de 25 anos, você faria o seguinte, usando a notação de ponto para acessar as propriedades do objeto:

const adultUsers = users.filter(user => user.age > 25);

A função callback neste exemplo verifica se a propriedade age do objeto users é maior que 25. Se for, o objeto é incluído no novo array adultUsers.

Você pode usar o método filter() para filtrar objetos por qualquer valor de qualquer propriedade. Por exemplo, você ainda pode filtrar esse array pelo nome do usuário, localização ou ocupação.

Aqui está um exemplo de como filtrar o array para incluir apenas usuários que moram nos Estados Unidos:

const usUsers = users.filter(user => user.location === "United States");

E aqui está um exemplo para incluir apenas usuários que são empregados como engenheiros de software:

const softwareEngineerUsers = users.filter(user => user.occupation === "Software Engineer");

4. Filtrar um array por propriedade de objeto aninhado usando o método filter().

Imagine que você tem uma lista de produtos, como esta:

const products = [
  {
    name: "Smart TV",
    categories: ["Electronics", "Home & Garden"],
    isOnSale: true,
  },
  {
    name: "Sunglasses",
    categories: ["Clothing", "Accessories"],
    isOnSale: false,
  },
  {
    name: "Printer",
    categories: ["Electronics", "Office Supplies"],
    isOnSale: true,
  },
];

Parece um pouco com o exemplo anterior, mas perceba que nesse array, categories é também um array, já que faz sentido um produto pertencer a mais de uma categoria.

Mas não tem problema, ainda podemos usar o método filter para filtrar os produtos de uma única categoria. Por exemplo, para filtrar o array para incluir apenas produtos que estão na categoria “Electronics”, você faria o seguinte:

const electronicProducts = products.filter(product => product.categories.includes("Electronics"));

O método includes() retorna true se o array contém o valor especificado e false caso contrário.

Ou, para filtrar o array para incluir apenas produtos da categoria “Home & Garden”:

const homeAndGardenProducts = products.filter(
  product => product.categories.includes("Home & Garden")
);

Você também pode usar o método filter() para filtrar o array por múltiplas propriedades. Por exemplo, para filtrar o array produtos para incluir apenas produtos que estão na categoria “Eletrônicos” e também estão em promoção, você faria o seguinte:

const electronicProductsOnSale = products.filter(
  product => product.categories.includes("Electronics") && product.isOnSale
);

5. Filtrar um array por expressão regular usando o método filter() do Javascript

Expressões regulares (regex) são uma ferramenta poderosa para filtrar arrays por qualquer critério que você desejar.

Você consegue encontrar padrões específicos em strings e você pode usar isso para filtrar arrays de strings, objetos ou qualquer outro tipo de array. Para filtrar um array com uma expressão regular, você só precisa passar uma função callback que usa a regex para o método filter().

Por exemplo, para encontrar qualquer string que comece com a letra A, você poderia usar a regex /^A/i:

const strings = ["Apple", "Banana", "Cat", "Dog"];

const aStrings = strings.filter(string => string.match(/^A/i));

console.log(aStrings); // ["Apple"]

Aqui estamos usando não só o método filter, mas também o método string.match() para encontrar o padrão.

Imagine que você tem uma lista de endereços de email e deseja filtrá-la para incluir apenas endereços de um domínio específico, tipo “example.com”. Você pode usar o método filter() combinado com expressões regulares para fazer isso.

const emailAddresses = ["alice@example.com", "bob@example.com", "carol@gmail.com", "dave@yahoo.com"];

const exampleEmailAddresses = emailAddresses.filter(emailAddress => emailAddress.match(/@example.com$/));

console.log(exampleEmailAddresses); // ["alice@example.com", "bob@example.com"]

A expressão regular /@example.com$/ corresponde a qualquer string que termine com “@example.com”.

Você pode usar expressões regulares para filtrar arrays por qualquer critério que quiser, por exemplo, você poderia filtrar um array de endereços de email por nome, domínio ou qualquer outra propriedade do email ou até mesmo por formato que seja válido ou inválido:

const emailAddresses = ["alice@example.com", "bob@example.com", "carol@gmail.com", "dave@yahoo.com", "invalid_email_address"];

const validEmailAddresses = emailAddresses.filter(emailAddress => emailAddress.match(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/));

console.log(validEmailAddresses); // ["alice@example.com", "bob@example.com", "carol@gmail.com", "dave@yahoo.com"]

6. Filtrar arrays de forma mais eficiente usando métodos filter() encadeados

Ok, nós vimos que é possível filtrar qualquer array usando várias condições. Outra maneira de fazer isso é encadear o método filter() a outros filtros.

Quando você usa um único método filter() com várias condições, JavaScript precisa criar um novo array para cada condição, isso pode ser ineficiente se você estiver filtrando um array grande.

Quando você usa métodos filter() encadeados, JavaScript só precisa criar um novo array. Isso porque a saída de um método filter() é usada como entrada para o próximo método filter().

Aqui está um exemplo:

const products = [
  { name: "Product A", price: 10, category: "electronics" },
  { name: "Product B", price: 20, category: "clothing" },
  { name: "Product C", price: 30, category: "electronics" },
  { name: "Product D", price: 40, category: "clothing" },
];

const cheapElectronicProducts = products.filter(
  product => product.price < 20 && product.category === "electronics"
);

Este código primeiro filtra o array products para incluir apenas produtos que custam menos de US$ 20 e que estão na categoria “eletrônicos” usando as duas condições no mesmo filter().

Agora aqui mesmo filtro, mas usando 2 métodos filter() encadeados:

const products = [
  { name: "Product A", price: 10, category: "electronics" },
  { name: "Product B", price: 20, category: "clothing" },
  { name: "Product C", price: 30, category: "electronics" },
  { name: "Product D", price: 40, category: "clothing" },
];

const cheapElectronicProducts = products
  .filter(product => product.price < 20)
  .filter(product => product.category === "electronics");

Este código também cria dois novos arrays, mas de forma mais eficiente. O primeiro método filter cria um novo array de produtos que custam menos de US$ 20. O segundo método filter usa a saída do primeiro como entrada para criar um novo array de produtos na categoria “eletrônicos”.

Encadear o método filter pode ser mais eficientes do que usar um único filter com múltiplas condições, especialmente para arrays grandes.

7. Filtrar um array encadeando outros métodos

Ok, você viu que é possível encadear dois ou mais métodos filter(), o que você ainda não viu é que você também pode encadear o método filter() com outros métodos, como map() e reduce().

Por exemplo, o código a seguir encadeia os métodos filter() e map() para obter o nome de todos os produtos eletrônicos:

const products = [
  { name: "Product A", price: 10, category: "electronics" },
  { name: "Product B", price: 20, category: "clothing" },
  { name: "Product C", price: 30, category: "electronics" },
  { name: "Product D", price: 40, category: "clothing" },
];

const cheapElectronicProductNames = products.filter(product => product.price < 20)
  .filter(product => product.category === "electronics")
  .map(product => product.name);

console.log(cheapElectronicProductNames); // ["Product A"]

Este código primeiro filtra o array products para incluir apenas produtos que custam menos de US$ 20. Em seguida, ele filtra o array para incluir apenas produtos na categoria “electronics”. Por fim, ele mapeia o array filtrado para um novo array contendo apenas os nomes de todos os produtos com valor abaixo dos US$ 20.

Você pode encadear o método filter() com qualquer outro método que recebe um array como entrada e retorna um array como saída.

Vamos testar com outras propriedades, por exemplo, pelo price:

const electronicProductPrices = products.filter(product => product.price < 20)
  .filter(product => product.category === "electronics")
  .map(product => product.price);

console.log(electronicProductPrices); // [10]

Ou aqui, vamos filtrar por idade e localização e depois, vamos contar o número de usuários que satisfazem essas condições.

const totalUsersUnder18InCalifornia = users.filter(user => user.age < 18)
  .filter(user => user.location === "California")
  .reduce((total, user) => total + 1, 0);

console.log(totalUsersUnder18InCalifornia); // 10

E pra fechar, vamos filtrar por preço, categoria e depois ordenar os produtos pelo preços.

const sortedCheapElectronicProducts = products.filter(product => product.price < 20)
  .filter(product => product.category === "electronics")
  .sort((productA, productB) => productA.price - productB.price);

console.log(sortedCheapElectronicProducts); // [{ name: "Product A", price: 10, category: "electronics" }]

8. Filtrar elementos únicos de um array usando o método filter()

Agora por último, um dos exemplos mais comuns, imagine que você tem um array de números e deseja filtrar todos os elementos duplicados. Usando o filter() você vai verificar se o elemento já está presente no array, se o elemento não estiver presente, a função callback deve retornar true. Caso contrário, a função callback deve retornar false.

Aqui está um exemplo de como fazer isso:

const numbers = [1, 2, 3, 1, 4, 5, 2, 6];

const uniqueNumbers = numbers.filter((number, index) => {
  return numbers.indexOf(number) === index;
});

console.log(uniqueNumbers); // [1, 2, 3, 4, 5, 6]

Ok, agora um pouco mais complexo, vamos tentar fazer a mesma coisa, mas agora, com um array de objetos. Por exemplo, digamos que você tem um array de usuários e deseja filtrar todos os duplicados com base na propriedade “name”.

Você pode usar a mesma abordagem do primeiro exemplo, mas precisará modificar a função callback para verificar a propriedade “nome”.

Tipo assim:

const users = [
  { name: "Alice", age: 25 },
  { name: "Bob", age: 30 },
  { name: "Carol", age: 35 },
  { name: "Alice", age: 20 },
];

const uniqueUsers = users.filter((user, index) => {
  return users.findIndex((otherUser) => otherUser.name === user.name) === index;
});

console.log(uniqueUsers); // [{ name: "Alice", age: 25 }, { name: "Bob", age: 30 }, { name: "Carol", age: 35 }]

Conclusão

De filtrar por múltiplas condições a criar padrões complexos de regex, filtrar com base em tipos de valores a se concentrar em propriedades de objetos e objetos aninhados, a gente explorou uma gama de possibilidades.

Encadear filtros e integrar outros métodos como map() e reduce() na mistura expande ainda mais seu kit de ferramentas de manipulação de arrays.

Acredito que agora você esteja melhor preparado para tratar vários dos problemas mais comuns da programação. Mas se surgir alguma duvida, deixe um comentário, te vejo na próxima!

]]>
https://blog.debugeverything.com/pt/8-truques-simples-para-filtrar-arrays-de-forma-eficiente-e-eficaz/feed/ 0
Vue: Os hooks de ciclo de vida que você precisa saber https://blog.debugeverything.com/pt/vue-os-hooks-de-ciclo-de-vida-que-voce-precisa-saber/ https://blog.debugeverything.com/pt/vue-os-hooks-de-ciclo-de-vida-que-voce-precisa-saber/#respond Sun, 10 Dec 2023 05:18:29 +0000 https://blog.debugeverything.com/?p=2754 Vue 3, com a sua composition API, trouxe uma maneira nova e melhor de lidar com o ciclo de vida dos componentes. Entender o ciclo de vida do Vue 3 é essencial pra todo desenvolvedor que quer aproveitar o máximo desse framework frontend. Vamos ver como funciona o ciclo de vida do Vue 3 usando a API de Composição, explorando as principais etapas e componentes envolvidos.

Visão Geral do Ciclo de Vida no Vue 3

No Vue 3, um componente nasce quando é criado e morre quando é destruído. Ele passa por várias fases no meio, cada uma com um propósito específico. Vamos dar uma olhada nessas fases para entender como elas funcionam.

Criação do Componente

O processo começa com a renderização (nascimento) de um componente Vue.

Ciclo de Vida no Vue 3: Renderizando o Componente
Ciclo Vida Vue 3: render

Quando um componente é instanciado, a função setup(), parte fundamental da API de Composição, é acionada. É nessa função que você define e organiza as propriedades, métodos e outros dados reativos do componente.

<script>
import { ref } from 'vue'

export default {
  setup() {
   // "ref" é usado para criar uma variável reativa
    const count = ref(0)

   // expor para o template e outros hooks da API de opções
    return {
      count
    }
  },

  mounted() {
    console.log(this.count) // 0
  }
}
</script>
Ciclo Vida Vue 3: Setup

No entanto, se você estiver usando composition API com Componentes de Arquivo Único (Single-File Components), <script setup> é a melhor opção pra uma sintaxe mais enxuta e fácil de usar, e é essa a sintaxe que vamos usar nesse post.

<script setup>
  import { ref, onMounted } from 'vue'

  const count = ref(0)
  
  onMounted(() => {
    console.log(this.count) // 0
  })
</script>

Hooks do Ciclo de Vida

O conceito de hooks no ciclo de vida do Vue nos permite executar código em diferentes estágios da vida de um componente. Esses métodos são estrategicamente posicionados para rodar código em momentos específicos da jornada de um componente.

Por exemplo, você pode usar um hook para inicializar dados quando o componente é criado, ou para atualizar o componente quando ele recebe um novo evento. Os hooks oferecem uma maneira estruturada e eficaz de gerenciar o comportamento de um componente ao longo de seu ciclo de vida. A partir de agora, vou te mostrar (quase) todos os hooks do Vue, caso você ainda não os conheça.

Hook do Vue 3: onBeforeMount()

O onBeforeMount() é o nosso primeiro hook do ciclo de vida do Vue, que é chamado antes mesmo que o componente seja renderizado pela primeira vez.

Nesse momento, o componente já terminou de configurar seu estado e suas configurações (setup()), mas ainda não foi anexado ao DOM.

Em outras palavras, o onBeforeMount() é a hora de você fazer qualquer coisa que precise ser feita antes que o componente apareça na tela, mas depois que o estado e as configurações do componente já tenham sido configurados.

onBeforeMount(() => {
// Lógica a ser executada antes do componente ser montado
});

Ciclo Vida Vue 3: onBeforeMount

Casos de uso comun para o hook onBeforeMount incluem:

  • Tarefas de inicialização que devem ser realizadas antes do componente se tornar visível.
  • Buscar dados iniciais de uma fonte externa ou API.
  • Configurar ou subscrever listeners de eventos.

Dica: qualquer coisa que você alterar no estado do componente no onBeforeMount() vai aparecer na tela na primeira renderização. Se você precisar fazer alguma coisa depois que o componente estiver montado, use o próximo hook.

Renderização Inicial

A renderização inicial no Vue 3 é mais uma etapa do ciclo de vida. A sintaxe setup facilita tudo, porque combina várias etapas em uma só. Pra quem não está familiarizado com alguns dos termos, vamos dar uma explicada nos conceitos-chave envolvidos:

O processo de renderização inicial funciona assim:

  1. Compilação e Função de Renderização:
    • O Vue compila o template e gera automaticamente a função de renderização com base no bloco setup.
  2. Criação de Estado Reativo:
    • Variáveis declaradas no bloco setup, como o count que vimos no primeiro exemplo, tornam-se reativas. Isso significa que alterações nessas variáveis acionam reatividade no componente.
  3. Criação do DOM Virtual:
    • O DOM virtual é criado automaticamente com base no template e no estado reativo.
  4. Criação e Inserção de Nós no DOM:
    • O Vue cria automaticamente os nós do DOM necessários com base no DOM virtual e os insere no DOM real.
  5. Montagem Automática:
    • Com a sintaxe setup, você não precisa de um hook de montagem separado. O código após o bloco setup é executado automaticamente após o componente ser montado.
Ciclo Vida Vue 3: Renderização Inicial

Hook do Vue 3: onMounted()

Após a renderização inicial, o hook onMounted() é chamado. Esse hook faz parte da API de Composição e é usado para executar lógica ou tarefas após um componente ter sido montado no DOM.

onMounted(() => {
  // Lógica a ser executada quando o componente é montado
});
Ciclo Vida Vue 3: onMounted

O hook onMounted() é especialmente útil para tarefas que exigem acesso ao DOM, pois ele garante que o componente tenha sido totalmente renderizado e inserido no documento.

Casos de uso comun para o hook onMounted incluem:

  • Inicializar bibliotecas ou plugins de terceiros.
  • Buscar dados iniciais de uma API.
  • Aplicar estilos CSS com base em condições dinâmicas.

O hook onMounted() é chamado após o componente ser montado no DOM. Ele pode ser usado para executar lógica ou tarefas que dependem do DOM estar disponível, como inicializar um serviço, fazer uma requisição HTTP ou anexar um evento ao DOM.

Após isso, o componente está finalmente montado.

Ciclo Vida Vue 3: mounted

Hook do Vue 3: onBeforeUpdate

O hook onBeforeUpdate() é chamado antes do componente ser atualizado. Ele é útil pra fazer coisas que precisam ser feitas antes da atualização. Por exemplo, você pode usar o hook onBeforeUpdate() pra limpar o DOM ou pra preparar o componente pra uma nova atualização.

onBeforeUpdate(() => {
  // Lógica a ser executada antes da atualização do componente
});
Ciclo Vida Vue 3: onBeforeUpdate

Casos de uso comun para o hook onBeforeUpdate incluem:

  • Realizar tarefas de limpeza ou desmontagem antes de uma nova renderização.
  • Comparar o estado atual com o estado futuro para operações específicas.
  • Interagir com serviços externos ou APIs para sincronizar dados.

Lembre que se você mudar o estado reativo no hook onBeforeUpdate(), o componente não vai ser renderizado novamente.

Em Vue, uma variável “reativa” é aquela que atualiza a interface do usuário automaticamente quando seu valor muda. Vue usa um sistema de reatividade pra garantir que a interface do usuário esteja sempre de acordo com os dados. Quando você declara uma variável na função setup() usando a API de Composição ou no corpo do <script setup>, o Vue a torna reativa. Isso significa que o Vue rastreia as alterações nessa variável e atualiza a interface do usuário automaticamente quando necessário.

Hook do Vue 3: onUpdated

O hook onUpdated() é chamado logo depois que um componente e seus componentes filhos são atualizados no DOM. Ele é útil quando você precisa executar lógica que depende do estado atualizado do componente ou quando você quer fazer algo depois que o componente é re-renderizado.

onUpdated(() => {
// Lógica a ser executada quando o componente é atualizado
});
Ciclo Vida Vue 3: onUpdated

Casos de uso comun para o hook onUpdated incluem:

  • Buscar Dados Atualizados: Imagine que seu componente acabou de receber uma reformulação e agora você precisa de dados atualizados para acompanhar. Aí que entra o onUpdated(). Você pode iniciar uma chamada de API ou obter novas informações no exato momento em que o componente muda.
  • Ajustes Dinâmicos na Interface do Usuário: Talvez seu componente precise reagir dinamicamente às suas próprias alterações. O onUpdated() é perfeito para ajustar a interface do usuário com base no estado mais recente.
  • Manuseio de Eventos Externos: Se o seu componente está conectado a eventos ou serviços externos, o onUpdated() é o momento de sincronizar tudo. Seja lidando com novas mensagens, atualizações de outros componentes ou qualquer outra coisa.

Hook do Vue 3: onBeforeUnmount

No Vue 3, o hook onBeforeUnmount() faz parte da API de Composição e desempenha um papel crucial logo antes de um componente ser desmontado ou destruído. Este hook oferece um espaço para você realizar tarefas de limpeza ou finalizações imediatamente antes do Vue remover o componente da DOM.

onBeforeUnmount(() => {
// Lógica a ser executada antes do desmonte do componente
});
Ciclo Vida Vue 3: onBeforeUnmount

Casos de uso comun para o hook onBeforeUnmount incluem:

  • Limpar recursos como temporizadores ou assinaturas.
  • Cancelar o registro de listeners de eventos.
  • Realizar qualquer limpeza necessária antes que o componente seja removido do DOM.

O hook onBeforeUnmount() é chamado antes do componente ser desmontado. Ele é útil para fazer tarefas de limpeza, como limpar o DOM, cancelar requisições HTTP ou remover listeners de eventos. Isso ajuda a manter a aplicação Vue limpa e eficiente, evitando vazamentos de memória e outros problemas.

Hook do Vue 3: onUnmounted

O hook onUnmounted() é chamado quando o componente é desmontado da DOM. Assim como o onBeforeUnmount() ele é útil para liberar recursos que o componente não precisa mais, como listeners de eventos, requisições HTTP ou elementos DOM.

onUnmounted(() => {
// Lógica a ser executada quando o componente é desmontado
});
Ciclo Vida Vue 3: onUnmounted

Casos de uso comun para o hook onUnmounted incluem:

  • Desconectar de um WebSocket
  • Cancelar o registro de listeners de eventos.
  • Destruir objetos ou dependências

O hook onUnmounted() é uma maneira de fazer o componente mandar embora os recursos que ele não precisa mais antes de ir embora. Isso ajuda a liberar recursos de maneira eficiente e evita problemas como vazamentos de memória. Essa prática é importante para manter a aplicação Vue funcionando bem e evitando problemas.

Encerrando:

Pronto, concluímos nossa jornada pelo ciclo de vida do Vue 3! Compreender como os componentes ganham vida, mudam e, eventualmente, se despedem é fundamental para liberar todo o potencial do Vue. Esses hooks, como onBeforeUpdate() e onUnmounted(), são recursos essenciais nessa jornada

Então, à medida que você continua aprendendo sobre o Vue e sua API de Composição, mantenha esses hooks em sua caixa de ferramentas. Boa codificação, e que sua jornada com o Vue seja suave e sem problemas!

]]>
https://blog.debugeverything.com/pt/vue-os-hooks-de-ciclo-de-vida-que-voce-precisa-saber/feed/ 0
Descomplicando Rest api https://blog.debugeverything.com/pt/descomplicando-rest-api/ https://blog.debugeverything.com/pt/descomplicando-rest-api/#respond Sun, 29 Oct 2023 07:57:48 +0000 https://blog.debugeverything.com/?p=2683 O que é REST?

REST é um jeito de fazer a internet funcionar. Ele é baseado em um conjunto de regras que definem como os sites devem se comunicar.

O REST, que significa Representational State Transfer, é um modelo de arquitetura muito comum para o desenvolvimento de serviços web na internet. Para entender o que isso significa, pense em como a web funciona. Quando você navega na internet, acessa diferentes páginas da web, realiza compras online ou interage com aplicativos, tudo isso envolve a comunicação entre o seu dispositivo e servidores remotos. O REST é a estrutura que torna essa comunicação possível e eficaz.

o que é rest

A ideia principal do REST é que tudo na web é considerado um “recurso”. Recursos podem ser coisas como perfis de usuários, fotos, produtos em uma loja online, ou qualquer outra informação que você deseja compartilhar ou acessar online. Cada recurso é identificado por um endereço único, chamado de URI (Uniform Resource Identifier), que é semelhante a um URL.

Para interagir com esses recursos, o REST utiliza os métodos HTTP, como GET, POST, PUT e DELETE.

  • GET é usado para acessar uma cópia de um recurso.
  • POST é usado para criar um novo recurso.
  • PUT é usado para atualizar um recurso existente.
  • DELETE é usado para excluir um recurso.

REST é uma abordagem comum na criação de APIs, que são como pontes de comunicação entre diferentes sites.

Um exemplo prático de API REST é a API do Facebook. Essa API possibilita que desenvolvedores construam aplicativos que se integram aos recursos do Facebook, como fotos, publicações e lista de amigos. Ela é como um conjunto de regras que permite que aplicativos se conectem ao Facebook e usem suas funcionalidades.

Exemplo de Rest Api

Vou dar um exemplo simples de uma API REST que lida com recursos de “Usuários” usando os métodos HTTP GET, POST, PUT e DELETE. Se você quiser você pode praticar criando a sua própria API, eu descrevo como nesse outro artigo.

rest api example

1. Obter todos os usuários (HTTP GET):

Para recuperar a lista de todos os usuários, você envia uma solicitação HTTP GET para o endpoint /users da sua API. O servidor entende o pedido e retorna uma lista de todos os usuários cadastrados. Cada usuário é como uma carta de apresentação em formato digital, com um número de identificação (ID), nome e email. É como uma lista telefônica, mas digital.

Solicitação (GET /users):

Resposta (200 OK):

[
  {
    "id": 1,
    "nome": "João",
    "email": "joao@email.com"
  },
  {
    "id": 2,
    "nome": "Maria",
    "email": "maria@email.com"
  }
]

2. Obter um usuário específico (HTTP GET):

Quando você quer saber detalhes de um usuário em particular, basta fazer uma solicitação HTTP GET para o endpoint /users/{id}, onde {id} é o ID do usuário. O servidor responde com os detalhes do usuário específico que você pediu.

Solicitação (GET /users/1):

Resposta (200 OK):

{
  "id": 1,
  "nome": "João",
  "email": "joao@email.com"
}

3. Criar um novo usuário (HTTP POST):

Quando um usuário novo se cadastra, você envia um pedido POST para o servidor com os detalhes desse usuário para o endpoint /users. Você fornece os detalhes do usuário no corpo da solicitação em formato JSON. O servidor cria o novo usuário e responde com um “cartão de visita” do usuário recém-criado, incluindo um novo número de identificação (ID).

Solicitação (POST /users):

{
  "nome": "Carlos",
  "email": "carlos@email.com"
}

Resposta (201 Created):

{
  "id": 3,
  "nome": "Carlos",
  "email": "carlos@email.com"
}

4. Atualizar um usuário (HTTP PUT):

Quando alguém quer mudar suas informações, você envia uma solicitação HTTP PUT com o ID do usuário e os detalhes atualizados para o endpoint /users/{id}. O servidor faz as atualizações e retorna os novos detalhes do usuário.

Solicitação (PUT /users/3):

{
  "nome": "Carlos Silva",
  "email": "carlos.silva@email.com"
}

Resposta (200 OK):

{
  "id": 3,
  "nome": "Carlos Silva",
  "email": "carlos.silva@email.com"
}

5. Excluir um usuário (HTTP DELETE):

Se alguém decidir sair do clube, faz um pedido DELETE com o ID do usuário que quer remover para o endpoint /users/{id} com o ID do usuário que você deseja remover. O servidor processa a exclusão e não envia uma resposta com corpo, só o código HTTP 204 No Content, que é tipo “Feito, usuário excluído!”.

Solicitação (DELETE /users/3):

Resposta (204 No Content):
(Indica que o usuário foi removido com sucesso)

Estes exemplos ilustram como as operações básicas de criação, leitura, atualização e exclusão (CRUD) podem ser realizadas em uma API REST para recursos de usuários. Claro, em aplicações reais, há muito mais a considerar, como segurança e autenticação, mas esses são os conceitos fundamentais. É como lidar com um registro de membros de um clube, só que digital!

O que é JSON

json file

Com você deve ter percebido, acima estamos usando um formato de dados chamado JSON (JavaScript Object Notation). JSON é uma forma de organizar informações que lembra muito as estruturas de dados que usamos no dia a dia. É como um tradutor que permite que computadores e aplicativos entendam informações em um formato que seja fácil de ler e escrever.

No exemplo da API de usuários, usamos JSON para representar informações sobre os usuários. Por exemplo, quando criamos um novo usuário, enviamos os detalhes desse usuário, como nome e email, em um formato JSON no corpo da solicitação. O servidor entende esse JSON, processa as informações e cria o novo usuário.

JSON é composto por pares chave-valor, onde uma “chave” é o nome do atributo e o “valor” é o conteúdo associado a essa chave. No exemplo, a chave “nome” tem o valor “Carlos Silva” e a chave “email” tem o valor “carlos.silva@email.com”. Essa estrutura torna fácil representar dados complexos de maneira organizada.

Além disso, JSON é um formato amplamente aceito na web e em muitas APIs, tornando-se uma escolha popular para transmitir dados. É legível tanto por humanos quanto por máquinas, o que o torna ideal para a comunicação de dados entre clientes e servidores em sistemas distribuídos, como as APIs REST que usamos como exemplo.

Conclusão

Em resumo, o REST é como a cola que mantém a internet unida, permitindo que sites e aplicativos conversem entre si. Pense nisso como um conjunto de regras que torna a comunicação na web mais eficaz.

Quando você navega na internet, faz compras online ou usa aplicativos, tudo isso envolve seu dispositivo conversando com servidores remotos. O REST é a base disso, tratando tudo na web como “coisas” (ou recursos) com endereços exclusivos, como URLs.

Ele usa métodos simples, como GET para pegar informações, POST para criar coisas novas, PUT para atualizar e DELETE para apagar. É como as peças de um quebra-cabeça que se encaixam perfeitamente.

Além disso, o uso do JSON, uma maneira organizada de apresentar dados, torna a comunicação fácil tanto para nós quanto para as máquinas. É como falar a mesma língua para que todos possam entender.

Resumindo, o REST e o JSON são como os melhores amigos dos desenvolvedores na construção de aplicativos e serviços online, criando experiências interativas e conectadas na internet. Ao dominar esses conceitos, os desenvolvedores podem construir sistemas sólidos e escaláveis na era digital. É como desvendar os segredos da web!

]]>
https://blog.debugeverything.com/pt/descomplicando-rest-api/feed/ 0
Aprenda a usar React Hooks com essas 7 dicas https://blog.debugeverything.com/pt/aprenda-a-usar-react-hooks-com-essas-7-dicas/ https://blog.debugeverything.com/pt/aprenda-a-usar-react-hooks-com-essas-7-dicas/#respond Mon, 16 Oct 2023 10:37:02 +0000 https://blog.debugeverything.com/?p=2660 Introdução

Os React Hooks são tipo uma super ferramenta para todos os devs React, mas especialmente para quem tá começando ou já tá na pegada intermediária. Eles são uma das principais ferramentas pra melhorar a legibilidade, reutilização e manutenção do seu código.

Pensa comigo: é como trocar blocos de construção convencionais por uns feitos sob medida, que deixam sua aplicação mais estável e organizada. E é isso que os React Hooks podem fazer por você!

Tem um exemplo completo aqui de como fazer uma lista de tarefas usando React Hooks. Dá uma conferida!

O que são React Hooks e por que são úteis?

Os React Hooks vieram pra facilitar a vida na hora de gerenciar o estado e os efeitos colaterais nos componentes funcionais do React. A ideia era simplificar e deixar nosso código mais limpo, mais fácil de ler, reutilizar e manter.

Antes dos Hooks, a parada era usar componentes de classe, que eram meio que como um quebra-cabeça – dava pra resolver, mas às vezes era meio chato, especialmente quando você tinhas muitas peças. Era tipo procurar uma agulha no palheiro de código.

Por exemplo, quer um contador que aumenta quando você clica num botão? Suuuuper fácil com o useState. E quando você quer que algo aconteça sempre que esse contador muda, é só usar o useEffect. Dá uma olhada na diferença entre fazer isso com React Hooks e componentes de classe.

// Sem React Hooks
class Contador extends React.Component {
    state = {
        count: 0,
    }

    componentDidMount() {
        document.title = `Contagem: ${this.state.count}`
    }

    componentDidUpdate(prevProps, prevState) {
        if (prevState.count !== this.state.count) {
            document.title = `Contagem: ${this.state.count}`
        }
    }

    render() {
        return (
            <div>
                <p>Count: {this.state.count}</p>
                <button onClick={() => this.setState({ count: this.state.count + 1 })}>Incrementar</button>
            </div>
        )
    }
}

// Com React Hooks
function Counter() {
    const [count, setCount] = useState(0)

    useEffect(() => {
        document.title = `Contagem: ${count}`
    }, [count])

    return (
        <div>
            <p>Contagem: {count}</p>
            <button onClick={() => setCount(count + 1)}>Incrementar</button>
        </div>
    )
}

React Hooks, especialmente o useState e o useEffect, são como uma caixa de ferramentas que deixa a experiência de desenvolvimento React bem mais produtiva. Eles te incentivam a escrever um código mais organizado e que dá pra reutilizar, resultando em aplicativos mais limpos e fáceis de manter.

Ah, e os React Hooks incluem também o useRef, useContext, useReducer e mais uns outros. Dá uma conferida na lista completa. Esses hooks podem ser usados pra gerenciar o estado, fazer uns truques com efeitos colaterais e acessar dados do contexto de várias maneiras.

  1. Use useState apenas para gerenciar o estado que é essencial para seu componente

O useState é um poderoso React Hook que te permite controlar o estado nos componentes funcionais. Dá pra usar pra ficar de olho em tudo que muda com o tempo, tipo o valor de um campo de formulário, a pontuação num jogo ou a lista de coisas no carrinho de compras.

Cada vez que você usa o useState, você tá criando uma variável de estado nova. Isso pode acumular e deixar teus componentes lentos e difíceis de entender, então saiba usar da maneira correta, criando apenas states essenciais para o seu componente.

Faça:

import React, { useState } from 'react';

const Contador = () => {
    const [contador, setContador] = useState(0); // Estado essencial: contador

    const handleIncrement = () => {
        setContador(prevContador => prevContador + 1);
    };

    return (
        <div>
            <p>Contagem: {contador}</p>
            <button onClick={handleIncrement}>Incrementar</button>
        </div>
    );
};

export default Contador;

Aqui a gente tá usando o useState pra gerenciar o estado essencial (contador) que é necessário pro componente, que é o jeito certo.

Manter apenas o estado essencial no teu componente ajuda a manter teu código organizado e fácil de manter. Também facilita entender como o teu componente funciona e como ele muda com o tempo.

Não faça:

import React, { useState } from 'react';

const PerfilUsuario = () => {
    const [logado, setLogado] = useState(false);  // Estado não essencial: logado

    const handleLogin = () => {
        setLogado(true);
    };

    const handleLogout = () => {
        setLogado(false);
    };

    return (
        <div>
            <p>O usuário está logado: {logado ? 'Sim' : 'Não'}</p>
            <button onClick={handleLogin}>Entrar</button>
            <button onClick={handleLogout}>Sair</button>
        </div>
    );
};

export default PerfilUsuario;

Já nesse componente, o estado logado usando React Hooks é considerado não essencial porque não está diretamente relacionado à funcionalidade principal ou propósito do componente UserProfile. O objetivo desse componente é mostrar as informações do perfil do usuário, o foco principal não é gerenciar o status de login do usuário.

Fica de olho em estados não essenciais usando React Hooks no teu componente, porque isso pode complicar e dificultar a leitura do teu código. Além disso, pode causar problemas de desempenho, especialmente quando temos uma grande quantidade de estados.

  1. Use useState pra controlar um estado imutável

Pense em um state como algo que não pode ser alterado diretamente. Isso quer dizer que você nunca deve alterar diretamente a variável de estado. Em vez disso, sempre que quiser fazer uma alteração, crie uma cópia nova dessa variável. Isso ajuda a manter a confiabilidade dos seus dados e evita mudanças inesperadas, garantindo que o seu programa funcione como esperado.

Faça:

import React, { useState } from 'react';

const ContadorImutavel = () => {
    const [contador, setContador] = useState(0);  // Estado imutável: contador

    const handleIncremento = () => {
        // Atualize o contador de forma imutável usando a função setContador
        setContador(prevContador => prevContador + 1);
    };

    return (
        <div>
            <p>Contagem: {contador}</p>
            <button onClick={handleIncremento}>Incrementar</button>
        </div>
    );
};

export default ContadorImutavel;

Nesse exemplo, a gente tá usando o setContador para atualizar o contador que não deve ser mudado diretamente. Isso segue as regras do React, deixando tudo mais organizado e confiável. Manter os estados imutáveis também facilita entender e encontrar erros no teu código.

Não Faça:

const ContadorMutavel = () => {
    const [contador, setContador] = useState(0);

    useEffect(() => {
        setContador(contador + 1);
    });

    return (
        <div>
            <p>Contagem: {contador}</p>
        </div>
    );
};

A razão de não ser correto atualizar as variáveis de estado diretamente no useEffect, por exemplo, é porque isso pode gerar loops infinitos.

Nesse exemplo, o useEffect vai ser acionado depois de cada renderização, e ele vai incrementar a variável de estado de contagem (contador), isso quer dizer que a variável de estado vai ser incrementada continuamente, criando um loop infinito.

  1. Use useState pra organizar teu estado de uma maneira normalizada

Significa dizer que você deve organizar o estado(s) de forma padronizada e arrumada. Ao invés de amontoar todos os dados num monte só, divida em pedacinhos menores e bem organizados. Cada pedaço de dado com seu identificador único, o que facilita encontrar, atualizar ou trabalhar com eles.

Faça:

import React, { useState } from 'react';

const ProdutosNormalizados = () => {
  const [produtos, setProdutos] = useState({
    1: { id: 1, nome: 'Produto A' },
    2: { id: 2, nome: 'Produto B' }
  });  // Estado normalizado: produtos

  return (
    <div>
      <ul>
        {Object.values(produtos).map(produto => (
          <li key={produto.id}>{produto.nome}</li>
        ))}
      </ul>
    </div>
  );
};

export default ProdutosNormalizados;

Um exemplo de como usar o useState e deixar nossos dados organizados. Cada produto tem seu próprio ID especial, o que facilita encontrar e mexer neles. Assim, a gente consegue buscar nossos produtos e fazer mudanças quando preciso. É como ter uma caixa de ferramentas bem organizada onde cada ferramenta tem seu lugar – dá pra achar a ferramenta certa rapidão.

Não Faça:

import React, { useState } from 'react';

const ProdutosNaoNormalizados = () => {
  const [produtos, setProdutos] = useState([
    { id: 1, nome: 'Produto A' },
    { id: 2, nome: 'Produto B' }
  ]);  // Estado não normalizado: produtos

  return (
    <div>
      <ul>
        {produtos.map(produto => (
          <li key={produto.id}>{produto.nome}</li>
        ))}
      </ul>
    </div>
  );
};

export default ProdutosNaoNormalizados;

Um state “desnormalizado” usando React Hooks significa que os dados não estão organizados de maneira eficiente. Nesse exemplo, a gente tá usando o useState pra gerenciar uma lista de produtos também, mas aqui cada produto é representado como um objeto dentro de um array e não existe um identificador para esse produto.

Se tu tem muitos produtos na lista, usar um estado desorganizado com React Hooks pode dificultar achar e atualizar produtos específicos. Também pode causar problemas de desempenho, especialmente se tu tá mostrando uma lista com todos os teus produtos.

  1. Use o useEffect apenas para efeitos colaterais.

useEffect não foi feito pra atualizar o estado ou fazer o componente aparecer na tela. Pense nele como a ferramenta que cuida das coisas que rolam nos bastidores enquanto teu componente faz sua mágica. Então, se precisar buscar dados de uma API ou ficar de olho em atualizações, é aí que o useEffect entra em ação.

Faça:

import React, { useEffect } from 'react';

const SubscriptionManager = () => {
  useEffect(() => {
    // Simulando uma assinatura de um evento
    const subscription = someEventEmitter.on('event', () => {
      // Lidar com o evento
      console.log('Evento recebido!');
    });

    // Limpeza: Cancelar a assinatura quando o componente é desmontado
    return () => {
      someEventEmitter.off('event', subscription);
    };
  }, []); // Array de dependências vazio

  return <p>Gerenciador de Assinaturas</p>;
};

export default SubscriptionManager;

Nesse exemplo, a gente ta usando o useEffect pra gerenciar uma inscrição num evento. É um cenário típico de efeito colateral, onde a gente se inscreve num evento e garante cancelar a inscrição quando o componente é desmontado.

Não Faça:

import React, { useEffect, useState } from 'react';

const ExemploInvalido = () => {
  const [mensagem, setMensagem] = useState('Mensagem inicial');

  useEffect(() => {
    // Isso está incorreto: o efeito está atualizando o estado e causando re-renderizações
    setMensagem('Mensagem atualizada');
  }, []); // Array de dependências vazio

  return <p>{mensagem}</p>;
};

export default ExemploInvalido;

Aqui a gente tá usando o useEffect pra atualizar o estado do componente diretamente. Isso é uma maneira errada de usar o useEffect, porque ele é feito pra lidar com efeitos colaterais, não pra causar novas renderizações ou atualizar o estado diretamente. Sempre use o useEffect só pra tarefas relacionadas aos efeitos colaterais.

  1. Especifique as dependências

O useEffect pega uma lista de dependências como argumento, e ele só vai rodar quando alguma dessas dependências mudar. Isso significa que a gente avisa o React sobre coisas específicas (como variáveis ou pedaços de dados) que ele precisa ficar de olho. Se alguma dessas coisas mudar, o React sabe que tem que fazer algo.

Faça:

import React, { useState, useEffect } from 'react';

const ExemploComDependencias = () => {
  const [contador, setContador] = useState(0);
  const [multiplicador, setMultiplicador] = useState(1);

  useEffect(() => {
    // Este efeito será executado sempre que 'contador' ou 'multiplicador' mudarem
    console.log('Efeito executado! Contador:', contador, 'Multiplicador:', multiplicador);
  }, [contador, multiplicador]); // Especifique as dependências: 'contador' e 'multiplicador'

  return (
    <div>
      <p>Contador: {contador}</p>
      <p>Multiplicador: {multiplicador}</p>
      <button onClick={() => setContador(contador + 1)}>Incrementar Contador</button>
      <button onClick={() => setMultiplicador(multiplicador * 2)}>Dobrar Multiplicador</button>
    </div>
  );
};

export default ExemploComDependencias;

Aqui a gente tá colocando [count, multiplicador] como dependências no useEffect. Especificar dependências no useEffect pode melhorar a performance e eficiência do teu código, porque evita que o efeito rode sem necessidade.

Não Faça:

import React, { useState, useEffect } from 'react';

const ExemploDependenciaIncorreta = () => {
  const [contador, setContador] = useState(0);
  const [multiplicador, setMultiplicador] = useState(1);

  useEffect(() => {
    // Este efeito será executado após cada renderização
    console.log('Efeito executado! Contador:', contador, 'Multiplicador:', multiplicador);
  }); // Nenhuma dependência especificada

  return (
    <div>
      <p>Contador: {contador}</p>
      <p>Multiplicador: {multiplicador}</p>
      <button onClick={() => setContador(contador + 1)}>Incrementar Contador</button>
      <button onClick={() => setMultiplicador(multiplicador * 2)}>Dobrar Multiplicador</button>
    </div>
  );
};

export default ExemploDependenciaIncorreta;

Sempre coloque todas as dependências relevantes pra garantir que o efeito funcione como esperado.

Nesse caso, o useEffect não tem nenhuma dependência o useEffect então vai rodar o efeito depois de cada renderização, mesmo se nenhuma das dependências mudou. Isso pode causar problemas de desempenho, especialmente se o efeito for computacionalmente custoso.

  1. Faça a limpeza

O useEffect devolve uma função de limpeza. Ele chama essa função antes de rodar o efeito novamente ou quando o componente for desmontado. Se o efeito cria recursos, como timers ou inscrições, é bom limpar esses recursos usando a função de limpeza.

Faça:

import React, { useEffect } from 'react';

const ExemploAssinatura = () => {
  useEffect(() => {
    const assinatura = assinarAlgo();

    // Limpeza: Cancelar a assinatura quando o componente é desmontado
    return () => {
      cancelarAssinatura(assinatura);
    };
  }, []); // Array de dependências vazio

  return <p>Exemplo de Assinatura</p>;
};

const assinarAlgo = () => {
  // Simular a configuração da assinatura
  console.log('Assinado!');
  return 'token_de_assinatura';
};

const cancelarAssinatura = (assinatura) => {
  // Simular a limpeza da assinatura
  console.log('Assinatura cancelada!', assinatura);
};

export default ExemploAssinatura;

Pra arrumar a bagunça depois de uma inscrição, a gente cancela a inscrição quando o componente é desmontado. Isso garante que não vai ter inscrições penduradas causando problemas.

Não Faça:

import React, { useEffect } from 'react';

const ExemploLimpezaIncorreta = () => {
  useEffect(() => {
    const intervalo = setInterval(() => {
      console.log('Olá!');
    }, 1000);

    // Ops! Sem limpeza, isso causará vazamento de memória
  }, []); // Array de dependências vazio

  return <p>Exemplo de Limpeza Incorreta</p>;
};

export default ExemploLimpezaIncorreta;

Nesse caso, a gente esqueceu de limpar depois de criar um intervalo. Isso pode causar um vazamento de memória, porque o intervalo continua rodando mesmo depois do componente ser desmontado. Sempre lembre de limpar os recursos ou inscrições pra manter tua aplicação sem bugs.

  1. Use React Hooks para criar hooks personalizados

Isso significa que dá pra criar suas próprias ferramentas reutilizáveis usando React Hooks pra lidar com tarefas específicas nos teus componentes React. É tipo criar tuas próprias peças de LEGO personalizadas que se encaixam perfeitamente nos teus projetos, deixando o teu trabalho ainda mais fácil e organizado.

Por exemplo, se tu precisa sempre gerenciar a autenticação do usuário, dá pra construir um hook personalizado usando React Hooks que cuida do login, logout e verifica se o usuário está logado. Assim, não precisa ficar recriando o mesmo código em todo componente – tu só usa teu hook personalizado, como uma ferramenta especial na tua caixa de ferramentas de React, quando precisar. É uma maneira bem legal e eficiente de tornar teus projetos React mais manejáveis.

import React, { useState } from 'react';

// Crie um hook personalizado para gerenciar o estado de autenticação
const useAutenticacao = () => {
  const [logado, setLogado] = useState(false);

  // Função para lidar com o login
  const fazerLogin = () => {
    setLogado(true);
  };

  // Função para lidar com o logout
  const fazerLogout = () => {
    setLogado(false);
  };

  // Retorna o estado de autenticação e funções para login e logout
  return {
    logado,
    fazerLogin,
    fazerLogout
  };
};

// Um componente que utiliza o hook de autenticação personalizado
const ComponenteAutenticacao = () => {
  // Use o hook personalizado para obter o estado de autenticação e funções
  const { logado, fazerLogin, fazerLogout } = useAutenticacao();

  return (
    <div>
      <p>O usuário está logado: {logado ? 'Sim' : 'Não'}</p>
      <button onClick={fazerLogin}>Logar</button>
      <button onClick={fazerLogout}>Sair</button>
    </div>
  );
};

export default ComponenteAutenticacao;

Pra gerenciar o status de autenticação nesse exemplo, a gente criou um novo hook chamado useAutenticacao. Esse hook único é usado pelo ComponenteAutenticacao pra gerenciar o processo de login e logout.

import React, { useState } from 'react';

// Este componente está lidando incorretamente com a autenticação sem usar um hook personalizado

const ComponenteAutenticacaoInvalido = () => {
  // Estado para controlar se o usuário está logado ou não
  const [logado, setLogado] = useState(false);

  // Função para lidar com o login
  const fazerLogin = () => {
    setLogado(true); // Define logado como true quando o botão 'Entrar' é clicado
  };

  // Função para lidar com o logout
  const fazerLogout = () => {
    setLogado(false); // Define logado como false quando o botão 'Sair' é clicado
  };

  return (
    <div>
      {/* Exibe se o usuário está logado ou não */}
      <p>O usuário está logado: {logado ? 'Sim' : 'Não'}</p>
      <button onClick={fazerLogin}>Entrar</button> {/* Botão para iniciar login */}
      <button onClick={fazerLogout}>Sair</button> {/* Botão para iniciar logout */}
    </div>
  );
};

export default ComponenteAutenticacaoInvalido; // Exporta o componente para uso em outras partes da aplicação

Em vez de colocar a lógica num hook personalizado, a gente tá usando o useState diretamente dentro do componente nesse exemplo. Além de ir contra as práticas recomendadas, que sugerem encapsular a lógica relacionada dentro de um hook personalizado pra reutilização, isso pode resultar em duplicação de código. Criar essas ferramentas especiais (hooks personalizados) é o caminho certo.

Conclusão

Os React Hooks, como o useState e o useEffect, são ferramentas poderosas que podem tornar seu código mais modular, reutilizável, limpo e fácil de manter.

Use o useState para gerenciar o estado essencial do componente, garantindo imutabilidade e normalização. Use o useEffect para lidar com efeitos colaterais, como busca de dados e inscrições.

Seguindo esses princípios, você pode alcançar um novo nível de eficiência e elegância na sua jornada de desenvolvimento com React.

Bons hooks! 🚀

]]>
https://blog.debugeverything.com/pt/aprenda-a-usar-react-hooks-com-essas-7-dicas/feed/ 0
3 métodos para remover items duplicados array javascript https://blog.debugeverything.com/pt/3-metodos-para-remover-items-duplicados-array-javascript/ https://blog.debugeverything.com/pt/3-metodos-para-remover-items-duplicados-array-javascript/#respond Sat, 18 Feb 2023 08:10:37 +0000 https://blog.debugeverything.com/?p=2526 Existem várias maneiras de remover itens duplicados de um array em JavaScript. Abaixo, vou descrever três métodos comuns:

  1. Usando o método filter() e indexOf()

Uma maneira de remover itens duplicados de um array é usando o método filter() em conjunto com o método indexOf() para filtrar os elementos que não são duplicados. O método indexOf() retorna o primeiro índice em que um elemento pode ser encontrado no array, e se esse índice não for igual ao índice atual no loop do filter(), então o elemento é um duplicado e não deve ser incluído no novo array.

const array = [3, 5, 5, 7, 9, 9, 1, 9, 2, 5, 7, 9, 2, 42, 12, 56, 87, 34, 23, 34];
const arraySemDuplicados = array.filter((valor, indice, self) => {
  return self.indexOf(valor) === indice;
});
console.log(arraySemDuplicados);

O código acima vai imprimir o seguinte resultado no console:

[3, 5, 7, 9, 1, 2, 42, 12, 56, 87, 34, 23]
  1. Usando um objeto como filtro

Outra maneira de remover itens duplicados de um array é usando um objeto como filtro. Nessa abordagem, um objeto é criado para armazenar as chaves únicas dos elementos do array e, em seguida, essas chaves são usadas para criar um novo array.

const array = [3, 5, 5, 7, 9, 9, 1, 9, 2, 5, 7, 9, 2, 42, 12, 56, 87, 34, 23, 34];
const objetoFiltro = {};
const arraySemDuplicados = array.filter((valor) => {
  return objetoFiltro.hasOwnProperty(valor) ? false : (objetoFiltro[valor] = true);
});
console.log(arraySemDuplicados);

O código acima também vai imprimir o seguinte resultado no console:

[3, 5, 7, 9, 1, 2, 42, 12, 56, 87, 34, 23]
  1. Usando o método Set()

A partir do ES6, o JavaScript introduziu o objeto Set(), que permite armazenar valores únicos de qualquer tipo, incluindo elementos de um array. Com o Set(), podemos facilmente remover itens duplicados de um array.

const array = [3, 5, 5, 7, 9, 9, 1, 9, 2, 5, 7, 9, 2, 42, 12, 56, 87, 34, 23, 34];
const set = new Set(array);
const arraySemDuplicados = Array.from(set);
console.log(arraySemDuplicados);

O código acima vai imprimir o seguinte resultado no console:

[3, 5, 7, 9, 1, 2, 42, 12, 56, 87, 34, 23]
]]>
https://blog.debugeverything.com/pt/3-metodos-para-remover-items-duplicados-array-javascript/feed/ 0
Comparando as opções para remover valores duplicados de um array em JavaScript. https://blog.debugeverything.com/pt/comparando-as-opcoes-para-remover-valores-duplicados-de-um-array-em-javascript/ https://blog.debugeverything.com/pt/comparando-as-opcoes-para-remover-valores-duplicados-de-um-array-em-javascript/#respond Fri, 17 Feb 2023 09:23:05 +0000 https://blog.debugeverything.com/?p=2519 Quais das opções abaixo é a melhor alternativa para solucionar o problema de remover os valores duplicados de um array. (ps: o array pode conter mais de 1 milhão de valores)

const array = [3, 5, 5, 7, 9, 9, 1, 9, 2, 5, 7, 9, 2, 42, 12, 56, 87, 34, 23, 34]

Opção 1:

function removeduplicates(array) {
    let newarray = [];
    for (let i = 0; i < array.length; i++) {
        if (array.indexof(array[i]) === i) {
            newarray.push(array[i])
        }
    } return newarray
}

Opção 2:

function removeduplicates(array) {
    return array.filter((value, index) => {
        return array.indexof(value) === index
    })
}

Opção 3:

function removeduplicates(array) {
    return [...new set(array)]
}

A melhor alternativa para solucionar o problema de remover valores duplicados de um array depende de alguns fatores, como o tamanho do array e a compatibilidade do código com diferentes navegadores e versões de JavaScript. Vamos analisar cada uma das opções:

i – A primeira opção usa um loop for para iterar pelo array e adicionar elementos únicos a um novo array. Esta opção é simples e fácil de entender, mas pode ser lenta para grandes arrays, pois o loop precisa ser executado várias vezes para cada elemento.

ii – A segunda opção usa o método filter do array para criar um novo array contendo apenas elementos únicos. Esta opção é mais concisa do que a primeira e usa uma função de ordem superior do JavaScript, o que é considerado uma boa prática. No entanto, assim como a primeira opção, esta pode ser lenta para grandes arrays, pois o método indexOf precisa ser chamado para cada elemento.

iii – A terceira opção usa um conjunto (Set) para remover elementos duplicados do array. Esta é a opção mais eficiente e simples de todas, pois o conjunto elimina automaticamente os elementos duplicados e converte o resultado de volta em um array. No entanto, esta opção só funciona em navegadores modernos que suportam a sintaxe de spread (...) e o construtor Set.

Dito isso, a opção mais eficiente e recomendada para remover valores duplicados de um array é a terceira opção: return [...new Set(array)]. Se a compatibilidade do código com navegadores antigos for um problema, a segunda opção também pode ser uma boa escolha, pois é mais concisa do que a primeira e usa uma função de ordem superior.

]]>
https://blog.debugeverything.com/pt/comparando-as-opcoes-para-remover-valores-duplicados-de-um-array-em-javascript/feed/ 0
Como iterar pelas propriedades de um objeto em JavaScript e imprimir “chave: valor” no console. https://blog.debugeverything.com/pt/como-iterar-pelas-propriedades-de-um-objeto-em-javascript-e-imprimir-chave-valor-no-console/ https://blog.debugeverything.com/pt/como-iterar-pelas-propriedades-de-um-objeto-em-javascript-e-imprimir-chave-valor-no-console/#respond Fri, 17 Feb 2023 09:11:47 +0000 https://blog.debugeverything.com/?p=2517 Aqui vamos escrever um trecho de código javascript que itera pelas propriedades de um objeto, imprimindo no console do navegador, e para cada uma delas, o conjunto “chave: valor”.

Iterar sobre as propriedades de um objeto é uma tarefa comum em JavaScript, e pode ser útil em muitos cenários diferentes. Uma maneira de fazer isso é usando o loop for...in, que percorre cada propriedade do objeto e executa uma ação para cada uma delas. Neste artigo, vamos ver como usar o loop for...in para imprimir o conjunto “chave: valor” no console do navegador para cada propriedade de um objeto.

Para começar, vamos criar um objeto simples com algumas propriedades:

const objeto = {
  nome: 'João',
  idade: 30,
  cidade: 'São Paulo'
};

Agora, vamos iterar sobre as propriedades do objeto usando o loop for...in. Para cada propriedade, vamos imprimir no console a chave e o valor correspondente, no formato “chave: valor”:

for (const chave in objeto) {
  console.log(`${chave}: ${objeto[chave]}`);
}

Aqui, usamos a sintaxe ${chave} e ${objeto[chave]} para criar uma string que contém a chave e o valor correspondente de cada propriedade. O operador de colchetes ([]) é usado para acessar o valor da propriedade usando a chave como índice.

Ao executar o código acima no console do navegador, o resultado será algo como:

nome: João
idade: 30
cidade: São Paulo

Com isso, conseguimos iterar sobre as propriedades de um objeto em JavaScript e imprimir “chave: valor” no console do navegador para cada uma delas.

]]>
https://blog.debugeverything.com/pt/como-iterar-pelas-propriedades-de-um-objeto-em-javascript-e-imprimir-chave-valor-no-console/feed/ 0
5 formas de remover elementos de um array em JavaScript https://blog.debugeverything.com/pt/5-formas-de-remover-elementos-de-um-array-em-javascript/ https://blog.debugeverything.com/pt/5-formas-de-remover-elementos-de-um-array-em-javascript/#respond Fri, 17 Feb 2023 08:41:44 +0000 https://blog.debugeverything.com/?p=2512 JavaScript é uma linguagem de programação amplamente utilizada no desenvolvimento web. Uma das tarefas comuns em programação é a remoção de elementos de um array. Felizmente, a linguagem oferece várias maneiras de realizar essa tarefa. Neste artigo, mostraremos cinco exemplos de como remover elementos de um array em JavaScript.

  1. splice()

O método splice() remove um elemento específico de um array. Ele também pode ser usado para remover vários elementos consecutivos do array. O primeiro argumento especifica o índice inicial e o segundo argumento especifica o número de elementos a serem removidos. Por exemplo:

let array = [1, 2, 3, 4, 5];
array.splice(2, 1); // remove o elemento de índice 2
console.log(array); // [1, 2, 4, 5]
  1. pop()

O método pop() remove o último elemento do array. Ele não requer argumentos. Por exemplo:

let array = [1, 2, 3, 4, 5];
array.pop(); // remove o elemento 5
console.log(array); // [1, 2, 3, 4]
  1. shift()

O método shift() remove o primeiro elemento do array. Ele não requer argumentos. Por exemplo:

let array = [1, 2, 3, 4, 5];
array.shift(); // remove o elemento 1
console.log(array); // [2, 3, 4, 5]
  1. filter()

O método filter() cria um novo array com todos os elementos que passam em um teste especificado por uma função. Para remover um elemento específico, a função deve retornar false para esse elemento. Por exemplo:

let array = [1, 2, 3, 4, 5];
array = array.filter((element) => element !== 3); // remove o elemento 3
console.log(array); // [1, 2, 4, 5]
  1. slice()

O método slice() retorna uma cópia de uma parte do array em um novo array. O primeiro argumento especifica o índice inicial e o segundo argumento especifica o índice final. Para remover um elemento específico, podemos usar os índices para criar dois arrays e, em seguida, concatená-los. Por exemplo:

let array = [1, 2, 3, 4, 5];
array = array.slice(0, 2).concat(array.slice(3)); // remove o elemento de índice 2
console.log(array); // [1, 2, 4, 5]

Em resumo, existem várias maneiras de remover elementos de um array em JavaScript. A escolha do método depende da necessidade específica do desenvolvedor. Esperamos que este artigo tenha sido útil para você em seu aprendizado de JavaScript.

]]>
https://blog.debugeverything.com/pt/5-formas-de-remover-elementos-de-um-array-em-javascript/feed/ 0
5 Formas de Acessar Propriedades em Objetos JavaScript https://blog.debugeverything.com/pt/5-formas-de-acessar-propriedades-em-objetos-javascript/ https://blog.debugeverything.com/pt/5-formas-de-acessar-propriedades-em-objetos-javascript/#respond Sun, 29 Jan 2023 16:15:49 +0000 https://blog.debugeverything.com/?p=2494 Em JavaScript, um objeto é uma coleção não ordenada de pares chave-valor. Propriedades são os valores associados a uma chave específica em um objeto. Neste artigo, exploraremos 5 exemplos diferentes de como acessar propriedades de objetos em JavaScript.

  1. Método Object.keys()

Este método retorna um array de todas as propriedades enumeráveis de um objeto.

Exemplo:

const carro = {
  marca: "Toyota",
  modelo: "Camry",
  ano: 2022
};
console.log(Object.keys(carro)); // Saída: ["marca", "modelo", "ano"]
  1. Método Object.values()

Este método retorna um array de todos os valores das propriedades enumeráveis de um objeto.

Exemplo:

const carro = {
  marca: "Toyota",
  modelo: "Camry",
  ano: 2022
};
console.log(Object.values(carro)); // Saída: ["Toyota", "Camry", 2022]
  1. Método Object.entries()

Este método retorna um array de arrays contendo os pares chave-valor das propriedades enumeráveis de um objeto.

Exemplo:

const carro = {
  marca: "Toyota",
  modelo: "Camry",
  ano: 2022
};
console.log(Object.entries(carro)); // Saída: [["marca", "Toyota"], ["modelo", "Camry"], ["ano", 2022]]
  1. Loop for...in

O loop for…in permite que você itere sobre as propriedades enumeráveis de um objeto.

Exemplo:

const carro = {
  marca: "Toyota",
  modelo: "Camry",
  ano: 2022
};
for (const chave in carro) {
  console.log(`${chave}: ${carro[chave]}`);
}
/* Saída:
marca: Toyota
modelo: Camry
ano: 2022
*/
  1. Método Object.getOwnPropertyNames()

Este método retorna um array de todas as propriedades (enumeráveis ou não) de um objeto.

Exemplo:

const carro = {
  marca: "Toyota",
  modelo: "Camry",
  ano: 2022
};
console.log(Object.getOwnPropertyNames(carro)); // Saída: ["marca", "modelo", "ano"]

Em conclusão, estes são apenas alguns exemplos de como acessar propriedades de objetos em JavaScript. Entender esses métodos é fundamental para programadores que querem trabalhar com objetos em JavaScript. Além disso, é importante notar que algumas propriedades podem não ser enumeráveis, o que significa que elas não aparecerão no resultado de métodos como Object.keys() ou for...in, mas ainda podem ser acessadas com o método Object.getOwnPropertyNames().

Em resumo, esses são apenas alguns dos vários métodos e técnicas disponíveis para acessar propriedades em objetos JavaScript. É importante que você pratique e experimente diferentes abordagens para descobrir qual é a melhor para o seu projeto. Quanto mais você praticar, mais confortável ficará com a manipulação de objetos em JavaScript.

]]>
https://blog.debugeverything.com/pt/5-formas-de-acessar-propriedades-em-objetos-javascript/feed/ 0
Filtrando arrays com arrow functions em JavaScript https://blog.debugeverything.com/pt/filtrando-arrays-com-arrow-functions-em-javascript/ https://blog.debugeverything.com/pt/filtrando-arrays-com-arrow-functions-em-javascript/#respond Wed, 25 Jan 2023 14:18:17 +0000 https://blog.debugeverything.com/?p=2487 JavaScript é uma linguagem de programação popular e versátil, e uma das suas características mais poderosas é a capacidade de trabalhar com arrays. Uma das funções mais úteis para trabalhar com arrays é a filter. Ela permite filtrar elementos de um array baseado em uma determinada condição. A partir do ECMAScript 6, é possível usar arrow functions com a função filter para tornar o código ainda mais conciso.

A sintaxe de uma arrow function é bastante simples. Ela é escrita como:

(parametros) => {corpo da função}

Aqui estão cinco exemplos de como usar a função filter com arrow functions:

  1. Filtrar números pares de um array:
const numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const pares = numeros.filter(num => num % 2 === 0);
console.log(pares); // [2, 4, 6, 8, 10]
  1. Filtrar objetos por uma propriedade específica:
const pessoas = [
  {nome: "João", idade: 30},
  {nome: "Maria", idade: 25},
  {nome: "José", idade: 35},
  {nome: "Ana", idade: 20}
];
const adultos = pessoas.filter(pessoa => pessoa.idade >= 18);
console.log(adultos); // [{nome: "João", idade: 30}, {nome: "Maria", idade: 25}, {nome: "José", idade: 35}]
  1. Filtrar strings por tamanho:
const palavras = ["banana", "maçã", "pera", "abacaxi", "melancia"];
const curtas = palavras.filter(palavra => palavra.length <= 5);
console.log(curtas); // ["maçã", "pera"]
  1. Filtrar elementos de um array de objetos por uma condição específica:
const carros = [
  {marca: "Fiat", ano: 2020},
  {marca: "Ford", ano: 2015},
  {marca: "Chevrolet", ano: 2010},
  {marca: "Fiat", ano: 2016}
];
const carrosFiat = carros.filter(carro => carro.marca === "Fiat");
console.log(carrosFiat); // [{marca: "Fiat", ano: 2020}, {marca: "Fiat", ano: 2016}]
  1. Filtrar elementos de um array de objetos com múltiplas condições:
const produtos = [
  {nome: "Notebook", preco: 2500, categoria: "eletrônicos"},
  {nome: "Smartphone", preco: 1500, categoria: "eletrônicos"},
  {nome: "TV", preco: 3500, categoria: "eletrônicos"},
  {nome: "Sofá", preco: 2000, categoria: "moveis"},
  {nome: "Cama", preco: 1500, categoria: "moveis"}
];
const eletronicosBaratos = produtos.filter(produto => produto.categoria === "eletrônicos" && produto.preco <= 2000);
console.log(eletronicosBaratos); // [{nome: "Smartphone", preco: 1500, categoria: "eletrônicos"}]

Como você pode ver, usar arrow functions com a função filter torna o código mais conciso e fácil de ler. É uma ótima maneira de filtrar elementos de um array de forma rápida e eficiente. Lembre-se de sempre testar suas condições de filtragem para garantir que você esteja obtendo os resultados esperados.

]]>
https://blog.debugeverything.com/pt/filtrando-arrays-com-arrow-functions-em-javascript/feed/ 0