国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
靜態(tài)模板
開始使用Mavo
定義Mavo應(yīng)用程序
屬性屬性
表達(dá)式和MavoScript
自我評估功能
使用元元素保存中間值
結(jié)論
后記
致謝
首頁 web前端 css教程 讓Mavo在構(gòu)建交互式Web應(yīng)用程序中發(fā)光

讓Mavo在構(gòu)建交互式Web應(yīng)用程序中發(fā)光

Apr 18, 2025 am 09:50 AM

Let Mavo Shine in Building Interactive Web Applications

本教程將深入探討Mavo:一種便捷易用的方法,只需編寫HTML和CSS,無需一行JavaScript代碼或服務(wù)器后端,即可創(chuàng)建復(fù)雜、響應(yīng)式、持久化的Web應(yīng)用程序。

Mavo由麻省理工學(xué)院CSAIL的Haystack小組開發(fā),由Lea Verou領(lǐng)導(dǎo)。

我們將共同構(gòu)建一個(gè)外語學(xué)習(xí)用的抽認(rèn)卡應(yīng)用程序。這是一個(gè)功能齊全的CRUD應(yīng)用程序,允許您:

  • 創(chuàng)建、刪除、更新抽認(rèn)卡,并通過拖放重新排列。
  • 導(dǎo)入和導(dǎo)出抽認(rèn)卡。
  • 評估您對抽認(rèn)卡上單詞的掌握程度。

以下是我們完成的應(yīng)用程序的外觀:

在本教程中,我將引導(dǎo)您完成構(gòu)建應(yīng)用程序的整個(gè)過程。

在某些步驟的結(jié)尾,我將提供一些建議,讓您嘗試使用Mavo——學(xué)習(xí)更多知識——并對我們正在構(gòu)建的應(yīng)用程序進(jìn)行一些增強(qiáng)。

準(zhǔn)備好了嗎?讓我們開始吧!?

靜態(tài)模板

為了說明Mavo如何增強(qiáng)標(biāo)準(zhǔn)HTML,我們將首先創(chuàng)建一個(gè)純靜態(tài)HTML頁面,然后使用Mavo將這個(gè)靜態(tài)HTML轉(zhuǎn)換為一個(gè)功能齊全的Web應(yīng)用程序。

假設(shè)我們在以下HTML代碼中:

<h1>抽認(rèn)卡</h1>
<main><p>單詞或短語</p>
  <p>翻譯</p>
</main>

在該代碼中,<main></main>元素表示單個(gè)抽認(rèn)卡。

讓我們添加一些樣式,使我們的HTML看起來更像一個(gè)實(shí)際的抽認(rèn)卡應(yīng)用程序。您可以查看源代碼并在此處使用它。

開始使用Mavo

現(xiàn)在,我們只有靜態(tài)模板。是時(shí)候添加功能了,這樣它才能真正像抽認(rèn)卡應(yīng)用程序一樣工作。Mavo閃亮登場!

為了使用Mavo,我們首先需要在頁面的部分包含其JavaScript和CSS文件:

  ...
  <link href="https://get.mavo.io/mavo.css" rel="stylesheet">
  ...

您可能需要支持舊版瀏覽器,或者希望能夠閱讀代碼?您可以通過回答幾個(gè)問題來自定義您正在使用的Mavo版本和構(gòu)建版本。

定義Mavo應(yīng)用程序

要在HTML結(jié)構(gòu)上啟用Mavo功能,我們必須在包含Mavo應(yīng)用程序的元素上使用mv-app屬性(甚至可以是元素,都可以?。F渲禐閼?yīng)用程序的ID,在頁面中應(yīng)唯一。如果我們不帶值使用mv-app,并且同一元素上沒有idname屬性,則會(huì)自動(dòng)生成諸如mavo1、mavo2等名稱。

但是,強(qiáng)烈建議您命名Mavo應(yīng)用程序,因?yàn)樵撁Q在許多地方都會(huì)使用。

考慮到<main></main>元素代表我們的Mavo應(yīng)用程序,讓我們向其添加mv-app屬性,并為我們的應(yīng)用程序指定ID“flashcards”:

<main mv-app="flashcards">
  ...
</main>

屬性屬性

是時(shí)候告訴Mavo哪些應(yīng)用程序元素是重要的,即我們希望哪些元素可編輯并保存。

現(xiàn)在我們有兩個(gè)這樣的元素,它們是<p></p>元素。讓我們向這些元素添加property屬性,以告訴Mavo它們包含數(shù)據(jù)。具有property屬性的元素稱為屬性。

我們可以將property屬性放在任何HTML5元素上,Mavo知道如何使其可編輯。例如,對于<input>,您可以編輯其內(nèi)容,但<time></time>允許您通過適當(dāng)?shù)娜掌?時(shí)間選擇器編輯其日期/時(shí)間。

您還可以通過插件擴(kuò)展這組規(guī)則,并以新的方式(例如,富文本)使元素可編輯。

