Вообще говоря, метод StateHasChanged () автоматически вызывается после срабатывания события пользовательского интерфейса, например, после нажатия элемента кнопки возникает событие click и автоматически вызывается метод StateHasChanged () для уведомления компонента что его состояние изменилось, и он должен выполнить повторную визуализацию.
При первоначальном доступе к компоненту Index. Сначала выполняется родительский компонент, а затем родительский компонент - его дочерний.
При каждом нажатии кнопки «Открыть» компонент индекса повторно выполняет визуализацию (это потому, что целью события является родительский компонент, который по умолчанию будет выполнен повторный рендеринг (не нужно использовать StateHasChanged). Но не ребенок, который не знает, что его состояние изменилось. Чтобы ребенок знал, что его состояние изменилось и что он должен повторно выполнить рендеринг, вы следует добавить вызов метода StateHasChanged вручную в методе Show. Теперь, когда вы нажимаете кнопку «Открыть», дочерний компонент сначала перерисовывается, а затем перерисовывается его родительский компонент. Теперь отображается красный div visible.
Нажмите кнопку «Закрыть», чтобы скрыть красный div. На этот раз только дочерний компонент выполняет повторный рендеринг (это связано с тем, что целью события является дочерний компонент, и по умолчанию он повторяется. ), но не родитель.
Это поведение является правильным и умышленным.
Если вы удалите вызов метод StateHasChanged из метода AddItem.Show, определите это свойство: [Parameter] public EventCallback<bool> CloseEventCallback { get; set; }
и добавьте атрибут компонента в родительский компонент, чтобы присвоить значение этому свойству следующим образом: <AddItem @ref="AddItem" CloseEventCallback="CallBack" />
, вы не заметите никаких внешних изменений, но на этот раз порядок повторного рендеринга при нажатии кнопки «Открыть» - сначала родительский рендеринг, затем дочерний рендеринг. Это точно описывает проблему, которую вы обнаружили в своем вопросе в комментариях:
Итак, почему мой тест 3 сработал так, как ожидалось, даже если CloseEventCallback нигде не вызывался?
Вы правы ... Я действительно не мог объяснить это поведение до дальнейшего расследования. Я постараюсь выяснить, что происходит, и дам вам знать.
Метод close AddItem вызывает метод CloseEventCallback, чтобы сообщить родительскому элементу о необходимости повторного рендеринга.
Примечание: ваш код определяет CloseEventCallback с указателем логического типа, поэтому вы должен определить метод в родительском компоненте, который имеет логический параметр. Когда вы вызываете «делегат» CloseEventCallback, вы фактически вызываете метод Index.Callback, и вам следует передать ему логическое значение. Естественно, если вы передаете значение компоненту, вы ожидаете его повторного рендеринга, чтобы новое состояние можно было увидеть в пользовательском интерфейсе. И это та функциональность, которую обеспечивает EventCallback: хотя событие запускается в дочернем компоненте, его целью является родительский компонент, что приводит к повторной визуализации родительского компонента.
Мне интересно, почему родительский компонент должен заново визуализировать себя, если вызван один из подписанных EventCallback?
Это именно то, что я пытаюсь объяснить в параграфе выше. Тип EventCallback был специально разработан для решения проблемы цели события, перенаправления события на компонент, состояние которого изменилось (родительский компонент), и его повторной визуализации.