Em esta documentação de Reagir, diz-se que
shallowCompare executa uma verificação de igualdade superficial nos objetos atuais props e nextProps, bem como no estado atual e nos objetos nextState.
O que não consigo entender é se ele compara superficialmente os objetos, então o método shouldComponentUpdate sempre retornará verdadeiro, como
Não devemos transformar os estados.
e se não estivermos alterando os estados, a comparação sempre retornará falso e, portanto, a atualização shouldComponent sempre retornará verdadeiro. Estou confuso sobre como está funcionando e como vamos substituir isso para aumentar o desempenho.
fonte
comparação superficial é quando as propriedades dos objetos sendo comparados são feitas usando "===" ou igualdade estrita e não conduzirá comparações mais profundas nas propriedades. por exemplo
Embora ambos os objetos pareçam ser iguais,
game_item.teams
não é a mesma referência queupdated_game_item.teams
. Para que 2 objetos sejam iguais, eles devem apontar para o mesmo objeto. Portanto, isso resulta no estado em avaliação para ser atualizadoDesta vez, cada uma das propriedades retornam true para a comparação estrita, pois a propriedade teams no objeto novo e no antigo aponta para o mesmo objeto.
A
updated_game_item3.first_world_cup
propriedade falha na avaliação estrita, pois 1930 é um número enquantogame_item.first_world_cup
é uma string. Se a comparação tivesse sido solta (==), isso teria passado. No entanto, isso também resultará na atualização do estado.Notas Adicionais:
fonte
prevObj
contiver uma chave quenewObj
não tem, a comparação falhará.fonte
Também há uma explicação legada de comparação superficial no React:
UPD : a documentação atual diz sobre comparação superficial:
UPD2: Eu acho que a reconciliação também é um tema importante para um entendimento superficial de comparação.
fonte
O snippet igual superficial por @supi acima ( https://stackoverflow.com/a/51343585/800608 ) falha se
prevObj
tiver uma chave quenewObj
não tem. Aqui está uma implementação que deve levar isso em consideração:Observe que o acima não funciona no Explorer sem polyfills.
fonte
Existe uma implementação com exemplos.
fonte