請記住,property屬性的值應(yīng)類似于idclass屬性那樣描述元素:

...

  <p property="source">單詞或短語</p>
  <p property="translation">翻譯</p>

...

如果您已經(jīng)有充分描述元素的class、iditemprop屬性,則可以使用不帶值的property,例如property="source"。

您注意到我們的應(yīng)用程序中有什么變化嗎?頁面頂部出現(xiàn)了一個(gè)帶有編輯按鈕的Mavo工具欄。編輯按鈕允許用戶在閱讀和編輯模式之間切換。現(xiàn)在我們的應(yīng)用程序處于閱讀模式。這意味著我們無法編輯頁面上的數(shù)據(jù)。

Mavo工具欄是完全可定制的,幾乎所有由Mavo生成的UI都是如此:您可以更改其位置、刪除其默認(rèn)樣式、添加自定義按鈕元素或使用您自己的HTML元素,等等。

我們稍后在本教程中將看到一個(gè)這樣的自定義示例。

訪問Mavo網(wǎng)站的此部分以了解更多信息。

現(xiàn)在讓我們通過單擊編輯按鈕切換到編輯模式。發(fā)生了什么變化?編輯按鈕的文本變?yōu)?strong>正在編輯,以指示我們處于編輯模式。如果您將鼠標(biāo)懸停在段落上,Mavo會(huì)通過將它們突出顯示為黃色來告知您可以單擊以編輯它們。開始吧!單擊文本并編輯它。哇!我們可以直接在頁面上更改內(nèi)容!

假設(shè)除了單詞及其翻譯之外,抽認(rèn)卡還應(yīng)包含一個(gè)單詞在句子中用法的示例。通過向抽認(rèn)卡添加相應(yīng)的元素來增強(qiáng)應(yīng)用程序。

mv-multiple屬性

目前,我們的應(yīng)用程序中只有一個(gè)抽認(rèn)卡。這沒什么用!對于一個(gè)有效的抽認(rèn)卡應(yīng)用程序,我們需要能夠添加、刪除和重新排列抽認(rèn)卡。我們該如何做到這一點(diǎn)?我們可以通過向代碼中添加更多<main></main>元素來創(chuàng)建更多抽認(rèn)卡,但是最終用戶如何創(chuàng)建和刪除抽認(rèn)卡呢?

幸運(yùn)的是,Mavo提供了一些使這變得輕而易舉的東西:mv-multiple屬性,它告訴Mavo某些元素可以被復(fù)制。它將其使用的元素轉(zhuǎn)換為可編輯的項(xiàng)目集合,并生成(可定制的)UI用于添加、刪除和重新排列項(xiàng)目。

如果在沒有property屬性的元素上使用mv-multiple,Mavo會(huì)自動(dòng)向其添加property="collection"(或collection2、collection3等,以便名稱唯一)。但是,建議您也使用property屬性,為您的集合命名,并確保在HTML更改時(shí)保留其數(shù)據(jù)。

讓我們在我們的應(yīng)用程序中使用mv-multiple屬性,將我們孤單的抽認(rèn)卡轉(zhuǎn)換為抽認(rèn)卡集合:

  ...    
  <main mv-app="flashcards" mv-multiple>
    <p property="source">單詞或短語</p>
    <p property="translation">翻譯</p>
  </main>

也可以將屬性名稱指定為mv-multiple的值,例如mv-multiple="flashcards"。

mv-multiple屬性位于將被復(fù)制的元素上,而不是集合的容器上。人們常常犯的一個(gè)錯(cuò)誤是使用<main mv-multiple></main>而不是<main><p mv-multiple></p></main>,并且在檢查元素或樣式使其明顯之前,通常會(huì)長時(shí)間不被發(fā)現(xiàn)?,F(xiàn)在切換應(yīng)用程序到編輯模式。請注意,在抽認(rèn)卡下方,現(xiàn)在有一個(gè)添加抽認(rèn)卡按鈕。讓我們試一試:使用該按鈕創(chuàng)建一些抽認(rèn)卡?,F(xiàn)在我們可以直接在應(yīng)用程序中動(dòng)態(tài)添加新元素,即使HTML中沒有相應(yīng)的元素。但這還不是全部!

請注意,<main></main>上的property屬性實(shí)際上并沒有使整個(gè)<main></main>元素可編輯,而是充當(dāng)分組元素。當(dāng)您在包含其他屬性的元素上使用property屬性時(shí),就會(huì)發(fā)生這種情況。嘗試將鼠標(biāo)懸停在抽認(rèn)卡上,并注意出現(xiàn)在其右上角的三個(gè)按鈕,用于通過拖放句柄添加刪除重新排列元素。通過將鼠標(biāo)懸停在任何項(xiàng)目欄按鈕上,我們可以理解它們對應(yīng)哪個(gè)抽認(rèn)卡:Mavo會(huì)突出顯示它。是不是很神奇?

