iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
1
Modern Web

今晚,我想來點Blazor系列 第 19

Day 19:元件的事件處理

  • 分享至 

  • xImage
  •  

在前面的例子看到過幾次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;
    }
}

Lambda expressions

在一些簡單的情境底下,不一定要在@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; }
}

Auto StateHasChanged

Blazor在執行完事件相關程式後,會自動呼叫StateHasChanged方法,通知component要重新渲染,像上面例子執行完checkbox的onchange程式碼後,Blazor自動呼叫StateHasChanged,通知EventDemo component要重新渲染,所以可以在頁面上看到訊息消失又顯示,事件相關處理我們就不需手動加上StateHasChanged方法,讓Blazor來呼叫即可。

Prevent Default

有的時候我們不希望一些事件照著預設的行為觸發時,在寫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;
        }
    }
}


上一篇
Day 18:樣板元件(2)
下一篇
Day 20:Javascript interop
系列文
今晚,我想來點Blazor30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言