AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77675023
Accepted
David Thielen
David Thielen
Asked: 2023-12-17 23:45:14 +0800 CST2023-12-17 23:45:14 +0800 CST 2023-12-17 23:45:14 +0800 CST

Como o Blazor sabe quando procurar uma alteração de parâmetro

  • 772

Digamos que eu tenha as duas caixas de combinação a seguir (todas pseudocódigo):

<ComboBox Data="@AllLastNames" @bind-Value="@LastName"/>
<ComboBox Data="@AllFirstNames" @bind-Value="@FirstName"/>

E o código por trás é:

private string LastName { get; set; }
private string FirstName { get; set; }

private List<string> AllLastNames => _allLastNames;
private List<string> AllFirstNames => _firstNameDictionary[LastName];

Ok, tudo o que foi dito acima funcionará muito bem se o Blazor, nos momentos apropriados, obtiver AllFirstNames, ver que ele mudou por meio de uma comparação de igualdade de referência e chamar SetParameteraAsync()com o novo valor.

Então, quando/por que e como o Blazor decide verificar essas Data=propriedades para ver se elas foram alteradas?

Este é um caso em que, dentro do LastNamesetter, devo ligar StateHasChanged()?

blazor
  • 4 4 respostas
  • 46 Views

4 respostas

  • Voted
  1. abberdeen
    2023-12-18T01:04:45+08:002023-12-18T01:04:45+08:00

    Como e por que o Blazor decide atualizar o estado pode ser considerado uma mágica ou uma caixa preta ( mais sobre estados ).

    Mas se você estiver interessado em saber em que casos funciona, posso dar os seguintes exemplos.

    O estado é atualizado automaticamente :

    • Nos manipuladores de eventos Blazor (@onclick, @bind- etc.)
    • Em eventos do ciclo de vida do componente ( OnInitialized, OnParametersSet, ShouldRender, OnAfterRender, etc.)
    • Na atualização da marcação do Razor

    Você precisa atualizar o estado manualmente :

    • Operações Assíncronas (recebimento de dados de API, banco de dados, arquivo, etc.)
    • Eventos não Blazor
    • Interoperabilidade com JavaScript

    No seu caso @bind-Value="@LastName"funciona como uma trigger para atualizar automaticamente o estado, por exemplo quando o usuário seleciona um item no ComboBox AllLastNames, toda a cadeia é atualizada, ou seja LastName, AllFirstNamese ComboBox AllFirstNamessem chamar StateHasChangedo .

    Notas: Esta é minha preferência pessoal, mas pela minha experiência, usar um dicionário sem verificar a existência pode levar a um erro e muitas vezes é difícil encontrar a fonte.

    Eu sugeriria verificar a existência (mesmo se você tiver certeza de que ela existe):

    private List<string> AllFirstNames => _firstNameDictionary.TryGetValue(LastName, out var firstNames) ? firstNames : new List<string>();
    
    • 1
  2. MrC aka Shaun Curtis
    2023-12-18T06:54:14+08:002023-12-18T06:54:14+08:00

    Não há magia negra envolvida.

    Quando a renderização instancia um componente, ela cria e mantém uma lista das propriedades mapeadas para esse componente. Ele gera o ParameterViewobjeto desta lista quando chama SetParametersAsync.

    Quando o Renderizador renderiza um componente, ele verifica se o estado foi alterado em algum parâmetro do subcomponente. Se sim, ele chama SetParametersAsynco subcomponente.

    Nota que afirmo: "Chama SetParametersAsync", não "renderiza o componente". Se o componente for um ComponentBasecomponente, então será. Existem outros componentes da biblioteca de componentes de terceiros que podem substituir SetParametersAsynce implementar lógicas diferentes que não acionam um arquivo StateHasChanged.

    O algoritmo aplicado a cada valor para detectar uma alteração é o seguinte:

    public static bool MayHaveChanged<T1, T2>(T1 oldValue, T2 newValue)
    {
        var oldIsNotNull = oldValue != null;
        var newIsNotNull = newValue != null;
    
        // Only one is null so different
        if (oldIsNotNull != newIsNotNull)
            return true;
    
        var oldValueType = oldValue!.GetType();
        var newValueType = newValue!.GetType();
    
        // HERE
        if (oldValueType != newValueType)
            return true;
    
        if (!IsKnownImmutableType(oldValueType))
            return true;
    
        return !oldValue.Equals(newValue);
    }
    
    private static bool IsKnownImmutableType(Type type)
        => type.IsPrimitive
            || type == typeof(string)
            || type == typeof(DateTime)
            || type == typeof(Type)
            || type == typeof(decimal)
            || type == typeof(Guid);
    

    Basicamente, ele pode detectar alterações em primitivos e em alguns objetos de valor. Para todo o resto MayHaveChangedretorna true[não se arrisca]. Observe que callbacks e RenderFragments são objetos de referência, então return true.

    No seu caso List<string> AllLastNamesé um tipo de referência, então falha no teste e MayHaveChangedretorna true. Portanto, se o componente pai for ComboBoxrenderizado, o renderizador SetParametersAsyncchamará ComboBox.

    • 1
  3. J S
    2023-12-17T23:52:04+08:002023-12-17T23:52:04+08:00

    Adicione o manipulador de eventos, por exemplo, OnChange à sua caixa de combinação que atualizará a lista de referência com novos dados do banco de dados ou de alguma outra fonte que você esteja usando

    • 0
  4. Best Answer
    ℍ ℍ
    2023-12-18T01:24:15+08:002023-12-18T01:24:15+08:00

    Então, quando/por que e como o Blazor decide verificar essas propriedades Data= para ver se elas foram alteradas?

    Toda vez que este componente é renderizado, e isso deve acontecer quando o LastName for alterado.

    Data="@AllFirstNames"é um 'parâmetro complexo' no Blazor, o que significa que sempre será tratado como alterado.

    • 0

relate perguntas

  • Como obter o contexto correto para o modelo SfListView dentro do componente EditForm Blazor?

  • Blazor - limpe todas as opções de seleção sem recuperar os dados

  • Manipular index.html no Blazor WASM

  • A ligação do Blazor à entrada de texto não funciona após inserir um valor na entrada

  • A página do Blazor que possui passagem de dados de componente para componente está gerando um erro de evento durante o carregamento

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve