JavaScript integrálása HTML5 Canvas-szal a Blazorban
A Blazor Server alkalmazások rugalmasságot biztosítanak a fejlesztőknek, hogy hatékony webalkalmazásokat készítsenek C# és .NET technológiák használatával. Vannak azonban olyan forgatókönyvek, amikor a JavaScript kihasználása szükségessé válik, különösen olyan feladatokhoz, mint a HTML5 vászonelem manipulálása. Az egyik ilyen forgatókönyv magában foglalja a dinamikus rajzolást egy vászonra a Blazor-komponensen áthaladó adatok alapján.
Ebben a konkrét beállításban előfordulhat, hogy a Blazor Razor oldalon van egy hurok, ahol az adatok listája egyedi HTML vászonelemek létrehozására szolgál. Minden egyes vászonhoz meg kíván hívni egy egyéni JavaScript-függvényt a képek vagy alakzatok megjelenítéséhez. A C# és a JavaScript ezen kombinációja egyedülálló kihívást jelent, de nagy sokoldalúságot biztosít.
Bár előfordulhat, hogy sikeresen tesztelte JavaScript-kódját önálló HTML-projektekben, a Blazorba való integrálása, különösen a Razor HTML szakaszból történő meghívása, más megközelítést igényel. Itt lép életbe a Blazor JavaScript interopja, különösen az "IJSRuntime" szolgáltatás használatával.
Ebben az útmutatóban megvizsgáljuk, hogyan hívhatja meg egyéni JavaScript-függvényét a vászon manipulálásához a Blazor szerver projekt HTML részében. A folyamatot lépésről lépésre lebontjuk, hogy biztosítsuk a Blazor és a JavaScript közötti zökkenőmentes integrációt.
Parancs | Használati példa |
---|---|
@inject | A @inject direktíva egy szolgáltatás beszúrására szolgál (pl IJSRuntime) egy Blazor komponensbe. Lehetővé teszi JavaScript függvények meghívását C#-ból a Blazor alkalmazásban. Például az @inject IJSRuntime A JSRuntime beadja a JavaScript futásidejű szolgáltatást. |
InvokeVoidAsync | Ez a módszer része IJSRuntime és JavaScript függvény meghívására szolgál C#-ból anélkül, hogy visszatérési értéket várna. Például: JSRuntime.InvokeVoidAsync("drawImage", canvasId, data); meghívja a JavaScript függvényt drawImage hogy manipulálja a vásznat. |
OnAfterRenderAsync | Ez az életciklus-módszer a Blazorban az összetevő megjelenítése után fut le. Gyakran használják JavaScript-kód futtatására, miután az oldal és elemei készen állnak, például egy JavaScript-modul betöltése az oldal megjelenítése után. Példa: védett felülírás aszinkron Task OnAfterRenderAsync(bool firstRender). |
IJSObjectReference | A IJSObjectReference interfész a JavaScript modulok Blazorba történő importálásakor használatos. Lehetővé teszi a moduláris JavaScript interakciót külső JS-fájlok hivatkozásával. Például: IJSObjectReference jsModule = await JSRuntime.InvokeAsync |
Verifiable | This is a method from the Moq library used in unit testing. It marks an expectation as verifiable, ensuring that the call to a mocked method (such as a JavaScript interop function) was made during the test. Example: jsInteropMock.Setup(x =>Ez egy módszer a Moq könyvtárból, amelyet az egységteszteknél használnak. Egy elvárást jelöl meg ellenőrizhetőnek, biztosítva, hogy a teszt során megtörténjen egy megcsúfolt metódus (például JavaScript interop függvény) hívása. Példa: jsInteropMock.Setup(x => x.InvokeAsync |
await | Ez egy aszinkron programozási parancs, amely egy aszinkron művelet eredményére vár, például JavaScript interop hívásra. Például várja meg a JSRuntime.InvokeVoidAsync("drawImage", canvasId, data); biztosítja a funkció befejezését a végrehajtás folytatása előtt. |
@code | A @kód A Blazor blokk lehetővé teszi a C# kód beírását egy Razor komponensbe. Ide kerül a logika, például a JavaScript függvények meghívása vagy a komponens metódusok meghatározása. Példa: @code { public void DrawImageOnCanvas() { ... } }. |
It.IsAny | Ezt az egységteszteknél használják, hogy egy adott típusú bármely értéknek megfeleljenek a próbabeállítás során. Különösen hasznos a dinamikus adatokat fogadó interop hívások kigúnyolásakor. Példa: It.IsAny |
A Blazor és a JavaScript interop magyarázata a vászonmanipulációhoz
Az első szkriptpélda bemutatja, hogyan lehet kihasználni IJSRuntime JavaScript függvények meghívásához egy Blazor komponensen belül. A @inject direktívát használják a beadására IJSRuntime szolgáltatás, amely megkönnyíti a kommunikációt a Blazor és a JavaScript között. Ez elengedhetetlen, ha olyan HTML-elemeket kell manipulálnia, mint a HTML5 vászon C#-ból. Ebben a példában egy hurok átmegy egy adatlistán, és a lista minden eleméhez dinamikusan generál egy vászonelemet. Egy gombnyomással a JavaScript függvény drawImage hívják, átadva a vászon azonosítóját és a megfelelő adatokat.
Ennek a megközelítésnek a kulcsa a használata InvokeVoidAsync, egy olyan módszer, amely lehetővé teszi a C# számára JavaScript függvények meghívását anélkül, hogy visszatérési értéket várna. Ez akkor fontos, ha egyszerűen csak egy műveletet szeretne végrehajtani, például egy képet rajzol a vászonra, és nincs szüksége válaszra a JavaScripttől. Egy másik figyelemre méltó része a OnAfterRenderAsync életciklus metódus a Blazorban, amely biztosítja, hogy a JavaScript függvény az összetevő teljes megjelenítése után kerüljön meghívásra. Ez különösen fontos a DOM-elemek, például a vászon manipulálásakor, mivel a vászon túl korai elérése hibákhoz vezethet.
A második szkriptpéldában egy modulárisabb megközelítés kerül bevezetésre a használatával IJSObjectReference. Ez lehetővé teszi a JavaScript-kód modulként való betöltését, amely több komponensben újra felhasználható. A modul egyszer betöltődik, majd a benne lévő függvények szükség esetén meghívódnak. Ez a módszer javítja a kód karbantarthatóságát, és megkönnyíti a nagyobb JavaScript-kódbázisok kezelését. Ha csak egyszer importálja a JavaScript modult, az alkalmazás teljesítménye javul, és elkerülhető a szkriptek szükségtelen újratöltése.
Végül az egységtesztelési szkript a Moq könyvtárat, hogy biztosítsa a JavaScript interop hívások megfelelő működését. A Igazolható metódust használják a várt hívások megjelölésére InvokeAsync ellenőrizhető, ami azt jelenti, hogy a tesztek során ellenőrizheti, hogy az interop függvény valóban a megfelelő paraméterekkel lett-e meghívva. Ez a módszer biztosítja, hogy a Blazor és a JavaScript közötti integráció robusztus legyen, és további megbízhatósági réteget ad a projekthez azáltal, hogy ellenőrzi az interop hívások helyességét a tesztelés során.
1. megoldás: Az IJSRuntime használata a JavaScript együttműködéshez HTML5 Canvas-szal
Ez a megközelítés bemutatja, hogyan használható a Blazor IJSRuntime szolgáltatása egy JavaScript-függvény meghívására, amely manipulálja a HTML5 vásznat.
// MyPage.razor
@page "/mypage"
@inject IJSRuntime JSRuntime
@code {
private async Task DrawImageOnCanvas(MyData data)
{
await JSRuntime.InvokeVoidAsync("drawImage", data.Id, data);
}
}
<div>@foreach (var data in ListOfMyData) {
<div><canvas id="@data.Id" class="myDataImage"></canvas></div>
<button @onclick="() => DrawImageOnCanvas(data)">Draw Image</button>
}</div>
2. megoldás: JSObjectReference használata a JavaScript modul betöltéséhez
Ez a megoldás moduláris megközelítést alkalmaz: a JavaScript-fájlt modulként tölti be, amely újrafelhasználható és tisztább.
// MyPage.razor
@page "/mypage"
@inject IJSRuntime JSRuntime
@code {
private IJSObjectReference _jsModule;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
_jsModule = await JSRuntime.InvokeAsync<IJSObjectReference>("import", "./js/MyJavaScript.js");
}
}
private async Task DrawImageOnCanvas(MyData data)
{
await _jsModule.InvokeVoidAsync("drawImage", data.Id, data);
}
}
<div>@foreach (var data in ListOfMyData) {
<div><canvas id="@data.Id" class="myDataImage"></canvas></div>
<button @onclick="() => DrawImageOnCanvas(data)">Draw Image</button>
}</div>
3. megoldás: A JavaScript-együttműködés egységtesztelése a HTML5 Canvas-szal
Ez a megoldás egységtesztet ad a bUnit for Blazor komponensek használatával, biztosítva a vászonkezelés megfelelő működését.
// TestComponent.razor.cs
@page "/testpage"
@inject IJSRuntime JSRuntime
@code {
public void TestDrawImage()
{
var jsInteropMock = new Mock<IJSRuntime>();
jsInteropMock.Setup(x => x.InvokeAsync<Void>("drawImage", It.IsAny<object[]>())).Verifiable();
jsInteropMock.Verify();
}
}
A JavaScript interop felfedezése a dinamikus vászonmanipulációhoz a Blazorban
A Blazorban az egyéni JavaScript-függvények meghívásának lehetősége hatékony lehetőségeket nyit meg a dinamikus előtér-manipulációhoz, különösen, ha grafikus elemekkel, például HTML5 vászon. Ennek a folyamatnak az egyik kulcsfontosságú aspektusa, amelyet még nem tárgyaltunk, az aszinkron JavaScript-hívások használata a Blazor szerveroldali architektúrájában. Mivel a Blazor a szerveren működik, a kliens és a szerver közötti kommunikáció a SignalR-n keresztül történik, ami azt jelenti, hogy ha JavaScript-függvényt hív meg a Razor oldalról, az interakció kissé késik. Az aszinkron műveletek kezelésének megértése biztosítja, hogy a vászonkezelés zökkenőmentesen történjen.
Egy másik fontos tényező a JavaScript és a C# interakciójának optimalizálása, ha több vászonelem van az oldalon. Amikor egy listán böngészik, és minden elemnek megvan a sajátja vászon elem, a kihívás annak biztosítása, hogy minden vászon megkapja a megfelelő rajzi utasításokat a megfelelő JavaScript-függvénytől. Ez hatékonyan kezelhető úgy, hogy minden vászonnak egyedi azonosítója van, amelyet paraméterként adnak át az interop hívásban. A JavaScripten belüli megfelelő hibakezelés és érvényesítés több vászon feldolgozásakor is kulcsfontosságúvá válik.
Végezetül, a teljesítmény szempontjai jelentősek a Blazor JavaScript-együttműködése során. Míg a kis szkriptek a legtöbb esetben jól működnek, a nehéz vászonműveletek, mint például az összetett alakzatok vagy képek megjelenítése, szűk keresztmetszeteket okozhatnak a teljesítményben, ha nem optimalizálják őket. Az olyan technikák, mint a vászon méretének korlátozása, a képernyőn kívüli vásznak használata vagy a grafikus változtatások kötegelt feldolgozása segíthetnek javítani a renderelési sebességen. Ezen optimalizálási stratégiák megértése biztosítja, hogy a Blazor alkalmazás továbbra is hatékony maradjon, miközben összetett előtér-megjelenítési feladatokat is kezel.
Gyakran Ismételt Kérdések a JavaScript-együttműködésről a Blazorban
- Hogyan adhatok át adatokat a Blazorból a JavaScript-be?
- Használhatod JSRuntime.InvokeVoidAsync hogy adatokat adjon át a Blazor összetevőből egy JavaScript függvénynek.
- Hogyan kezelhetem az aszinkron hívásokat a Blazorban, amikor a JavaScripttel kommunikálok?
- A Blazor biztosítja async módszerek, mint InvokeVoidAsync aszinkron JavaScript-hívások indításához.
- Mi a legjobb módja több vászonelem kezelésének egy hurokban?
- Győződjön meg arról, hogy minden vászonelem egyedi id, és adja át ezt paraméterként a hívásakor drawImage funkció.
- Használhatok külső JavaScript-könyvtárakat a Blazorral?
- Igen, importálhat külső könyvtárakat a használatával IJSObjectReference és töltse be őket modulként a Blazor projektbe.
- Mi a szerepe IJSObjectReference a Blazorban?
- Lehetővé teszi, hogy a Blazor modulárisan, újrafelhasználható módon kommunikáljon a JavaScript-modulokkal, javítva a teljesítményt és a kódszervezést.
Utolsó gondolatok a Blazor és a JavaScript interopról
A JavaScript beépítése egy Blazor szerverprojektbe jelentősen javíthatja a front-end funkcionalitást, különösen az olyan elemek esetében, mint a HTML5 vászon. Az IJSRuntime használatával a Blazor zökkenőmentes kommunikációt tesz lehetővé a C# és a JavaScript között, lehetővé téve a grafika dinamikus megjelenítését.
Akár több vászonelemet kezel, akár a teljesítményre optimalizál, a JavaScript-függvények hatékony meghívásának ismerete kulcsfontosságú a robusztus webalkalmazások felépítéséhez. A felvázolt lépések zökkenőmentes integrációt és jobb teljesítményt biztosítanak Blazor-projektjei számára.
Referenciák és források a JavaScript interop-hoz a Blazorban
- A hivatalos dokumentációért és a Blazor JavaScript együttműködésének alapos megismeréséhez látogassa meg a ASP.NET Core Blazor JavaScript együttműködési útmutató .
- Ebből a hasznos cikkből többet is megtudhat a HTML5 vászonelemek JavaScript segítségével történő kezeléséről: MDN Web Docs – Canvas API .
- Fedezze fel a Moq teljes dokumentációját, egy tesztkönyvtárat, amelyet a Blazor JavaScript-együttműködésének tesztelésére használnak: Moq Quickstart .