您可以自定義Mavo生成的任何UI元素,例如,您可以通過使用mv-drag-handle類創(chuàng)建您自己的拖動(dòng)句柄。

Mavo添加到集合中每個(gè)項(xiàng)目的按鈕也可以通過鍵盤訪問。甚至重新排序:您可以將焦點(diǎn)放在拖動(dòng)句柄上,并使用箭頭鍵移動(dòng)項(xiàng)目。

mv-storage屬性

現(xiàn)在我們已經(jīng)有了基本的UI,讓我們嘗試以下操作:

  • 切換到編輯模式(如果您尚未這樣做)。
  • 編輯第一個(gè)抽認(rèn)卡的源單詞和翻譯。再添加幾個(gè)抽認(rèn)卡。
  • 將應(yīng)用程序切換回閱讀模式。
  • 最后……刷新頁面。

什么?!我們的數(shù)據(jù)去哪兒了?Mavo不是應(yīng)該保存它嗎?發(fā)生了什么?

實(shí)際上,我們從未告訴Mavo是否在哪里存儲(chǔ)我們的數(shù)據(jù)!

為此,我們需要使用mv-storage屬性。我們有什么選擇?好吧,Mavo為我們打開了巨大的可能性,而Mavo插件則打開了更多可能性!

在我們的應(yīng)用程序中,我們將數(shù)據(jù)存儲(chǔ)在瀏覽器的localStorage中,這是最簡單的選項(xiàng)之一,因此它非常適合我們的第一個(gè)Mavo應(yīng)用程序。我們只需要在具有mv-app屬性的元素(也稱為Mavo根)上添加值為localmv-storage屬性。

<main mv-app="flashcards" mv-storage="local">
  ...
</main>

看看Mavo工具欄。注意到什么了嗎?出現(xiàn)另一個(gè)按鈕——保存按鈕。

嘗試再次編輯應(yīng)用程序數(shù)據(jù)。請注意,保存按鈕現(xiàn)在已突出顯示。將鼠標(biāo)懸停在保存按鈕上,Mavo將突出顯示具有未保存數(shù)據(jù)的屬性。是不是很酷?

單擊保存按鈕并刷新頁面(無需在刷新頁面之前切換到閱讀模式)。您的數(shù)據(jù)還在嗎?太好了!我們離我們的目標(biāo)又近了一步——一個(gè)功能齊全的抽認(rèn)卡應(yīng)用程序。

mv-autosave屬性

現(xiàn)在我們每次需要保存數(shù)據(jù)時(shí)都必須單擊保存按鈕嗎?這可能更安全,可以防止破壞寶貴的數(shù)據(jù),但這通常會(huì)很不方便。我們可以自動(dòng)保存數(shù)據(jù)嗎?當(dāng)然!為了在每次更改數(shù)據(jù)時(shí)自動(dòng)保存數(shù)據(jù),我們可以在Mavo根元素上使用mv-autosave屬性。其值為節(jié)流保存的秒數(shù)。讓我們向應(yīng)用程序的根元素添加mv-autosave="3"

<main mv-app="flashcard" mv-autosave="3" mv-storage="local">
  ...
</main>

如果mv-autosave="3",Mavo最多每三秒鐘只能保存一次。這對于保留更改歷史記錄的后端(例如,GitHub、Dropbox)尤其有用,以防止洪泛,這會(huì)使該歷史記錄毫無用處。

要禁用節(jié)流并立即保存,我們可以使用mv-autosave="0"或僅使用mv-autosave,這也會(huì)從UI中刪除保存按鈕(因?yàn)樵谶@種情況下它沒有用處)。

再次更改數(shù)據(jù)并查看保存按鈕??吹搅藛??一開始,它被突出顯示,但在3秒鐘后——它沒有被突出顯示。我們所有的數(shù)據(jù)現(xiàn)在都自動(dòng)保存了!

因此,現(xiàn)在我們的應(yīng)用程序的主要部分看起來像這樣:

<main mv-app="flashcards" mv-autosave="3" mv-storage="local"><p property="source">單詞或短語</p>
        <p property="translation">翻譯</p>
      </main>

我們幾乎完成了應(yīng)用程序的alpha版本?,F(xiàn)在輪到您使應(yīng)用程序變得更好。別擔(dān)心,您擁有所需的所有知識。

增強(qiáng)應(yīng)用程序,以便抽認(rèn)卡可以由最終用戶組織到與各種主題相關(guān)的不同組中,例如,用戶可以將所有與服裝相關(guān)的抽認(rèn)卡收集到一個(gè)組中,將所有與廚房用具相關(guān)的抽認(rèn)卡收集到另一個(gè)組中,等等。

?提示!

