Mida peate suutma teha ühelehelises rakenduses. Üheleheline rakendus
- Õpetus
Ühelehelistel rakendustel (SPA) on palju eeliseid, nagu kiirus, väga hea kasutajakogemus ja täielik kontroll HTML-i märgistuse üle. SPA-alasid on järjest rohkem; Üha rohkem on tööriistu, mis SPA arendusprotsessi lihtsustavad. Tõenäoliselt olete juba lugenud noore ja paljutõotava raamistiku Vue.js kohta. Soovitan teil sukelduda Vuesse sügavamale ja kasutada konkreetset näidet lihtsa SPA mõistmiseks.
Kirjutame lihtsa ajaveebi jaoks klient-serveri rakenduse. Rakendus kuvab nii kirjete loendi kui ka iga üksiku kirje täisteksti. Ja loomulikult toimub see kõik ilma lehte uuesti laadimata.
Pärast selle näidisrakenduse lugemist saate teada, kuidas Vues andmeid ekstraheerida, marsruute luua ja mõista Vue huvitavat funktsiooni – ühefaililisi komponente.
Taustaprogramm Selles õpetuses keskendume peamiselt Vue kasutajaliidesele. Me ei mõtle REST-taustaprogrammi kirjutamisele. Näiteks kasutame teenust jsonplaceholder.typicode.com tuubi pakkumine REST API kujul. Vue'ga alustamine on väga lihtne. Õigete tööriistadega on see veelgi lihtsam. Soovitan vaadata vue-awesome projekti, mis sisaldab nimekirja tööriistadest, komponentidest, teekidest ja pluginatest igaks juhuks Vue-cli Uue projekti loomisel on soovitatav kasutada Vue-cli. Nii saate luua projekte, kasutades ametlikke Vue malliprojekte või ühte paljudest avatud lähtekoodiga malliprojektidest ning loomulikult saate luua oma projekte ja kasutada seda kõikjal.Nii et kõigepealt installime vue-cli globaalse paketina:
$ npm install -g vue-cli
Seejärel lähtestame projekti valitud malliga; Meie näiteks on webpack-lihtsuse kasutamine enam kui piisav.
$ vue init webpack-simple vue-spa
Järgmisena minge vue-spa kausta ja käivitage npm installimine terminalis. Pärast kõigi pakettide installimist saame oma rakenduse käivitada arendusrežiimis.
$ npm käivita dev
See käsk käivitab meie projekti automaatselt kohalikus veebipaketi arendajaserveris. Meie lihtsaim Vue rakendus kuvatakse brauseris. Muidugi ei näe see sugugi selline, nagu me tahaksime ja sobib vaid lähtepunktiks millegi suurema alustamiseks. Töö jätkamiseks soovitan teil esmalt tutvuda meie malli ülesehitusega.
Sisemiselt on veebipaketi lihtsal mallil järgmine struktuur:
Fail index.html sisaldab lihtsat HTML-i märgistust, mille kehas on üks "rakenduse" element. See asendatakse vue loodud DOM-iga. Sel põhjusel silt keha Ei ole soovitatav kasutada juurelemendina.
Kaustas src peitub fail main.js, mis sisaldab veebipaketi sisenemispunkti. Sinna imporditakse Vue komponente. See kirjeldab ka Vue juureksemplari, millel on seni kaks omadust. Atribuut „el” pakub Vue eksemplari seosega määratud DOM-i elemendiga. Teine on renderdusfunktsioon, mis genereerib DOM-i App.vue. Kokkuvõttes on see kõik, mida me peame veebipaketi lihtsa mallistruktuuri kohta teadma, mitte palju, eks? Meie rakenduse põhiosa programmeeritakse rakenduses App.vue. Laiend .vue tuvastab faili ühe faili vue komponendina. See on üks Vue funktsioone, mida me nüüd lähemalt uurime.
Iga *.vue-fail koosneb kolme tüüpi plokkidest: , ja valikuliselt . Selle tulemusena saame projekti jagada seotud komponentideks. Komponendi sees on selle mall, loogika ja stiilid olemuslikult seotud ning nende kombineerimine muudab komponendi tegelikult sidusamaks ja hõlpsamini hooldatavaks. Nüüd oleme valmis Vues blogi looma.
Vaatame, mida me tegelikult rakendame. Meie ajaveebi nimega päis on lehe ülaosas. Vasakul küljel on fikseeritud külgriba, kus kuvame oma postituste pealkirjad, see on midagi sisukorra taolist. Ülejäänud lehe hõivab dünaamiline plokk, milles kuvatakse postituse tekst ise.
1. samm Kõigepealt eemaldame rakendusest App.vue kõik lisaread. Ja me kirjutame malli ümber vastavalt meie nõuetele.Vue.js SPA
Teiseks loome andmete atribuudiga Vue eksemplari, mille paigutame oma sõnumitega massiivi. Hetkel on see tühi, kuid peagi paneme serverist saadud andmed massiivi sisse.
Pärast esimest kõnet ei saa te enam juurandmeobjektile reaktiivseid omadusi lisada. Seetõttu on enne Vue eksemplari loomist soovitatav deklareerida kõik reaktiivsed omadused juurtasemel.
ekspordi vaikimisi(andmed()(return(postitused:)))
Rakenduse paremaks väljanägemiseks saate lisada ka stiili.
Rakenduse kood asub saidil github.com. Piisab hoidla kloonimisest ja haru sammude kaupa vahetamisest, et jälgida rakenduse arengut samm-sammult, näiteks:
$ git checkout samm-1
Meil pole praegu oma navigeerimisribal absoluutselt midagi kuvada, nii et hangime andmed serverist. Selleks valisin lihtsalt kasutatava HTTP kliendi Axiose. Võite kasutada ka mis tahes teile meeldivat meetodit, näiteks Vue ressurssi või kohandatud toomist või isegi jQuery Ajaxi.
$ npm install --save-dev axios
Seejärel impordime selle rakenduse komponenti ja määratleme meetodi getAllPosts(), mis esitab serverile päringu ja määrab selle atribuudile postitused. Me kutsume meetodi loodud() konksus, mida kutsutakse välja pärast Vue eksemplari loomist ja andmetele juurdepääsu seadete seadistamist.
Impordi aksiosid "axiost" ekspordi vaikeväärtusega ( andmed () ( tagastamine ( postitused: null, lõpp-punkt: "https://jsonplaceholder.typicode.com/posts/", ) ), loodud() ( this.getAllPosts(); ) , meetodid: ( getAllPosts() ( axios.get(this.endpoint) .then(response => ( this.posts = response.data; )) .catch(error => ( console.log("----- viga-------"); console.log(error); )) ) ) )
Nüüd kuvame külgribal kõik postituste pealkirjad.
((post.title))
Seni oleme kuvanud ainult postituste pealkirju, kuid postitusi endid me veel ei näe. Nüüd peate kuvama kogu postituse sisu jaotises vastavalt külgribal valitud pealkirjale. Samas soovin, et iga plaat oleks saadaval oma unikaalsel aadressil.
Installime raamatukogu:
$ npm install --save-dev vue-ruuter
Marsruutimise konfigureerimiseks pöördume tagasi faili main.js juurde. Siin määratleme marsruutimise sätted ja lisame need meie Vue eksemplari.
Importige Vue kohast "vue" importige ruuter "vue-ruuterist" importige rakendus rakendusest "./App.vue" importige postitus väljast "./components/Post.vue" importige tere saidist "./components/Hello.vue" Vue. use(Router) const ruuter = new Ruuter(( marsruudid: [ ( tee: "/", nimi: "kodu", komponent: Tere, ), ( tee: "/post/:id", nimi: "postitus", komponent: postitus, rekvisiidid: tõsi, ] )) new Vue(( el: "#app", renderda: h => h(App), ruuter ))
Marsruutimise seadetes määrasime, milline komponent põhjustab renderdamise vastaval teel. Kuna iga postituse renderdamise eest vastutab ainult komponent Post.vue, ei pea me määratlema iga postituse teed, vaid lihtsalt määratlema dünaamilise tee.
Tee: "/post/:id"
See tee sisaldab dünaamilist segment:id, mis osutab konkreetsele postitusele. Lisaks on meil sellele segmendile juurdepääs komponendis Post kaudu this.$route.params.id. Kuid $route kasutamine meie komponendis ühendab selle marsruudiga, mis omakorda piirab komponendi paindlikkust, kuna seda saab kasutada ainult teatud URL-idel. Selle asemel saame kasutada valikut rekvisiidid ja installige see sisse tõsi. Pärast seda seostatakse $route.params komponendi Postitus suvandiga props.
Nüüd, kui oleme ruuteri loonud, saame naasta oma rakenduse juurde ja lisada mallile veel paar rida.
((post.id)). ((post.title))
Siin on meil kaks komponenti vue-ruuter: Ja. Esimene neist on komponent, mis võimaldab kasutajal navigeerida marsruutimist võimaldavas rakenduses. Teine komponent on funktsionaalne komponent, mis muudab antud tee jaoks ühtse komponendi.
Viimane samm jääb alles. Peame kuvama postituse sisu.
4. samm Liigume edasi faili Post.vue juurde, kuhu lisame lihtsa malli:((post.title))
((post.body))
((post.id))
Järgmisena peame selle komponendi jaoks määrama Vue eksemplari parameetrid. Siin on kõik sama, mis kõigi postituste kuvamise seadetes. Deklareerime ühe võimaluse rekvisiidid muutumisega id, mis saab meie postinumbri. Järgmisena deklareerime andmeobjekti, nagu me juba tegime rakenduses App.vue:
Impordi aksiosid "aksiodest"; ekspordi vaikeseade ( props: ["id"], data() ( return ( post: null, endpoint: "https://jsonplaceholder.typicode.com/posts/", ) ))
Seejärel kirjeldame meetodit getPost(), mis saab ainult ühe postituse sissekande id-ga ja kutsuge seda konksu loodud().
Meetodid: ( getPost(id) ( axios(this.endpoint + id) .then(response => ( this.post = response.data )) .catch(error => ( console.log(error) )) ) ), loodud() ( this.getPost(this.id); ),
Peaaegu valmis. Kui käivitame rakenduse praegu, näeme, et kuigi URL muutub, näeme üksikut postitust, mis renderdati esimesena. Asi on selles, et meil on erinevate postituste renderdamiseks sama komponent ja Vue ei pea seda tarbetu ressursside raiskamise tõttu uuesti looma, mis tähendab ka seda, et komponendi elutsükli konksud ei kutsuta välja.
Selle parandamiseks peame lihtsalt objektile seadma jälgija $marsruut.
Vaata: ( "$route"() ( this.getPost(this.id); ) )
Nüüd töötab kõik nii nagu peab. Tootmisversiooni hankimiseks käivitage lihtsalt käsk npm run build konsoolis.
Ühelehelised rakendused
See ja järgnevad artiklid kirjeldavad Web API tööriista, mis on suhteliselt uus lisand ASP.NET platvormile, mis võimaldab teil kiiresti ja lihtsalt luua veebiteenuseid, mis avavad API HTTP-klientidele.
Veebi API tööriist põhineb samal alusel nagu ASP.NET MVC Frameworki rakendused, kuid ei kuulu ASP.NET MVC Frameworki. Selle asemel võttis Microsoft nimeruumist System.Web.Mvc võtmeklassid ja nendega seotud omadused ning dubleeris selle nimeruumi System.Web.Http.
Idee seisneb selles, et veebi API on osa peamisest ASP.NET raamistikust ja seda saab kasutada muud tüüpi veebirakendustes või eraldiseisva veebiteenuste mootorina. Veebi API tööriista üks peamisi kasutusviise on üheleheliste rakenduste (SPA) loomine, kombineerides veebi API ja ASP.NET MVC Frameworki võimalustega. Järgmisena näitame teile, mis on SPA rakendused ja kuidas need töötavad.
Veebiteenuste loomise lihtsustamine on veebi API lahutamatu funktsioon. See on märkimisväärne edasiminek võrreldes teiste veebiteenuste tehnoloogiatega, mida Microsoft on viimase kümnendi jooksul pakkunud. Mulle meeldib Web API tööriist ja peaksite seda oma projektides kasutama, muu hulgas seetõttu, et see on lihtne ja tugineb samale disainifilosoofiale nagu ASP.NET MVC Framework.
Üsna laialdaselt kasutatakse terminit üheleheline rakendus (SPA). Kõige järjekindlam määratlus on see, et tegemist on veebirakendusega, mille esialgne sisu edastatakse HTML-märgistuse ja JavaScripti koodi kombinatsioonina ning järgnevad toimingud tehakse veebiteenuse REST abil, mis edastab vastuseks Ajaxi päringutele andmeid JSON-vormingus.
See erineb eelmistes näidetes ehitatud rakendustest, kus kasutaja toimingute tulemuseks olid uued HTML-dokumendid, mis genereeriti vastuseks sünkroonsetele HTTP-päringutele. Selliseid taotlusi hakatakse nimetama edasi-tagasi taotlusteks (RTA).
SPA rakenduse eelised on, et see nõuab vähem ribalaiust ja kasutaja saab sujuvama liidese. Puuduste hulka kuulub see, et seda elegantsemat liidest võib olla raske saavutada ning SPA-rakenduse jaoks vajaliku JavaScripti koodi keerukus tähendab, et on vaja hoolikat kavandamist ja testimist.
Enamik rakendusi kombineerivad SPA- ja RTA-tehnikaid, kusjuures iga peamine rakenduste funktsionaalsuse valdkond tarnitakse SPA-na ja navigeerimine funktsionaalsuspiirkondade vahel, mida hallatakse standardsete HTTP-päringute abil, mis loovad uue HTML-dokumendi.
Ühelehelise rakenduse näideNende artiklite jaoks luuakse Visual Studios malli Empty kasutades uus MVC projekt nimega WebServices. Jaotises Lisa kaustu ja põhiviiteid on märgitud ruudud MVC ja Web API, nagu on näidatud alloleval pildil:
Seda projekti kasutatakse tavalise ASP.NET MVC Frameworki rakenduse loomiseks ja seejärel veebiteenuse loomiseks veebi API abil. Kui veebiteenus on valmis, muudetakse ASP.NET MVC Frameworki rakendus üheleheliseks rakenduseks.
Mudeli loomineRakendus loob ja haldab tubade broneerimise taotluste komplekti. Rakendus on kavas hoida lihtsana, et saaksite keskenduda kirjeldatava objekti mehaanikale, seega koosnevad broneerimissoovid ainult kliendi nimest ja ruumi asukohast. Kausta Models on lisatud klassi fail nimega Reservation.cs, mille sisu on näidatud allolevas näites:
Nimeruum WebServices.Models ( public class Reservation ( public int ReservationId ( get; set; ) public string ClientName ( get; set; ) public string Location ( get; set; ) ) )
Plaan on luua lihtne mälusisene broneerimisobjektide kogu, mis toimiks andmehoidlana. Andmebaasi pole vaja installida, kuid peate suutma teha CRUD-operatsioone mudeliobjektide kogumiga, et demonstreerida Web API mõningaid olulisi aspekte. Klassifail nimega ReservationRepository.cs lisatakse ka kausta Models:
Kasutades System.Collections.Generic; kasutades System.Linq; nimeruum WebServices.Models ( public class ReservationRepository ( privaatne staatiline ReservationRepository repo = new ReservationRepository(); public static ReservationRepository Current ( get ( return repo; ) ) private List data = new List ( new Reservation ( ReservationId = 1, ClientName) , Asukoht = "Hotell"), uus broneering (ReservationId = 2, ClientName = "Vasya", Location = "Library"), uus broneering (ReservationId = 3, ClientName = "Igor", Location = "Söögituba"), ) ; public IEnumerable GetAll() ( tagastavad andmed; ) public Reservation Get(int id) ( return data.Where(r => r.ReservationId == id).FirstOrDefault(); ) public Reservation Add(Reservation item) ( item. ReservationId = data.Count + 1; Add(item return item ) public void Remove(int id) ( Reservation item = Get(id); if (item != null) ( data.Remove(item); ) ) public bool Update(Reserveerimisüksus) ( Broneering storedItem = Get(item.ReservationId); if (salvestatud üksus != null) ( storedItem.ClientName = item.ClientName; storedItem.Location = item.Location; tagasta tõene; ) muidu ( tagasta vale; ) ) )
Reaalses projektis peaksime hoolitsema klassidevahelise tiheda sideme katkestamise ja rakendusse liideste sisseviimise ning sõltuvuse süstimise eest. See teema keskendub aga ainult veebi API-dele ja SPA-rakendustele, nii et standardsete tavade osas tehakse mõningaid lihtsustusi.
Salvestusklassil on esialgne loend kolmest reserveerimisobjektist ja see määrab meetodid, mis võimaldavad teil kollektsiooni vaadata, lisada, kustutada ja värskendada. Kuna poes puudub püsivus, lähevad rakenduse peatamisel ja taaskäivitamisel kõik poes tehtud muudatused kaotsi, kuid see näide keskendub täielikult sisu edastamisviisile, mitte sellele, kuidas seda serveris salvestatakse. Päringute vahel teatud püsivuse tagamiseks luuakse klassi ReservationRepository eksemplar, millele pääseb juurde staatilise atribuudi Current kaudu.
NuGeti pakettide installimineSee ja järgnevad artiklid kasutavad kolme NuGeti paketti: jQuery, Bootstrap ja Knockout. JQuery ja Bootstrapi teeke on juba varem kirjeldatud ja kasutatud. Knockout on teek, mille Microsoft on kohandanud üheleheliste rakenduste jaoks. Selle lõi Steve Sanderson. Kuigi Steve töötab Microsofti heaks, on Knockouti pakett Knockouti raamatukogu veebisaidil avatud lähtekoodiga saadaval ja seda on laialdaselt kasutusele võetud. Näitame teile hiljem, kuidas Knockout töötab, kuid praegu peate installima ülalmainitud paketid.
NuGeti käsurea akna avamiseks valige Tööriistad --> Library Package Manager --> Package Manager Console ja sisestage järgmised käsud:
Install-Package jquery -versioon 1.10.2 -projekti nimi WebServices Install-Package bootstrap -versioon 3.0.0 -projekti nimi WebServices Install-Package knockoutjs -versioon 3.0.0 -projektinimi WebServices
Kontrolleri lisamineNäidisprojektile on lisatud kontroller nimega Home, mille definitsiooni näeb näites:
WebServices.Modelsi kasutamine; kasutades System.Web.Mvc; nimeruum WebServices.Controllers ( avalik klass HomeController: Controller ( ReservationRepository repository = ReservationRepository.Current; public ViewResult Index() ( return View(repository.GetAll()); ) public ActionResult Add(Reservation item) (Is (ModelValid) (Is (ModelValid). repository.Add(item) return RedirectToAction("Indeks" ) else return View("Indeks" ) public ActionResult Update(Reservation item) ( if (ModelState.IsValid && repository.Update(item)) return RedirectToAction(); "Indeks"); muidu tagastab vaade("Indeks" ) )
See on nii lihtsa rakenduse jaoks täiesti tüüpiline kontroller. Iga tegevusmeetod vastab otseselt ühele poes leiduvatest meetoditest. Kontrolleri ainus kasulikkus tuleneb mudeli valideerimisest, vaadete valimisest ja ümbersuunamisest. Muidugi oleks reaalses projektis täiendav domeeniloogika, kuid kuna näidisrakendus on nii elementaarne, on kontroller lõpuks midagi enamat kui lihtne ümbris poe ümber.
Paigutuse ja vaadete lisamineRakenduse jaoks sisu genereerimiseks luuakse kaust Views/Shared ja sellele lisatakse vaatefail nimega _Layout.cshtml, mille sisu on näidatud allolevas näites:
@ViewBag.Title @RenderSection("Skriptid") @RenderSection("Keha")
See põhipaigutus pakub elemente Bootstrapi teegi CSS-failide jaoks. Paigutus määratleb kaks jaotist, skriptid ja keha, mida kasutatakse paigutusse sisu sisestamiseks. Järgmine samm on rakenduse jaoks tipptaseme vaate loomine. Kuigi järgmine samm on tavalise ASP.NET MVC Frameworki rakenduse loomine, teate, et lõpuks loote ühe lehe rakenduse.
Teisendust on lihtsam teha, kui loote ühe vaate, mis sisaldab kogu rakenduse jaoks vajalikku HTML-i märgistust, isegi kui tulemus tundub esialgu pisut kummaline. Vaatefail nimega Index.cshtml lisatakse kausta Views/Home, mille sisu on näidatud allolevas näites:
@using WebServices.Models @mudel IEnumerable @( ViewBag.Title = "Reservations"; } @section Scripts { } @section Body { @Html.Partial("Summary", Model) @Html.Partial("Editor", new Reservation()) }!}
Selle vaate vaatemudel kujutab endast reserveerimisobjektide loendit ja kasutajale kuvatavate funktsioonide ehitusplokkide pakkumiseks luuakse kaks osavaadet. Esimese osavaatega faili nimi on Summary.cshtml. See fail luuakse kaustas Views/Home:
@mudel IEnumerable Kõik tellimused
@item.ReservationId | @item.ClientName | @item.Location | @Html.ActionLink("Kustuta", "Eemalda", new ( id = item.ReservationId), new ( @class = "btn btn-xs btn-primary" )) |
Osalise vaate vaatemudel on sama reserveerimisobjektide loend ja seda kasutatakse stiiliga tabeli genereerimiseks kasutades elemendina Bootstrapi