Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Blazor古怪与ChildContent渲染片段_Blazor_Blazor Server Side - Fatal编程技术网

Blazor古怪与ChildContent渲染片段

Blazor古怪与ChildContent渲染片段,blazor,blazor-server-side,Blazor,Blazor Server Side,这个问题已经被问过了,但是重新提交一个更清晰的例子(希望如此) 当我试图确定Blazor何时以及如何重新呈现和更新状态时,我注意到了这种奇怪的行为 采用以下简单组件Test1Component: @if (_show) { <h3>Test1Component</h3> } @code { private bool _show = true; public void Show() { _show = true; }

这个问题已经被问过了,但是重新提交一个更清晰的例子(希望如此)

当我试图确定Blazor何时以及如何重新呈现和更新状态时,我注意到了这种奇怪的行为

采用以下简单组件
Test1Component

@if (_show) {
    <h3>Test1Component</h3>
}

@code {
    private bool _show = true;

    public void Show() {
        _show = true;
    }

    public void Hide() {
        _show = false;
    }
}
要使其正常工作,必须将
statehaschange()
添加到
Show
Hide
方法中。但是,如果我们将实现更改为包含
RenderFragment
,则
Show
Hide
方法会神秘地开始工作

@if (_show) {
    <h3>@ChildContent</h3>
}

@code {
    private bool _show = true;
    [Parameter] public RenderFragment ChildContent { get; set; }

    public void Show() {
        _show = true;
    } 

    public void Hide() {
        _show = false;
    }
}
我怀疑Blazor在幕后以不同的方式注册了这个组件,因为
RenderFragment
,在内部跟踪其状态,并在更新时自动触发
statehaschange

这就引出了一个问题,在这种情况下,您实际上是使用
StateHadChanged
方法来更新状态,还是在包含RenderFragment时依赖自动神奇维护的状态


有人知道吗。为什么会发生这种情况?二,。为了让它发挥作用,幕后到底发生了什么?我只是注意到这一点,我非常有条理地试图找出从一开始就触发更新的最佳方式,但从Blazor开始,它导致了一些混乱,因为如果不调用
statehaschange
,一些组件将正常工作,而其他组件则无法工作,这种行为有时看似随意,毫无道理。显然,现在开始理解为什么会发生这种情况了。

当您有一个没有
参数的组件时,渲染器将正确地假设没有任何更改,并且在渲染过程中不会因为单击
按钮而重新渲染它

添加RenderFragment参数会强制Blazor进行手动渲染,因为它无法检测参数是否已更改

调用子组件的公共方法的实践是可疑的——如果您只包含一个参数,例如
bool Hide
,并从父组件设置它,那么一切都会正常工作

@if (_show) {
    <h3>@ChildContent</h3>
}

@code {
    private bool _show = true;
    [Parameter] public RenderFragment ChildContent { get; set; }

    public void Show() {
        _show = true;
    } 

    public void Hide() {
        _show = false;
    }
}
<Test1Component @ref="_test1Component">Test1Component</Test1Component>

<button type="button" @onclick="(() => { if (_test1Component != null) _test1Component.Hide(); })">Hide Test</button>
<button type="button" @onclick="(() => { if (_test1Component != null) _test1Component.Show(); })">Show Test</button>

@code{
    Test1Component _test1Component;
}