Skip to content
Mithril.js 2
Main Navigation ÚtmutatóAPI

magyar

English
简体中文
繁體中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština

magyar

English
简体中文
繁體中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština

Megjelenés

Sidebar Navigation

Első lépések

Telepítés

Egyszerű példa

Források

JSX

ES6+ öreg böngészőkön

Animációk

Tesztelés

Példák

Harmadik féltől való integráció

Útvonalkezelés

Kulcsfogalmak

Virtuális DOM csomópontok

Komponensek

Életciklus-metódusok

Kulcsok

Az automatikus újrarajzolási rendszer

Egyéb

Framework összehasonlítás

Migrálás v1.x-ről

Átállás v0.2.x verzióról

API

Ezen az oldalon

Egyszerű példa ​

Készítsünk egy egyszerű alkalmazást, amely bemutatja, hogyan végezhetjük el a Mithril használata során szükséges legfontosabb feladatokat.

A végeredmény interaktív példája itt

Először hozzunk létre egy belépési pontot az alkalmazás számára. Hozzon létre egy index.html fájlt:

html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Az én alkalmazásom</title>
  </head>
  <body>
    <script src="bin/app.js"></script>
  </body>
</html>

A <!doctype html> sor HTML5 dokumentumot jelöl. Az első charset meta tag a dokumentum kódolását jelzi, a viewport meta tag pedig azt határozza meg, hogy a mobil böngészők hogyan méretezzék az oldalt. A title tag a böngészőfülön megjelenő szöveget tartalmazza, míg a script tag megadja az alkalmazást vezérlő JavaScript fájl elérési útját.

Létrehozhatnánk a teljes alkalmazást egyetlen JavaScript fájlban is, de ez később megnehezítené a kód navigálását. Ehelyett bontsuk a kódot modulokra, és állítsuk össze ezeket a modulokat egy csomagba: bin/app.js.

Számos módja van a csomagolóeszköz beállításának, de a legtöbbet npm-en keresztül terjesztik. Valójában a legtöbb modern JavaScript könyvtárat és eszközt így terjesztik, beleértve a Mithrilt is. Az npm letöltéséhez telepítse a Node.js-t; az npm automatikusan települ vele. Miután telepítette a Node.js-t és az npm-et, nyissa meg a parancssort, és futtassa ezt a parancsot:

bash
npm init -y

Ha az npm megfelelően van telepítve, létrejön egy package.json fájl. Ez a fájl tartalmaz egy vázprojekt meta-leíró fájlt. Ebben a fájlban nyugodtan szerkesztheti a projekt és a szerzői információkat.


A Mithril.js telepítéséhez kövesse a telepítési oldalon található utasításokat. Miután rendelkezik egy projektvázzal, amelyen a Mithril.js telepítve van, készen állunk az alkalmazás létrehozására.

Kezdjük azzal, hogy létrehozunk egy modult az állapotunk tárolására. Hozzunk létre egy src/models/User.js nevű fájlt.

javascript
// src/models/User.js
var User = {
  list: [],
};

module.exports = User;

Most adjunk hozzá kódot, amellyel adatokat tölthetünk be egy szerverről. A szerverrel való kommunikációhoz használhatjuk a Mithril.js m.request XHR segédeszközét. Először is foglaljuk bele a Mithril.js-t a modulba:

javascript
// src/models/User.js
var m = require('mithril');

var User = {
  list: [],
};

module.exports = User;

Ezután hozzunk létre egy függvényt, amely egy XHR hívást indít el. Nevezzük loadList-nek.

javascript
// src/models/User.js
var m = require('mithril');

var User = {
  list: [],
  loadList: function () {
    // TODO: make XHR call - TODO: XHR hívás
  },
};

module.exports = User;