有很多方法可以實(shí)現(xiàn)這個(gè)目標(biāo),這取決于您決定遵循什么。但是,我希望您在繼續(xù)之前考慮一些問題:

  1. 您將使用什么HTML元素作為分組元素?如果用戶可以看到抽認(rèn)卡組的名稱(主題名稱)并可以將組折疊到標(biāo)題,那將很方便。
  2. 您將向該元素添加哪些Mavo屬性(如果有的話)?該元素將是屬性還是集合
  3. 最終用戶能否添加新主題、刪除和重新排列它們、更改主題標(biāo)題以及在不同主題之間移動(dòng)抽認(rèn)卡?

如果您決定不按組組織抽認(rèn)卡,而是只用對應(yīng)于各種主題的標(biāo)簽標(biāo)記它們,那也沒問題。使用標(biāo)簽的解決方案也是合適的。為了練習(xí),也嘗試完成這種方法。

mv-bar屬性

由于我們的應(yīng)用程序在本地存儲(chǔ)數(shù)據(jù),因此默認(rèn)情況下,應(yīng)用程序的用戶將無法與其他用戶共享他們的卡片。如果我們允許他們導(dǎo)出他們的抽認(rèn)卡和導(dǎo)入其他人的抽認(rèn)卡,那不是很好嗎?謝天謝地,這些功能已經(jīng)在Mavo中實(shí)現(xiàn),我們可以很容易地將它們添加到我們的應(yīng)用程序中!

mv-bar屬性控制將顯示哪些按鈕(如果有的話)在工具欄中。它通常在Mavo根(具有mv-app屬性的元素)上指定。按鈕由它們的id(非常邏輯)表示:edit、import、export等。

由于我們只想向默認(rèn)集合添加幾個(gè)按鈕,因此我們可以使用所謂的相對語法,它允許我們向默認(rèn)集合添加和刪除按鈕,而無需顯式列出所有內(nèi)容。我們只需要以with關(guān)鍵字開頭mv-bar屬性的值即可。

通過這樣做,我們將得到以下內(nèi)容:

<main mv-app="flashcards" mv-autosave="3" mv-bar="with import export" mv-storage="local">
          ...
</main>

嘗試這些功能:添加一些抽認(rèn)卡,嘗試將它們導(dǎo)出到文件中。然后刪除現(xiàn)有抽認(rèn)卡并從先前導(dǎo)出的文件中導(dǎo)入抽認(rèn)卡。

表達(dá)式和MavoScript

現(xiàn)在讓我們向我們的應(yīng)用程序添加一些統(tǒng)計(jì)信息,例如抽認(rèn)卡的數(shù)量!聽起來很有趣嗎?我希望如此。?

為此,我們需要學(xué)習(xí)一些關(guān)于Mavo的新知識。

我們可以動(dòng)態(tài)地引用我們在任何地方定義的任何屬性的值在我們的Mavo應(yīng)用程序中(包括在HTML屬性中),方法是將它的名稱放在方括號中,像這樣:[propertyName]。這是一個(gè)簡單的表達(dá)式的示例,它允許我們動(dòng)態(tài)計(jì)算事物,并在它們發(fā)生變化時(shí)做出反應(yīng)。

Mavo的表達(dá)式語法稱為MavoScript。它類似于電子表格公式,允許我們執(zhí)行計(jì)算和其他操作(使用數(shù)字、文本、列表等),但旨在更易于閱讀并適應(yīng)嵌套關(guān)系。您可以在文檔中了解有關(guān)Mavo表達(dá)式和MavoScript的更多信息。

現(xiàn)在讓我們嘗試一下,在抽認(rèn)卡屬性內(nèi)部添加[source]表達(dá)式,例如,在兩個(gè)屬性之間:源和翻譯。

...
  <p property="source">單詞或短語</p>
  [source]
  <p property="translation">翻譯</p>
...

我們的應(yīng)用程序發(fā)生了什么變化?抽認(rèn)卡源屬性的值現(xiàn)在在頁面上顯示了兩次。

切換到編輯模式并嘗試更改源屬性的值。您看到了嗎?在您更改屬性值時(shí),頁面內(nèi)容會(huì)更新!這就是我之前說Mavo允許我們開發(fā)響應(yīng)式Web應(yīng)用程序的原因。

這確實(shí)很酷,但不幸的是,在我們的例子中,它并沒有什么用處:我們無法使用此表達(dá)式來計(jì)算抽認(rèn)卡的數(shù)量——我們總是只有一個(gè)值。

如果我們將[source]表達(dá)式放在抽認(rèn)卡屬性外部會(huì)怎樣?我們將得到如下內(nèi)容:

...
  [source]

    ...

...

這與之前的案例有何不同?要查看差異,如果您尚未這樣做,請?zhí)砑右恍┏檎J(rèn)卡?,F(xiàn)在,我們不是一個(gè)值,而是一個(gè)逗號分隔的值列表:所有抽認(rèn)卡的源屬性。這正是我們一直在尋找的:列表中項(xiàng)目的數(shù)量對應(yīng)于應(yīng)用程序中抽認(rèn)卡的數(shù)量。

