在前面的例子看到過幾次onclick事件的寫法,除了onclick事件外,常見的還有keydown、mouseover等等事件,使用這些事件的寫法,與前面看到的onclick一樣用@on{event},下面看一個onchange例子:
@page "/checkbox"
<div class="form-check">
<input class="form-check-input" @onchange="ToggleMsg" type="checkbox" value="" id="defaultCheck1">
<label class="form-check-label" for="defaultCheck1">
顯示訊息
</label>
</div>
@if (IfShow)
{
<h4>My Custom Message !</h4>
}
@code {
private bool IfShow { get; set; }
private void ToggleMsg()
{
IfShow = !IfShow;
}
}
在一些簡單的情境底下,不一定要在@code區塊寫處理的method,可以直接在@on{event}後面使用Lambda expressions來寫事件處理的程式碼,例如我們可以將上述的例子改成以下的Lambda expression寫法:
@page "/EventDemo"
<div class="form-check">
<input class="form-check-input" @onchange="() => IfShow = !IfShow" type="checkbox" value="" id="defaultCheck1">
<label class="form-check-label" for="defaultCheck1">
顯示訊息
</label>
</div>
@if (IfShow)
{
<h4>My Custom Message !</h4>
}
@code {
private bool IfShow { get; set; }
}
Blazor在執行完事件相關程式後,會自動呼叫StateHasChanged方法,通知component要重新渲染,像上面例子執行完checkbox的onchange程式碼後,Blazor自動呼叫StateHasChanged,通知EventDemo component要重新渲染,所以可以在頁面上看到訊息消失又顯示,事件相關處理我們就不需手動加上StateHasChanged方法,讓Blazor來呼叫即可。
有的時候我們不希望一些事件照著預設的行為觸發時,在寫Javascript時可以用preventDefault()來防止預設行為,那在Blazor中我們要怎麼做呢?
下面這邊的例子是在input標籤中只能輸入小寫字母,如果輸入大寫,在瀏覽器的Console會提示改用小寫字母。
由於我們要檢查user輸入的字是否為小寫,因此用onkeypress事件取得user輸入的字母﹐再來,如果user輸入大寫字母,我們也不希望顯示在輸入框中,只要顯示小寫的就好。
按照預設瀏覽器會顯示user輸入的任何字元,因此我們需要停止這樣的預設行為,才能完成需求。
要停止預設行為,我們只要設定@on{event}:preventDefault即可,程式碼如下:
@page "/PreventDefault"
<div class="form-group">
<label for="input">輸入英文名字(小寫)</label>
<input value="@name" id="input" class="form-control" @onkeypress="CheckName" @onkeypress:preventDefault />
</div>
@code {
public string name { get; set; }
private void CheckName(KeyboardEventArgs e)
{
bool isUpper = char.IsUpper(Convert.ToChar(e.Key));
if (isUpper)
{
Console.WriteLine($"您輸入的是{e.Key},請改用小寫字母");
}
else
{
name += e.Key;
}
}
}