diff --git a/src/Masa.Blazor/Components/DataTable/MDataTable.razor.cs b/src/Masa.Blazor/Components/DataTable/MDataTable.razor.cs index a7450d8332..6fb59d7784 100644 --- a/src/Masa.Blazor/Components/DataTable/MDataTable.razor.cs +++ b/src/Masa.Blazor/Components/DataTable/MDataTable.razor.cs @@ -129,6 +129,8 @@ public DataTableResizeMode ResizeMode set => SetValue(value); } + private bool _prevIsMobile; + public IEnumerable> ComputedHeaders { get @@ -193,31 +195,19 @@ public IEnumerable> ComputedHeaders private bool HasEllipsis => Headers.Any(u => u.HasEllipsis); - private bool IsMobile { get; set; } - - private void CalculateIsMobile() + private bool IsMobile { - var (width, mobile, name, mobileBreakpoint) = MasaBlazor.Breakpoint; - - if (width == 0) + get { - IsMobile = false; - return; - } + var (width, mobile, name, mobileBreakpoint) = MasaBlazor.Breakpoint; - if (mobileBreakpoint.Equals(MobileBreakpoint)) - { - IsMobile = mobile; - return; - } + if (Equals(mobileBreakpoint.Value, MobileBreakpoint.Value)) + { + return mobile; + } - if (MobileBreakpoint.IsT1) - { - IsMobile = width < MobileBreakpoint.AsT1; - return; + return MobileBreakpoint.IsT1 ? width < MobileBreakpoint.AsT1 : name <= MobileBreakpoint.AsT0; } - - IsMobile = name == MobileBreakpoint.AsT0; } public Dictionary ColspanAttrs => new() @@ -247,7 +237,7 @@ protected override void OnInitialized() CustomFilter = CustomFilterWithColumns; ItemValues = Headers.Select(header => new ItemValue(header.Value)); - CalculateIsMobile(); + _prevIsMobile = IsMobile; MasaBlazor.WindowSizeChanged += MasaBlazorWindowSizeChanged; MasaBlazor.RTLChanged += MasaBlazorOnRTLChanged; } @@ -303,7 +293,13 @@ private string GetText(string value) private void MasaBlazorWindowSizeChanged(object? sender, WindowSizeChangedEventArgs e) { - CalculateIsMobile(); + if (_prevIsMobile == IsMobile) + { + return; + } + + _prevIsMobile = IsMobile; + InvokeAsync(StateHasChanged); } diff --git a/src/Masa.Blazor/Components/NavigationDrawer/MNavigationDrawer.razor.cs b/src/Masa.Blazor/Components/NavigationDrawer/MNavigationDrawer.razor.cs index 8776f432f0..1f686c0471 100644 --- a/src/Masa.Blazor/Components/NavigationDrawer/MNavigationDrawer.razor.cs +++ b/src/Masa.Blazor/Components/NavigationDrawer/MNavigationDrawer.razor.cs @@ -43,7 +43,7 @@ public StringNumber? Height [Parameter] public OneOf? MobileBreakpoint { - get => GetValue(MasaBlazor.Breakpoint.MobileBreakpoint); + get => GetValue?>(); set => SetValue(value); } @@ -150,6 +150,7 @@ public bool IsDark private ModifierBuilder _modifierBuilder = _block.CreateModifierBuilder(); private bool _prevPermanent; + private bool _prevIsMobile; private readonly List _dependents = new(); protected object? Overlay { get; set; } @@ -170,7 +171,7 @@ protected bool IsActive set => SetValue(value); } - protected bool IsMobile => !Stateless && !Permanent && IsMobileBreakpoint; //TODO: fix mobile + protected bool IsMobile => !Stateless && !Permanent && IsMobileBreakpoint; protected bool ReactsToClick => !Stateless && !Permanent && (IsMobile || Temporary); @@ -299,17 +300,14 @@ protected bool IsMobileBreakpoint { get { - var mobile = MasaBlazor.Breakpoint.Mobile; - var width = MasaBlazor.Breakpoint.Width; - var name = MasaBlazor.Breakpoint.Name; - var mobileBreakpoint = MasaBlazor.Breakpoint.MobileBreakpoint; + var (width, mobile, name, mobileBreakpoint) = MasaBlazor.Breakpoint; - if (Equals(mobileBreakpoint.Value, MobileBreakpoint?.Value)) + if (MobileBreakpoint is null || Equals(mobileBreakpoint.Value, MobileBreakpoint.Value)) { return mobile; } - return mobileBreakpoint.IsT1 ? width < mobileBreakpoint.AsT1 : name == mobileBreakpoint.AsT0; + return MobileBreakpoint.Value.IsT1 ? width < MobileBreakpoint.Value.AsT1 : name <= MobileBreakpoint.Value.AsT0; } } @@ -319,8 +317,6 @@ protected bool IsMobileBreakpoint protected bool ReactsToRoute => !DisableRouteWatcher && !Stateless && (Temporary || IsMobile); - protected bool IsFullscreen => MasaBlazor != null && MasaBlazor.Breakpoint.SmAndDown; - public IEnumerable DependentSelectors { get @@ -342,7 +338,7 @@ protected override void OnInitialized() _prevPermanent = Permanent; - MasaBlazor.BreakpointChanged += OnBreakpointOnUpdate; + MasaBlazor.WindowSizeChanged += MasaBlazorWindowSizeChanged; if (Value == null && ValueChanged.HasDelegate) { @@ -444,13 +440,15 @@ private async void OnLocationChanged(object? sender, } } - private async void OnBreakpointOnUpdate(object? sender, BreakpointChangedEventArgs e) + private async void MasaBlazorWindowSizeChanged(object? sender, WindowSizeChangedEventArgs e) { - if (!e.MobileChanged) + if (_prevIsMobile == IsMobile) { return; } + _prevIsMobile = IsMobile; + if (!ReactsToResize || !ReactsToMobile) { return; @@ -510,6 +508,7 @@ private void Init() } else if (!Temporary) { + _prevIsMobile = IsMobile; IsActive = !IsMobile; } } @@ -592,7 +591,7 @@ public async Task HandleOnClickAsync(MouseEventArgs e) protected override async ValueTask DisposeAsyncCore() { RemoveApplication(); - MasaBlazor!.BreakpointChanged -= OnBreakpointOnUpdate; + MasaBlazor!.WindowSizeChanged -= MasaBlazorWindowSizeChanged; MasaBlazor.Application.PropertyChanged -= ApplicationPropertyChanged; NavigationManager!.LocationChanged -= OnLocationChanged; await OutsideClickJsModule.UnbindAndDisposeAsync();