說得通嗎?是的,但是如果我們計(jì)算抽認(rèn)卡的數(shù)量,而不是其源屬性的值的數(shù)量,豈不是更合乎邏輯?畢竟,即使在我們填寫其源或翻譯之前,添加的抽認(rèn)卡也存在。我建議您執(zhí)行以下操作:讓我們用[flashcard]替換[source]表達(dá)式:

...
  [flashcard]

    ...

...

注意到區(qū)別了嗎?我們?nèi)匀挥幸粋€(gè)列表,但其值不是簡單值,而是對象,即包含與每個(gè)抽認(rèn)卡相關(guān)的所有數(shù)據(jù)的復(fù)雜值。好消息是這些對象的數(shù)目等于抽認(rèn)卡的數(shù)目,因?yàn)槊總€(gè)抽認(rèn)卡都有一個(gè),即使它完全為空。所以,現(xiàn)在我們每個(gè)抽認(rèn)卡都有一個(gè)對象,但是我們?nèi)绾斡?jì)算它們并顯示總數(shù)呢?

現(xiàn)在讓我們熟悉MavoScript函數(shù),并找到可以讓我們計(jì)算抽認(rèn)卡數(shù)量的函數(shù)。記住,我們有一個(gè)抽認(rèn)卡列表,所以我們需要找到一個(gè)可以讓我們計(jì)算列表中項(xiàng)目數(shù)量的函數(shù)。它來了——count()函數(shù)就是這樣做的!

但是我們?nèi)绾卧诒磉_(dá)式中使用函數(shù)呢?我們需要注意哪些規(guī)則?是的,有幾個(gè):

  1. 表達(dá)式用方括號表示。
  2. 不要嵌套括號。

讓我們嘗試使用count()函數(shù)來計(jì)算抽認(rèn)卡的數(shù)量:

...
[count(flashcard)]

  ...

...

這正是我們所追求的——現(xiàn)在我們的應(yīng)用程序中有一些統(tǒng)計(jì)數(shù)據(jù)了!是不是很酷?

我希望您已經(jīng)熱身并準(zhǔn)備好繼續(xù)嘗試Mavo了。

改進(jìn)應(yīng)用程序,以便不僅顯示應(yīng)用程序中抽認(rèn)卡的總數(shù)的統(tǒng)計(jì)信息,而且還顯示每個(gè)主題中抽認(rèn)卡的數(shù)量的統(tǒng)計(jì)信息(如果有的話)。

?提示!
想要根據(jù)某些條件過濾列表嗎?where運(yùn)算符將有所幫助。

自我評估功能

我們已經(jīng)有一個(gè)應(yīng)用程序,可以讓我們創(chuàng)建、編輯和存儲(chǔ)多個(gè)抽認(rèn)卡。但是我們?nèi)绾胃櫸覀円呀?jīng)學(xué)習(xí)了哪些抽認(rèn)卡,以及哪些抽認(rèn)卡需要更多練習(xí)呢?任何值得尊敬的抽認(rèn)卡應(yīng)用程序都需要自我評估功能。讓我們研究一下我們?nèi)绾翁砑铀?/p>

假設(shè)在我們的應(yīng)用程序中,我們有兩個(gè)用于自我評估的按鈕:差和好。我們希望每次最終用戶單擊按鈕時(shí)會(huì)發(fā)生什么?好吧,這個(gè)想法很簡單:

  • 單擊“差”按鈕將表示用戶尚未學(xué)習(xí)該單詞,我們希望我們的應(yīng)用程序?qū)⑾鄳?yīng)的抽認(rèn)卡移動(dòng)到列表的開頭,以便他們可以在啟動(dòng)應(yīng)用程序后盡快看到它。
  • 單擊“好”按鈕將表示用戶已經(jīng)學(xué)習(xí)了該單詞,相應(yīng)的抽認(rèn)卡需要移動(dòng)到列表的末尾,讓他們使用他們尚未學(xué)習(xí)的其他抽認(rèn)卡。

“您確定我們可以在沒有JavaScript的情況下做到這一點(diǎn)嗎?” 你可能會(huì)問。是的!Mavo非常強(qiáng)大,能夠?yàn)槲覀兲峁┧璧乃泄ぞ撸?/p>

現(xiàn)在我們知道了我們將要實(shí)現(xiàn)的內(nèi)容,讓我們首先設(shè)置UI,然后繼續(xù)下一步。我們的標(biāo)記看起來像這樣:

...

  ...
  <h2>評估自己</h2>
    <button>差</button>
    <button>好</button>


...

mv-action屬性

Mavo操作允許我們創(chuàng)建我們自己的控件,這些控件以自定義方式修改數(shù)據(jù),當(dāng)用戶與它們交互時(shí)。聽起來很有希望,對吧?

