這篇我們來了解元件的一生。
一個元件從出生到死亡,有幾個階段是我們可以一同參與的,按照順序有下列幾個:
當元件完全載入並要初始化時,就會執行OnInitialized方法,有些元件,需要頁面載入後顯示資料,就可以OnInitialized方法中進行http request取得資料。
這個method與OnInitialized 不大相同,OnInitialized是只有在剛初始化時會執行,OnParametersSet 則是在OnInitialized後執行一次,再來是每次只要Parameter有異動,就會執行一次,來看看下面這個新增待辦事項的例子:
index.razor。
@page "/"
<h1>OnParametersSet Demo</h1>
<table class="table table-hover">
    <tr>
        <th>代辦事項</th>
    </tr>
    @foreach (var item in Todos)
    {
        <TodoItem item="@item" />
    }
</table>
<button class="btn btn-primary" @onclick="addTodo">新增待辦事項</button>
@code{
    public List<string> Todos { get; set; }
    protected override void OnInitialized()
    {
        base.OnInitialized();
        Todos = new List<string>();
    }
    void addTodo()
    {
        Todos.Add("Buy Banana");
    }
}
TodoItem.razor
<tr>
    <td>@item</td>
</tr>
@code {
    [Parameter]
    public string item { get; set; }
    protected override void OnParametersSet()
    {
        base.OnParametersSet();
        Console.WriteLine("OnParametersSet called");
    }
}
在Index.razor中,我們透過OnInitialized初始化Todo這個List物件,並在table中透過foreach,將每個item傳給TodoItem這個元件,來顯示每一筆tr資料。
TodoItem的職責單純:接收父元件index.razor傳來的Todo Item,並bind到td中的@item,這邊我們override OnParametersSet,只要item有設定或異動,就會在瀏覽器console顯示OnParametersSet called。
在index.razor中只要新增待辦事項按鈕點擊後,將會加入一筆資料到Todos中,這時就會觸發TodoItem中的OnParametersSet ,來看看效果吧。
OnAfterRender是在Html都載入完畢後觸發,所以如果需要使用Javascript來控制Html的話,可以在這個時間點進行。另外OnAfterRender還可以透過firstRender參數來看是否初次render。
現在幫index.razor頁面加上OnAfterRender
@page "/"
<h1>OnParametersSet Demo</h1>
<table class="table table-hover">
    <tr>
        <th>代辦事項</th>
    </tr>
    @foreach (var item in Todos)
    {
        <TodoItem item="@item" />
    }
</table>
<button class="btn btn-primary" @onclick="addTodo">新增待辦事項</button>
@code{
    public List<string> Todos { get; set; }
    protected override void OnInitialized()
    {
        base.OnInitialized();
        Todos = new List<string>();
    }
    void addTodo()
    {
        Todos.Add("Buy Banana");
    }
    protected override void OnAfterRender(bool firstRender)
    {
        base.OnAfterRender(firstRender);
        Console.WriteLine($"OnAfterRender called。Is First Render : {firstRender}");
    }
}
來看看console怎麼顯示
可以看到每次點擊新增按鈕都會執行OnAfterRender,但只有第一次載入時,IsFirstRender是True,再次點擊按鈕後一樣執行OnAfterRender ,但IsfFirstRender變false了。
另外如果因為一些因素不想要rerender的話,可以override ShouldRender。
只要return false,整個畫面都不會重新渲染。
protected override bool ShouldRender()
    {
        return false;
    }
看看設定後的樣子:
以上就是今天元件生命週期的介紹。