Um desafio de ganchos do React para desenvolvedores seniores do React

Você pode resolver este problema?

Um tempo atrás, um amigo me enviou uma demonstração do React para testar minha compreensão do React.

Dei uma olhada mais de perto nesta demonstração. Embora o código seja muito pequeno, ele contém o seguinte:

  • Problema de fechamento com ganchos
  • O princípio do estado

A demonstração

A estrutura da demonstração é simples: contém um botão e uma lista.

E quando o botão é clicado, ele adiciona algo à lista, como você pode ver abaixo:

Se parece com isso:

Até agora, é bem simples, não é?

A parte engraçada e complexa é que quando você clica no Addbotão, ele adiciona um novo botão que também tem um onClick={add}evento na lista.

Então, se você clicar Addsete vezes, a página ficará assim:

Você entendeu? Aqui está uma demonstração on-line:

O desafio

Aqui está uma pergunta: se clicarmos nesses números, o que acontecerá?

  • Se clicarmos no botão 0, como será a lista?
  • Se clicarmos no botão 6, como será a lista?

A resposta

Alguns desenvolvedores podem pensar que um novo botão será empurrado para a lista depois de clicar em um número.

Mas esta resposta está errada. Quando clicamos em um número, o comprimento da lista se torna [ the number+ 1], e o último número da lista se torna [ the largest number before the click+ 1].

Eu sei que esta afirmação é um pouco de boca cheia, mas deixe-me explicar com alguns exemplos.

Suponha que a lista atual seja esta:

Se clicarmos em 0, o comprimento da lista mudará para 0 + 1 = 1, e o último número se tornará 6 + 1 = 7.

Agora, se clicarmos em 2, o comprimento da lista mudará para 2 + 1 = 3, e o último número se tornará 6 + 1 = 7.

Você pode experimentá-lo fornecendo uma demonstração incorporada.

Mas você sabe por que esse fenômeno ocorre?

Estado e Encerramento

Este é o resultado de dois fatores trabalhando juntos:

  • O problema de fechamento com ganchos
  • Como o estado é montado

Quando um botão era clicado, a addfunção era chamada. E então, o fechamento será criado com base em seu contexto.

O fecho contém:

  • addfunção
  • list
  • setList

Aqui está um mal-entendido comum: O listretornado por várias chamadas para useStateé o mesmo objeto com o mesmo endereço na memória.

Na verdade, o listretorno de cada chamada para useStateé calculado com base na seguinte fórmula:

base state + update1 + update2 + … = current state

Isso leva a um fenômeno muito importante: as addfunções correspondentes a cada número estão em diferentes fechamentos e listpossuem valores diferentes.

ié uma variável de nível de módulo; eles são os mesmos em cada fechamento.

Ao clicar em 0, acontece o seguinte:

  • ié uma variável de nível de módulo, 6
  • listneste fechamento é[]

setList(
  [].concat(
    <button key={7} onClick={add}>{7}</button>
  )
);

Quando você clica em 2, isso acontece:

  • ié uma variável de nível de módulo, 6
  • listneste fechamento é[0, 1]

setList(
  [0, 1].concat(
    <button key={7} onClick={add}>{7}</button>
  )
);

Você entendeu?

Conclusão

Uma vez que o princípio de montagem do estado é:

base state + update1 + update2 + … = current state

E por causa do fechamento, listvalores diferentes são registrados em cada botão numérico.

Isso acaba levando ao fenômeno descrito no início do artigo.

Espero que este artigo seja útil para você.

Solução

Se você não quiser esse fenômeno de encerramento, poderá modificar o parâmetro de setListpara o formulário da função.

Suggested posts

Chega de senhas — como as senhas substituirão sua senha

Chega de senhas — como as senhas substituirão sua senha

Para evitar ambigüidade, os seguintes termos serão usados; Autenticador; O celular que está sendo utilizado para fazer o login no Site; O site ou aplicativo que o usuário está usando para fazer a solicitação de login do Serviço; O fornecedor que fornece o serviço fornecido, por exemplo

A arte é sempre apolítica?

A arte é sempre apolítica?

Ontem, fechamos a porta do Festival Eurovisão da Canção deste ano com uma brilhante e caótica grand finale, onde a cantora sueca Loreen levou para casa o troféu, tornando-se a primeira mulher a vencer duas vezes e trazendo a coroa de volta para a Suécia 50 anos depois que o ABBA venceu a competição com “Waterloo”. Eles se tornaram um dos maiores artistas do cânone da música pop.

Related posts

O assassinato de Jordan Neely e o problema do racismo “patriótico”

Os EUA podem dar o passo essencial de não igualar comportamento racista a ser um bom americano?

O assassinato de Jordan Neely e o problema do racismo “patriótico”

[Alerta de gatilho: este ensaio inclui capturas de tela de pessoas elogiando o assassino de Jordan Neely.] Os policiais finalmente - e talvez com relutância - acusaram Daniel Penny, o homem que sufocou Jordan Neely até a morte, por aquele homicídio.

O desafio de leitura Goodreads é tóxico

O desafio de leitura Goodreads é tóxico

A coceira na minha mão aumentou enquanto eu negociava com o livreiro local por mais um livro. Este livro, como o resto que comprei recentemente, encontraria seu trono na minha pilha 'To Be Read' (TBR); e ainda assim, eu comprei.

Por que alguns freelancers estão fingindo suas vidas

Por que alguns freelancers estão fingindo suas vidas

Estive recentemente no Linkedin, a maior rede social profissional do mundo, e encontrei postagens de designers freelancers que sigo que me chamaram a atenção. Todos postaram fotos de aviões, na praia com seus laptops, de piscinas e escritórios com vistas incríveis.

pronomes são super assustadores

Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..