要定義自定義操作,我們需要在Mavo應(yīng)用程序內(nèi)的相應(yīng)元素上使用mv-action屬性。每次單擊該元素時(shí)都會(huì)執(zhí)行該操作。這正是我們一直在尋找的。

對于<form></form>元素,當(dāng)表單提交時(shí)會(huì)執(zhí)行自定義操作。mv-action屬性的值是一個(gè)表達(dá)式。我們可以使用MavoScript為我們提供的任何表達(dá)式函數(shù)和語法,以及一些其他函數(shù)來促進(jìn)數(shù)據(jù)操作,例如add()、set()、move()delete()。重要的是要注意,與以反應(yīng)方式計(jì)算的普通表達(dá)式不同,這些表達(dá)式僅在每次觸發(fā)操作時(shí)才計(jì)算。

Mavo期望mv-action屬性的值是一個(gè)表達(dá)式,因此無需將其括在括號中mv-action="expression"。此外,如果我們包含它們,它們將被視為表達(dá)式的部分。

因此,我們需要移動(dòng)集合內(nèi)的抽認(rèn)卡,而Mavo有一個(gè)合適的函數(shù)可以讓我們做到這一點(diǎn)——move()函數(shù)。它的第一個(gè)參數(shù)指的是我們正在移動(dòng)的項(xiàng)目,第二個(gè)參數(shù)是它在集合中的位置。請記住,集合的元素從0開始編號。

想要了解有關(guān)move函數(shù)(及其變體)以及自定義操作的更多信息,請參閱文檔。

讓我們實(shí)現(xiàn)我們前面討論的大綱的第一點(diǎn):在自我評估時(shí),最終用戶單擊“差”按鈕,相應(yīng)的抽認(rèn)卡將移動(dòng)到集合的開頭,即成為第一個(gè)。所以在代碼中,我們有:

...

  ...
  <button mv-action="move(this, 0)">差</button>
  ...

...

請注意,在mv-action屬性中,我們在屬性內(nèi)部引用抽認(rèn)卡屬性,因?yàn)槲覀兿M幚?strong>當(dāng)前抽認(rèn)卡。

如果我們嘗試實(shí)現(xiàn)大綱的第二點(diǎn),我們將面臨一個(gè)問題。您能否建議這究竟是什么問題?

讓我們記住,如果最終用戶單擊“好”按鈕,相應(yīng)的抽認(rèn)卡將移動(dòng)到集合的末尾,即成為最后一個(gè)。為了使抽認(rèn)卡成為集合中的最后一個(gè),我們需要知道集合中項(xiàng)目的數(shù)量。