Ezután hozzáadhatunk egy m.request hívást az XHR kéréshez. Ebben az oktatóanyagban a REM (DEAD LINK, FIXME: https //rem-rest-api.herokuapp.com/) API-t fogjuk használni XHR hívásokhoz, amely egy gyors prototípus-készítésre tervezett mock REST API. Ez az API a felhasználók listáját adja vissza a GET https://mithril-rem.fly.dev/api/users végponton keresztül. Használjuk az m.request-et egy XHR kéréshez, és töltsük fel adatainkat a végpont válaszával.

Megjegyzés: a REM végpont működéséhez engedélyezni kell a harmadik féltől származó cookie-kat.

javascript
// src/models/User.js
var m = require('mithril');

var User = {
  list: [],
  loadList: function () {
    return m
      .request({
        method: 'GET',
        url: 'https://mithril-rem.fly.dev/api/users',
        withCredentials: true,
      })
      .then(function (result) {
        User.list = result.data;
      });
  },
};

module.exports = User;

A method opció egy HTTP metódust jelöl. Ahhoz, hogy adatokat kérjünk le a szerverről anélkül, hogy mellékhatásokat okoznánk a szerveren, a GET metódust kell használnunk. Az url az API végpont címe. A withCredentials: true sor azt jelzi, hogy cookie-kat használunk, ami a REM API követelménye.

Az m.request hívás egy Promise-t ad vissza, amely a végpont adataival teljesül. Alapértelmezés szerint a Mithril.js feltételezi, hogy a HTTP válasz törzse JSON formátumú, és automatikusan JavaScript objektummá vagy tömbbé alakítja. A .then callback akkor fut le, amikor az XHR kérés befejeződik. Ebben az esetben a callback a result.data tömböt a User.list-hez rendeli.

Figyelje meg, hogy a loadList-ben is van egy return utasításunk. Ez egy általános jó gyakorlat a Promise-okkal való munkavégzés során, mert lehetővé teszi, hogy további callback függvényeket regisztráljunk, amelyek az XHR kérés befejezése után futnak le.

Ez az egyszerű modell két tagot tesz elérhetővé: User.list (felhasználói objektumok tömbje) és User.loadList (metódus, amely szerveradatokkal tölti fel a User.list-et).


Most hozzunk létre egy nézetmodult, amellyel megjeleníthetjük az adatokat a User modell modulunkból.

Hozzon létre egy src/views/UserList.js nevű fájlt. Először is foglaljuk bele a Mithril.js-t és a modellünket, mivel mindkettőt használnunk kell:

javascript
// src/views/UserList.js
var m = require('mithril');
var User = require('../models/User');

Ezután hozzunk létre egy Mithril.js komponenst. A komponens egyszerűen egy objektum, amelynek van egy view metódusa:

javascript
// src/views/UserList.js
var m = require('mithril');
var User = require('../models/User');

module.exports = {
  view: function () {
    // TODO add code here - TODO: Kód ide
  },
};

Alapértelmezés szerint a Mithril.js nézetek a hyperscript használatával kerülnek leírásra. A Hyperscript egy tömör szintaxist kínál, amely a komplex tagekhez természetesebben behúzható, mint a HTML. Mivel a szintaxisa JavaScript, a JavaScript eszközök ökoszisztémájának nagy része kihasználható. Például:

  • Használhatja a Babel alkalmazást az ES6+ ES5-re történő transzpilálására az IE számára, valamint a JSX (egy beágyazott HTML-szerű szintaxis kiterjesztés) megfelelő hyperscript hívásokká alakítására.
  • Használhatja az ESLint alkalmazást az egyszerű lintinghez speciális bővítmények nélkül.
  • Használhatja a Terser vagy az UglifyJS (csak ES5) alkalmazást a kód egyszerű minimalizálására.
  • Használhatja az Istanbul alkalmazást a kódlefedettséghez.
  • Használhatja a TypeScript alkalmazást az egyszerű kódelemzéshez. (Vannak közösség által támogatott típusdefiníciók, így nem kell sajátot készítenie.)

Kezdjük a hyperscripttel, és hozzunk létre egy elemlistát. A Hyperscript a Mithril.js használatának idiómatikus módja, de a JSX is nagyon hasonlóan működik.

javascript
// src/views/UserList.js
var m = require('mithril');
var User = require('../models/User');

module.exports = {
  view: function () {
    return m('.user-list');
  },
};

A ".user-list" string egy CSS szelector, és ahogy az várható, a .user-list egy osztályt képvisel. Ha nincs megadva tag, akkor a div az alapértelmezett. Ez a nézet tehát egyenértékű a <div class="user-list"></div> kóddal.

Most hivatkozzunk a korábban létrehozott modell (User.list) felhasználólistájára, hogy dinamikusan iteráljunk az adatokon:

javascript
// src/views/UserList.js
var m = require('mithril');
var User = require('../models/User');

module.exports = {
  view: function () {
    return m(
      '.user-list',
      User.list.map(function (user) {
        return m('.user-list-item', user.firstName + ' ' + user.lastName);
      })
    );
  },
};

Mivel a User.list egy JavaScript tömb, és a hyperscript nézetek JavaScript kódok, a .map metódussal iterálhatunk a tömb elemein. Ez egy vnode tömböt hoz létre, amely div elemek listáját képviseli, amelyek mindegyike egy felhasználó nevét tartalmazza.

A probléma az, hogy soha nem hívtuk meg a User.loadList függvényt. Ezért a User.list továbbra is egy üres tömb, így ez a nézet egy üres oldalt jelenítene meg. Mivel azt szeretnénk, hogy a User.loadList meghívásra kerüljön, amikor rendereljük ezt a komponenst, kihasználhatjuk a komponens életciklus metódusait:

javascript
// src/views/UserList.js
var m = require('mithril');
var User = require('../models/User');

module.exports = {
  oninit: User.loadList,
  view: function () {
    return m(
      '.user-list',
      User.list.map(function (user) {
        return m('.user-list-item', user.firstName + ' ' + user.lastName);
      })
    );
  },
};

Figyelje meg, hogy hozzáadtunk egy oninit metódust a komponenshez, amely a User.loadList-re hivatkozik. Ez azt jelenti, hogy amikor a komponens inicializálódik, a User.loadList meghívásra kerül, ami XHR kérést indít el. Amikor a szerver választ ad, a User.list feltöltésre kerül.

Azt is vegye figyelembe, hogy nem csináltuk oninit: User.loadList() (zárójellel a végén). A különbség az, hogy az oninit: User.loadList() egyszer és azonnal meghívja a függvényt, de az oninit: User.loadList csak akkor hívja meg a függvényt, amikor a komponens renderel. Ez egy fontos különbség, és egy gyakori buktató a JavaScriptben kezdő fejlesztők számára: a függvény azonnali meghívása azt eredményezi, hogy az XHR kérés azonnal elindul, amint a forráskód kiértékelésre kerül, még akkor is, ha a komponens soha nem renderelődik. Továbbá, ha a komponenst valaha is újra létrehozzák (az alkalmazásban való oda-vissza navigálás révén), a függvény nem fog újra meghívásra kerülni a várt módon.


Rendereljük a nézetet a korábban létrehozott src/index.js belépési pont fájlból:

javascript
// src/index.js
var m = require('mithril');

var UserList = require('./views/UserList');

m.mount(document.body, UserList);

Az m.mount hívás a megadott komponenst (UserList) rendereli egy DOM elembe (document.body), törölve az ott korábban lévő DOM-ot. A HTML fájl böngészőben történő megnyitásakor most a személynevek listájának kell megjelennie.


Jelenleg a lista meglehetősen egyszerűnek tűnik, mert nem definiáltunk stílusokat. Tehát adjunk hozzá néhányat. Először hozzunk létre egy styles.css nevű fájlt, és foglaljuk bele az index.html fájlba:

html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Az én alkalmazásom</title>
    <link href="styles.css" rel="stylesheet" />
  </head>
  <body>
    <script src="bin/app.js"></script>
  </body>
</html>

Most stílusozhatjuk a UserList komponenst:

css
.user-list {
  list-style: none;
  margin: 0 0 10px;
  padding: 0;
}

.user-list-item {
  background: #fafafa;
  border: 1px solid #ddd;
  color: #333;
  display: block;
  margin: 0 0 1px;
  padding: 8px 15px;
  text-decoration: none;
}

.user-list-item:hover {
  text-decoration: underline;
}

A böngészőablak újratöltésekor most néhány stílusozott elemnek kell megjelennie.


Adjuk hozzá az útválasztást az alkalmazásunkhoz.

Az útválasztás azt jelenti, hogy egy képernyőt egyedi URL-hez kötünk, hogy létrehozzuk a képességet az egyik "oldalról" a másikra való átlépésre. A Mithril.js egyoldalas alkalmazásokhoz (Single Page Applications) készült, így ezek az "oldalak" nem feltétlenül különböző HTML fájlok a szó hagyományos értelmében. Ehelyett az egyoldalas alkalmazásokban az útválasztás ugyanazt a HTML fájlt tartja meg élettartama során, de JavaScripten keresztül megváltoztatja az alkalmazás állapotát. Az ügyféloldali útválasztás előnye, hogy elkerüli az üres képernyő villanásait az oldalátmenetek között, és csökkentheti a szerverről leküldött adatok mennyiségét, ha webszolgáltatás-orientált architektúrával együtt használják (azaz egy olyan alkalmazás, amely JSON formátumban tölti le az adatokat ahelyett, hogy előre renderelt, bőbeszédű HTML darabokat töltene le).

Útválasztást úgy adhatunk hozzá, hogy az m.mount hívást m.route hívásra cseréljük:

javascript
// src/index.js
var m = require('mithril');

var UserList = require('./views/UserList');

m.route(document.body, '/list', {
  '/list': UserList,
});

Az m.route hívás meghatározza, hogy az alkalmazás a document.body-ba kerül renderelésre. A "/list" argumentum az alapértelmezett útvonal. Ez azt jelenti, hogy a felhasználó erre az útvonalra lesz átirányítva, ha egy nem létező útvonalra érkezik. A {"/list": UserList} objektum a meglévő útvonalak térképét deklarálja, és azt, hogy mely komponensekre oldódik fel az egyes útvonalak.

Az oldal böngészőben történő frissítésekor most a #!/list karakterláncnak kell megjelennie az URL-ben, jelezve, hogy az útválasztás működik. Mivel ez az útvonal a UserList-et rendereli, továbbra is látnunk kell a képernyőn az emberek listáját, mint korábban.

A #! kódrészlet hashbang néven ismert, és ez egy általánosan használt string az ügyféloldali útválasztás megvalósításához. Ezt a stringet a m.route.prefix segítségével lehet konfigurálni. Egyes konfigurációk szerveroldali módosításokat igényelnek, ezért a bemutató hátralévő részében továbbra is a hashbangot fogjuk használni.


Adjuk hozzá egy másik útvonalat az alkalmazásunkhoz a felhasználók módosításához. Először hozzunk létre egy views/UserForm.js nevű modult.

javascript
// src/views/UserForm.js

module.exports = {
  view: function () {
    // TODO: nézet implementálása
  },
};

Ezután require-álhatjuk ezt az új modult a src/index.js-ből.

javascript
// src/index.js
var m = require('mithril');

var UserList = require('./views/UserList');
var UserForm = require('./views/UserForm');

m.route(document.body, '/list', {
  '/list': UserList,
});

Végül létrehozhatunk egy útvonalat, amely erre hivatkozik:

javascript
// src/index.js
var m = require('mithril');

var UserList = require('./views/UserList');
var UserForm = require('./views/UserForm');

m.route(document.body, '/list', {
  '/list': UserList,
  '/edit/:id': UserForm,
});

Figyelje meg, hogy az új útvonalban van egy :id. Ez egy útvonalparaméter; úgy gondolhat rá, mint egy helyettesítő karakterre. A /edit/1 útvonal a UserForm komponensre mutatna, ahol az id értéke "1". A /edit/2 szintén a UserForm-ra oldódna fel, de "2" id-vel. És így tovább.

Implementáljuk a UserForm komponenst, hogy reagálhasson ezekre az útvonalparaméterekre:

javascript
// src/views/UserForm.js
var m = require('mithril');

module.exports = {
  view: function () {
    return m('form', [
      m('label.label', 'Keresztnév'),
      m('input.input[type=text][placeholder=Keresztnév]'),
      m('label.label', 'Vezetéknév'),
      m('input.input[placeholder=Vezetéknév]'),
      m('button.button[type=submit]', 'Mentés'),
    ]);
  },
};

És adjunk hozzá néhány további stílust a styles.css fájlhoz:

css
/* styles.css */
body,
.input,
.button {
  font: normal 16px Verdana;
  margin: 0;
}

.user-list {
  list-style: none;
  margin: 0 0 10px;
  padding: 0;
}

.user-list-item {
  background: #fafafa;
  border: 1px solid #ddd;
  color: #333;
  display: block;
  margin: 0 0 1px;
  padding: 8px 15px;
  text-decoration: none;
}

.user-list-item:hover {
  text-decoration: underline;
}

.label {
  display: block;
  margin: 0 0 5px;
}

.input {
  border: 1px solid #ddd;
  border-radius: 3px;
  box-sizing: border-box;
  display: block;
  margin: 0 0 10px;
  padding: 10px 15px;
  width: 100%;
}

.button {
  background: #eee;
  border: 1px solid #ddd;
  border-radius: 3px;
  color: #333;
  display: inline-block;
  margin: 0 0 10px;
  padding: 10px 15px;
  text-decoration: none;
}

.button:hover {
  background: #e8e8e8;
}

Jelenleg ez a komponens semmit sem tesz a felhasználói eseményekre való reagáláshoz. Adjuk hozzá a User modellünkhöz a src/models/User.js fájlban. Jelenleg így néz ki a kód:

javascript
// src/models/User.js
var m = require('mithril');

var User = {
  list: [],
  loadList: function () {
    return m
      .request({
        method: 'GET',
        url: 'https://mithril-rem.fly.dev/api/users',
        withCredentials: true,
      })
      .then(function (result) {
        User.list = result.data;
      });
  },
};

module.exports = User;

Adjuk hozzá a kódot, hogy betölthessünk egyetlen felhasználót:

javascript
// src/models/User.js
var m = require('mithril');

var User = {
  list: [],
  loadList: function () {
    return m
      .request({
        method: 'GET',
        url: 'https://mithril-rem.fly.dev/api/users',
        withCredentials: true,
      })
      .then(function (result) {
        User.list = result.data;
      });
  },

  current: {},
  load: function (id) {
    return m
      .request({
        method: 'GET',
        url: 'https://mithril-rem.fly.dev/api/users/' + id,
        withCredentials: true,
      })
      .then(function (result) {
        User.current = result;
      });
  },
};

module.exports = User;

Figyelje meg, hogy hozzáadtunk egy User.current tulajdonságot és egy User.load(id) metódust, amely feltölti ezt a tulajdonságot. Most feltölthetjük a UserForm nézetet ezzel az új metódussal:

javascript
// src/views/UserForm.js
var m = require('mithril');
var User = require('../models/User');

module.exports = {
  oninit: function (vnode) {
    User.load(vnode.attrs.id);
  },
  view: function () {
    return m('form', [
      m('label.label', 'Keresztnév'),
      m('input.input[type=text][placeholder=Keresztnév]', {
        value: User.current.firstName,
      }),
      m('label.label', 'Vezetéknév'),
      m('input.input[placeholder=Vezetéknév]', { value: User.current.lastName }),
      m('button.button[type=submit]', 'Mentés'),
    ]);
  },
};

A UserList komponenshez hasonlóan az oninit metódus meghívja a User.load() függvényt. Emlékezzünk vissza, hogy volt egy :id nevű útvonalparaméterünk a "/edit/:id": UserForm útvonalon? Az útvonalparaméter a UserForm komponens vnode-jának attribútumává válik, így a /edit/1-re való útválasztás a vnode.attrs.id értékét "1"-re állítaná.

Most módosítsuk a UserList nézetet, hogy onnan navigálhassunk egy UserForm-ra:

javascript
// src/views/UserList.js
var m = require('mithril');
var User = require('../models/User');

module.exports = {
  oninit: User.loadList,
  view: function () {
    return m(
      '.user-list',
      User.list.map(function (user) {
        return m(
          m.route.Link,
          {
            class: 'user-list-item',
            href: '/edit/' + user.id,
          },
          user.firstName + ' ' + user.lastName
        );
      })
    );
  },
};

Itt kicseréltük a .user-list-item vnode-ot egy m.route.Link-re ezzel az osztállyal és ugyanazokkal a gyermekekkel. Hozzáadtunk egy href-et, amely a kívánt útvonalra hivatkozik. Ez azt jelenti, hogy a linkre kattintva megváltozna az URL hashbang #! utáni része (így megváltoztatva az útvonalat az aktuális HTML oldal eltávolítása nélkül). A színfalak mögött egy <a> tagot használ a link megvalósításához, és minden csak működik.

Ha frissíti az oldalt a böngészőben, most már rákattinthat egy személyre, és egy űrlapra juthat.


Az űrlap a "Mentés" gombra kattintva még mindig nem menti el az adatokat. Tegyük működőképessé az űrlapot:

javascript
// src/views/UserForm.js
var m = require('mithril');
var User = require('../models/User');

module.exports = {
  oninit: function (vnode) {
    User.load(vnode.attrs.id);
  },
  view: function () {
    return m(
      'form',
      {
        onsubmit: function (e) {
          e.preventDefault();
          User.save();
        },
      },
      [
        m('label.label', 'Keresztnév'),
        m('input.input[type=text][placeholder=Keresztnév]', {
          oninput: function (e) {
            User.current.firstName = e.target.value;
          },
          value: User.current.firstName,
        }),
        m('label.label', 'Vezetéknév'),
        m('input.input[placeholder=Vezetéknév]', {
          oninput: function (e) {
            User.current.lastName = e.target.value;
          },
          value: User.current.lastName,
        }),
        m('button.button[type=submit]', 'Mentés'),
      ]
    );
  },
};

Hozzáadtunk oninput eseménykezelőket mindkét beviteli mezőhöz. Ezek beállítják a User.current.firstName és User.current.lastName tulajdonságokat, amikor a felhasználó gépel.

Ezenkívül beállítottuk, hogy a "Mentés" gomb megnyomásakor a User.save metódus hívódjon meg. Valósítsuk meg ezt a metódust:

javascript
// src/models/User.js
var m = require('mithril');

var User = {
  list: [],
  loadList: function () {
    return m
      .request({
        method: 'GET',
        url: 'https://mithril-rem.fly.dev/api/users',
        withCredentials: true,
      })
      .then(function (result) {
        User.list = result.data;
      });
  },

  current: {},
  load: function (id) {
    return m
      .request({
        method: 'GET',
        url: 'https://mithril-rem.fly.dev/api/users/' + id,
        withCredentials: true,
      })
      .then(function (result) {
        User.current = result;
      });
  },

  save: function () {
    return m.request({
      method: 'PUT',
      url: 'https://mithril-rem.fly.dev/api/users/' + User.current.id,
      body: User.current,
      withCredentials: true,
    });
  },
};

module.exports = User;

A save metódusban a PUT HTTP metódust használjuk annak jelzésére, hogy adatokat frissítünk a szerveren.

Most próbálja meg szerkeszteni egy felhasználó nevét az alkalmazásban. Miután elmentett egy változtatást, a változásnak meg kell jelennie a felhasználók listájában.


Jelenleg csak a böngésző visszagombjával tudunk visszatérni a felhasználói listához. Ideális esetben szeretnénk egy menüt – vagy általánosabban egy elrendezést, ahová globális felhasználói felületi elemeket helyezhetünk el.

Hozzuk létre a src/views/Layout.js fájlt:

javascript
// src/views/Layout.js
var m = require('mithril');

module.exports = {
  view: function (vnode) {
    return m('main.layout', [
      m('nav.menu', [m(m.route.Link, { href: '/list' }, 'Felhasználók')]),
      m('section', vnode.children),
    ]);
  },
};

Ez a komponens meglehetősen egyszerű: tartalmaz egy <nav> elemet, amely egy felhasználói listára mutató hivatkozást tartalmaz. Ahogy az /edit hivatkozásoknál is tettük, ez a hivatkozás az m.route.Link -et használja egy útvonalválasztó hivatkozás létrehozásához.

Figyeljük meg, hogy van egy <section> elem is, melynek gyermeke a vnode.children. A vnode a Layout komponens egy példányát képviselő virtuális DOM csomópontra mutat (azaz a m(Layout) hívás eredményére). Ezért a vnode.children az adott virtuális DOM csomópont összes gyermekére utal.

És frissítsük a stílusokat:

css
/* styles.css */
body,
.input,
.button {
  font: normal 16px Verdana;
  margin: 0;
}

.layout {
  margin: 10px auto;
  max-width: 1000px;
}

.menu {
  margin: 0 0 30px;
}

.user-list {
  list-style: none;
  margin: 0 0 10px;
  padding: 0;
}

.user-list-item {
  background: #fafafa;
  border: 1px solid #ddd;
  color: #333;
  display: block;
  margin: 0 0 1px;
  padding: 8px 15px;
  text-decoration: none;
}

.user-list-item:hover {
  text-decoration: underline;
}

.label {
  display: block;
  margin: 0 0 5px;
}

.input {
  border: 1px solid #ddd;
  border-radius: 3px;
  box-sizing: border-box;
  display: block;
  margin: 0 0 10px;
  padding: 10px 15px;
  width: 100%;
}

.button {
  background: #eee;
  border: 1px solid #ddd;
  border-radius: 3px;
  color: #333;
  display: inline-block;
  margin: 0 0 10px;
  padding: 10px 15px;
  text-decoration: none;
}

.button:hover {
  background: #e8e8e8;
}

Módosítsuk a routert a src/index.js fájlban, hogy hozzáadjuk az elrendezésünket:

javascript
// src/index.js
var m = require('mithril');

var UserList = require('./views/UserList');
var UserForm = require('./views/UserForm');
var Layout = require('./views/Layout');

m.route(document.body, '/list', {
  '/list': {
    render: function () {
      return m(Layout, m(UserList));
    },
  },
  '/edit/:id': {
    render: function (vnode) {
      return m(Layout, m(UserForm, vnode.attrs));
    },
  },
});

Minden komponenst lecseréltünk egy RouteResolver objektumra (ami alapvetően egy render metódussal rendelkező objektum). A render metódusok ugyanúgy írhatók, mint a szokásos komponens nézetek, a m() hívások egymásba ágyazásával.

Érdemes megfigyelni, hogy a komponensek hogyan használhatók egy választó (selector) string helyett a m() hívásban. Itt, a /list útvonalon a következőt látjuk: m(Layout, m(UserList)). Ez azt jelenti, hogy van egy gyökér virtuális DOM csomópont, ami a Layout egy példánya, és aminek egyetlen gyermeke a UserList virtuális DOM csomópont.

Az /edit/:id útvonalon egy vnode argumentum is található, ami az útvonalparamétereket adja át a UserForm komponensnek. Tehát, ha az URL /edit/1, akkor a vnode.attrs értéke {id: 1}, és a m(UserForm, vnode.attrs) kifejezés egyenértékű a m(UserForm, {id: 1}) kifejezéssel. Az egyenértékű JSX kód <UserForm id={vnode.attrs.id} /> lenne.

Frissítse az oldalt a böngészőben, és most látni fogja a globális navigációt az alkalmazás minden oldalán.


Ezzel befejeződött az oktatóanyag.

Ebben az oktatóanyagban végigmentünk egy nagyon egyszerű alkalmazás létrehozásának folyamatán, ahol felhasználókat listázhatunk egy szerverről, és egyenként szerkeszthetjük őket. Gyakorlásképpen próbálja meg önállóan megvalósítani a felhasználók létrehozását és törlését.

Ha több példát szeretne látni a Mithril.js kódra, nézze meg a példák oldalt. Ha kérdése van, nyugodtan látogasson el a Mithril.js chat szobájába.

Pager
Előző oldalTelepítés
Következő oldalJSX

A MIT licenc alapján kiadva.

Copyright (c) 2024 Mithril Contributors

https://mithril.js.org/simple-application.html

A MIT licenc alapján kiadva.

Copyright (c) 2024 Mithril Contributors