Совместное использование одного свойства на нескольких страницах cshtml в Blazor

Я изо всех сил пытаюсь разделить значение свойств между компонентами в Blazor. В основном у меня есть кнопка с событием onclick, которое устанавливает значение функции в зависимости от значения, которое другая страница cshtml должна реагировать на значение, а это не так. Проблема в том, что поскольку обе страницы cshtml наследуют одну и ту же функцию, у них есть собственный экземпляр функции. Вот мой код:

функция:

public class MenuFunctions : BlazorComponent, IMenuFunctions
{

    public bool CollapseNavMenu
    {
        get ; set;

    }

    public void ToggleNavMenu()
    {
        CollapseNavMenu = !CollapseNavMenu;
    }
}

Основная кнопка в NavMenuToggleComponent.cshtml:

@inherits MenuFunctions 

<div class = "pl-4  navbar navbar-dark">
   <button class = "navbar-toggler navbar-brand main-button" title = "MENU" onclick=@ToggleNavMenu>
    MENU
   </button>
</div>

мой файл NavMenu.cshtml:

@inherits MenuFunctions


<div class = "@(CollapseNavMenu ? "collapse" : null)" onclick=@ToggleNavMenu>
<ul class = "nav flex-column">
    <li class = "nav-item px-3">
        <NavLink class = "nav-link" href = "home">
            <span class = "oi oi-home" aria-hidden = "true"></span> Home
        </NavLink>
    </li>
    <li class = "nav-item px-3">
        <NavLink class = "nav-link" href = "frontpage">
            <span class = "oi oi-home" aria-hidden = "true"></span> Front Page
        </NavLink>
    </li>
    <li class = "nav-item px-3">
        <NavLink class = "nav-link" href = "counter">
            <span class = "oi oi-plus" aria-hidden = "true"></span> Counter
        </NavLink>
    </li>
    <li class = "nav-item px-3">
        <NavLink class = "nav-link" href = "" Match=NavLinkMatch.All>
            <span class = "oi oi-account-login" aria-hidden = "true"></span> Login
        </NavLink>
    </li>
</ul>
</div>

собрать все это вместе в моем MainLayout.cshtml

@inherits BlazorLayoutComponent

<NavMenuToggleComponent></NavMenuToggleComponent>
<div class = "sidebar">
   <NavMenu />
</div>

<div class = "main">

<div class = "top-row px-4">
    <a href = "http://blazor.net" target = "_blank" class = "ml-md-auto">About</a>
    <NavLink class = "nav-link pull-right" href = "logout">
        <span class = "oi oi-account-logout" aria-hidden = "true"></span> Logout
    </NavLink>
</div>

<div class = "content px-4">
    @Body
</div>
</div>

поэтому, когда я нажимаю кнопку в NavMenuToggleComponent.cshtml, я хочу, чтобы CollapseNavMenu реагировал в файле NavMenu.cshtml

Если я уберу использование интерфейса, то добавлю компоненты на страницы вместо Inherit, а затем добавлю в автозагрузку следующее:

services.AddSingleton<MenuFunctions>();

страницы будут загружаться, но я все еще получаю ту же проблему.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
218
1

Ответы 1

Решением здесь было бы перенести общее свойство в то место, где оно является общим, в данном случае MainLayout.cshtml, и не делать компоненты зависимыми от общего интерфейса.

Таким образом, MainLayout.cshtml будет хранить состояние в новом свойстве, и это свойство будет привязано к двум компонентам.

Вы не должны использовать DI для классов компонентов, только для классов предоставления услуг и т.п.

Поскольку я поместил код в компонент (например, MenuFunctions), а не использовал @functions внизу страницы, мой MainLayout.cshtml уже наследуется от BlazorLayoutComponent. Поместив код в NavMenuToggleComponent.cshtml непосредственно в MainLayout (у меня это было изначально), я не могу добавить второй @inherits... в MainLayout.cshtml, что в первую очередь вынудило меня разделить код с этой страницы.

bilpor 21.01.2019 10:13

Другие вопросы по теме