謝天謝地,我們之前已經(jīng)解決了這項(xiàng)任務(wù)并實(shí)現(xiàn)了相應(yīng)的功能。但是我們能否使用該解決方案來解決我們當(dāng)前的問題呢?不幸的是,我們不能:正如我們已經(jīng)知道的,我們只能在抽認(rèn)卡屬性外部引用抽認(rèn)卡的集合(并評估其大?。?。但在我們的例子中,我們需要在其中進(jìn)行:我們需要為其編寫表達(dá)式的“好”按鈕在抽認(rèn)卡屬性內(nèi)部。

那我們該怎么辦呢?我很高興你問。Mavo有解決方案。

使用元元素保存中間值

因此,一方面,我們知道[count(flashcards)]表達(dá)式會(huì)在外部評估抽認(rèn)卡屬性時(shí)為我們提供抽認(rèn)卡的數(shù)量。另一方面,我們需要在其中使用該值抽認(rèn)卡屬性。

為了解決這個(gè)難題,我們需要在我們的代碼中評估抽認(rèn)卡的數(shù)量,并以某種方式保存結(jié)果,以便能夠在應(yīng)用程序的其他地方使用它,準(zhǔn)確地說是在抽認(rèn)卡屬性內(nèi)部。對于這種情況,在Mavo中,有所謂的計(jì)算屬性。

為了保存中間結(jié)果以便我們可以引用它,我們需要代碼中的HTML元素。建議為此使用<meta>元素,如下所示:<meta content="[expression]" property="propertyName">。使用此元素的優(yōu)點(diǎn)是它在編輯模式外部是隱藏的,在語義上和視覺上都是如此。

請記住,默認(rèn)情況下不會(huì)保存計(jì)算屬性。

現(xiàn)在讓我們在我們的應(yīng)用程序中添加flashcardCount計(jì)算屬性。記住,我們必須將其放在抽認(rèn)卡屬性外部,但是然后我們可以從任何地方引用它:

...
<meta content="[count(flashcard)]" property="flashcardCount">
    ...

...

只剩下一個(gè)步驟來完成自我評估功能的實(shí)現(xiàn):如果最終用戶單擊“好”按鈕,相應(yīng)的抽認(rèn)卡將移動(dòng)到集合的末尾,即成為最后一個(gè)。讓我們在應(yīng)用程序的代碼中添加相關(guān)的操作:

...
<meta content="[count(flashcard)]" property="flashcardCount">
  ...
  <button mv-action="move(this, flashcardCount)">好</button>

...

我們完成了!恭喜!?

還有另一種解決該任務(wù)的方法:借助$all特殊屬性。如果$all屬性位于集合內(nèi)部,則它代表集合本身。因此,在這種情況下無需使用任何計(jì)算屬性。嘗試自己實(shí)現(xiàn)該解決方案。

只剩下最后一件事我們需要修復(fù)。還記得我們向應(yīng)用程序添加了一些統(tǒng)計(jì)數(shù)據(jù)的部分嗎?還記得我們構(gòu)建的用于評估應(yīng)用程序中抽認(rèn)卡數(shù)量的表達(dá)式嗎:[count(flashcard)]?相反,我們現(xiàn)在可以使用(也應(yīng)該使用)我們定義的計(jì)算屬性。在應(yīng)用程序中進(jìn)行相應(yīng)的更改。

結(jié)論

那么到目前為止我們學(xué)習(xí)了什么呢?讓我們回顧一下。為了將任何靜態(tài)HTML頁面轉(zhuǎn)換為Mavo應(yīng)用程序,我們需要:

  1. 在頁面的部分包含Mavo JavaScript和CSS文件。
  2. 向Mavo根元素添加mv-app屬性。
  3. 通過向它們添加property屬性來告訴Mavo我們的應(yīng)用程序的哪些元素是重要的。
  4. mv-multiple屬性放在將被復(fù)制并轉(zhuǎn)換為集合的元素上。
  5. 通過向Mavo根添加mv-storage屬性來告訴Mavo在哪里存儲(chǔ)我們的數(shù)據(jù)。
  6. 決定Mavo是否應(yīng)該自動(dòng)保存我們的數(shù)據(jù)。如果是,則向Mavo根添加mv-autosave屬性。我們還知道:
  7. Mavo工具欄是完全可定制的。mv-bar屬性控制將顯示哪些按鈕。
  8. 表達(dá)式允許我們在其他元素中顯示屬性的當(dāng)前值并執(zhí)行計(jì)算。表達(dá)式的值(和類型)取決于表達(dá)式在代碼中所處的位置。Mavo的表達(dá)式語法稱為MavoScript。
  9. 自定義操作允許創(chuàng)建以自定義方式修改數(shù)據(jù)的控件。要在Mavo應(yīng)用程序內(nèi)的相應(yīng)元素上定義自定義操作,請?jiān)O(shè)置mv-action屬性。
  10. 值為表達(dá)式的屬性稱為計(jì)算屬性。為了保存中間結(jié)果以便能夠在應(yīng)用程序的其他地方引用它,建議使用<meta>元素。

后記

所以我們構(gòu)建了我們的應(yīng)用程序。它已經(jīng)完美了嗎?當(dāng)然不是,沒有什么東西是完美的!有很多東西可以改進(jìn),還有很多功能可以添加(在Mavo的幫助下,我們甚至可以使我們的應(yīng)用程序多語言化?。@^續(xù),進(jìn)一步增強(qiáng)它,不要猶豫嘗試新的東西!

到目前為止,我們對Mavo的了解只是冰山一角,還有很多東西。我鼓勵(lì)您仔細(xì)閱讀文檔,檢查示例(在Mavo網(wǎng)站上,或在CodePen上:由Lea Verou制作和一些由我自己制作),并創(chuàng)建新內(nèi)容!祝你好運(yùn)!?

致謝

我要感謝兩位偉大的人。首先,我要衷心感謝Lea Verou,她不僅激勵(lì)我撰寫本教程(并幫助我實(shí)現(xiàn)它),而且還一直激勵(lì)我,她使Web開發(fā)世界變得更美好。我從未見過如此有天賦的人,我很高興有機(jī)會(huì)和她一起做一些事情!

我還感謝James Moore。他在Udemy上的“JavaScript初學(xué)者函數(shù)式編程”課程中使用的示例促使我制作我自己的抽認(rèn)卡學(xué)習(xí)應(yīng)用程序版本。他是一位很棒的老師!

以上是讓Mavo在構(gòu)建交互式Web應(yīng)用程序中發(fā)光的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

什么是'渲染障礙CSS”? 什么是'渲染障礙CSS”? Jun 24, 2025 am 12:42 AM

CSS會(huì)阻塞頁面渲染是因?yàn)闉g覽器默認(rèn)將內(nèi)聯(lián)和外部CSS視為關(guān)鍵資源,尤其是使用引入的樣式表、頭部大量內(nèi)聯(lián)CSS以及未優(yōu)化的媒體查詢樣式。1.提取關(guān)鍵CSS并內(nèi)嵌至HTML;2.延遲加載非關(guān)鍵CSS通過JavaScript;3.使用media屬性優(yōu)化加載如打印樣式;4.壓縮合并CSS減少請求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過度拆分與復(fù)雜腳本控制。

什么是AutoPrefixer,它如何工作? 什么是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個(gè)根據(jù)目標(biāo)瀏覽器范圍自動(dòng)為CSS屬性添加廠商前綴的工具。1.它解決了手動(dòng)維護(hù)前綴易出錯(cuò)的問題;2.通過PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設(shè)置browserslist、在構(gòu)建流程中啟用;4.注意事項(xiàng)有不手動(dòng)加前綴、保持配置更新、非所有屬性都加前綴、建議配合預(yù)處理器使用。

什么是圓錐級函數(shù)? 什么是圓錐級函數(shù)? Jul 01, 2025 am 01:16 AM

theconic-Gradient()functionIncsscreatesCircularGradientsThatRotateColorStopSaroundAcentralPoint.1.IsidealForPieCharts,ProgressIndicators,colordichers,colorwheels和decorativeBackgrounds.2.itworksbysbysbysbydefindefingincolordefingincolorstopsatspecificains off.

CSS教程,用于創(chuàng)建粘性標(biāo)頭或頁腳 CSS教程,用于創(chuàng)建粘性標(biāo)頭或頁腳 Jul 02, 2025 am 01:04 AM

TocreatestickyheadersandfooterswithCSS,useposition:stickyforheaderswithtopvalueandz-index,ensuringparentcontainersdon’trestrictit.1.Forstickyheaders:setposition:sticky,top:0,z-index,andbackgroundcolor.2.Forstickyfooters,betteruseposition:fixedwithbot

CSS自定義屬性的范圍是什么? CSS自定義屬性的范圍是什么? Jun 25, 2025 am 12:16 AM

CSS自定義屬性的作用域取決于其聲明的上下文,全局變量通常定義在:root中,而局部變量則定義在特定選擇器內(nèi),以便組件化和隔離樣式。例如,定義在.card類中的變量僅對匹配該類的元素及其子元素可用。最佳實(shí)踐包括:1.使用:root定義全局變量如主題色;2.在組件內(nèi)部定義局部變量以實(shí)現(xiàn)封裝;3.避免重復(fù)聲明同一變量;4.注意選擇器特異性可能引發(fā)的覆蓋問題。此外,CSS變量區(qū)分大小寫,且應(yīng)在使用前定義以避免錯(cuò)誤。若變量未定義或引用失敗,則會(huì)采用回退值或默認(rèn)值initial。調(diào)試時(shí)可通過瀏覽器開發(fā)者工

CSS教程專注于移動(dòng)優(yōu)先設(shè)計(jì) CSS教程專注于移動(dòng)優(yōu)先設(shè)計(jì) Jul 02, 2025 am 12:52 AM

Mobile-firstCSSdesignrequiressettingtheviewportmetatag,usingrelativeunits,stylingfromsmallscreensup,optimizingtypographyandtouchtargets.First,addtocontrolscaling.Second,use%,em,orreminsteadofpixelsforflexiblelayouts.Third,writebasestylesformobile,the

CSS教程,用于創(chuàng)建加載旋轉(zhuǎn)器和動(dòng)畫 CSS教程,用于創(chuàng)建加載旋轉(zhuǎn)器和動(dòng)畫 Jul 07, 2025 am 12:07 AM

創(chuàng)建CSS加載旋轉(zhuǎn)器的方法有三種:1.使用邊框的基本旋轉(zhuǎn)器,通過HTML和CSS實(shí)現(xiàn)簡單動(dòng)畫;2.使用多個(gè)點(diǎn)的自定義旋轉(zhuǎn)器,通過不同延遲時(shí)間實(shí)現(xiàn)跳動(dòng)效果;3.在按鈕中添加旋轉(zhuǎn)器,通過JavaScript切換類來顯示加載狀態(tài)。每種方法都強(qiáng)調(diào)了設(shè)計(jì)細(xì)節(jié)如顏色、大小、可訪問性和性能優(yōu)化的重要性,以提升用戶體驗(yàn)。

如何創(chuàng)建本質(zhì)上響應(yīng)的網(wǎng)格布局? 如何創(chuàng)建本質(zhì)上響應(yīng)的網(wǎng)格布局? Jul 02, 2025 am 01:19 AM

要?jiǎng)?chuàng)建內(nèi)在響應(yīng)式網(wǎng)格布局,核心方法是使用CSSGrid的repeat(auto-fit,minmax())模式;1.設(shè)置grid-template-columns:repeat(auto-fit,minmax(200px,1fr))讓瀏覽器自動(dòng)調(diào)整列數(shù)并限制每列最小和最大寬度;2.使用gap控制格子間距;3.容器應(yīng)設(shè)為相對單位如width:100%、配合box-sizing:border-box避免寬度計(jì)算錯(cuò)誤并用margin:auto居中;4.可選設(shè)置行高與內(nèi)容對齊方式提升視覺一致性,如row

See all articles