精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Web框架的替代方案分享(下)

jf_78858299 ? 來源: 前端之巔 ? 作者:Noam Rosenthal ? 2023-03-20 14:51 ? 次閱讀

此 HTML 包括以下內容:

  • 我們有一個 main 表單,其中有所有的全局輸入和按鈕,還有一個新的表單用于創建一個新任務。請注意,我們使用 form 屬性將元素與表單聯系起來,以避免表單中的元素嵌套。
  • template 元素代表一個列表項,它的根元素是另一個表單,代表與特定任務相關的互動數據。當任務被添加時,這個表單將通過克隆模板的內容而被重復。
  • 隱藏的輸入表示不直接顯示的數據,但用于樣式設計和選擇。

注意這個 DOM 是如何簡潔的。它沒有在其元素中散布類。它包括應用程序所需的所有元素,以合理的層次結構排列。多虧了隱藏的輸入元素,你已經可以很好地感覺到以后文檔中可能會有什么變化。

這個 HTML 不知道它將如何被樣式化,也不知道它到底與什么數據綁定。讓 CSS 和 JavaScript 為你的 HTML 工作,而不是讓你的 HTML 為某個特定的造型機制工作。這將使你在改變設計時變得更加容易。

最小控制器 JavaScrip

現在我們在 CSS 中已經有了大部分的反應性,在模型中也有了列表處理,剩下的就是控制器的代碼了,也就是把所有的東西固定在一起的“膠帶”。在這個小程序中,控制器的 JavaScript 大約是 40 行。

下面是一個版本,每個部分都有解釋:

import TaskListModel from './model.js';


const model = new TaskListModel(new class {

上面,我們創建了一個新模型。

onAdd(key, value) {
   const newItem = document.querySelector('.todo-list template').content.cloneNode(true).firstElementChild;
   newItem.name = `task-${key}`;
   const save = () => model.updateTask(key,  Object.fromEntries(new FormData(newItem)));
   newItem.elements.completed.addEventListener('change', save);
   newItem.addEventListener('submit', save);
   newItem.elements.title.addEventListener('dblclick', ({target}) => target.removeAttribute('readonly'));
   newItem.elements.title.addEventListener('blur', ({target}) => target.setAttribute('readonly', ''));
   newItem.elements.destroy.addEventListener('click', () => model.deleteTask(key));
   this.onUpdate(key, value, newItem);
   document.querySelector('.todo-list').appendChild(newItem);
}

當一個項目被添加到模型中,我們在用 UI 中創建其相應的列表項。

在上面的代碼段中,我們克隆了項目 template 的內容,為一個特定的項目分配了事件監聽器,并將新的項目添加到列表中。

注意,這個函數,以及 onUpdate、onRemove 和 onCountChange,都是要從模型中調用的回調。

onUpdate(key, {title, completed}, form = document.forms[`task-${key}`]) {
   form.elements.completed.checked = !!completed;
   form.elements.title.value = title;
   form.elements.title.blur();
}

當一個項目被更新時,我們設置它的 completed 和 title 值,然后 blur(退出編輯模式)。

onRemove(key) { document.forms[`task-${key}`].remove(); }

當從模型中移除一個項時,我們將從視圖中移除其對應的列表項。

onCountChange({active, completed}) {
   document.forms.main.elements.completedCount.value = completed;
   document.forms.main.elements.toggleAll.checked = active === 0;
   document.forms.main.elements.totalCount.value = active + completed;
   document.forms.main.elements.activeCount.innerHTML = `${active} item${active === 1 ? '' : 's'} left`;
}

在上面的代碼中,當完成的或活動的項目數量發生變化時,我們設置適當的輸入來觸發 CSS 反應,并格式化顯示計數的輸出。

const updateFilter = () => filter.value = location.hash.substr(2);
window.addEventListener('hashchange', updateFilter);
window.addEventListener('load', updateFilter);

而我們從 hash 片段中更新過濾器(以及在啟動時)。我們在上面所做的只是設置一個表單元素的值:CSS 處理其余部分。

document.querySelector('.todoapp').addEventListener('submit', e => e.preventDefault(), {capture: true});

在這里,我們確保當表單被提交時我們不會重新加載頁面。這一行代碼把這個應用程序變成了一個 SPA。

document.forms.newTask.addEventListener('submit', ({target: {elements: {title}}}) =>   
    model.createTask({title: title.value}));
document.forms.main.elements.toggleAll.addEventListener('change', ({target: {checked}})=>
    model.markAll(checked));
document.forms.main.elements.clearCompleted.addEventListener('click', () =>
    model.clearCompleted());

而這就處理了主要的操作(創建、標記所有、清除完成)。

與 CSS 的反應性

完整的 CSS 文件可以供你查看。

CSS 處理了規范中的很多要求(做了一些有利于無障礙的修正)。我們來看看一些示例。

根據規范,“X”(destroy)按鈕只在懸停時顯示。我還添加了一個輔助位,使它在任務被聚焦時可見。

.task:not(:hover, :focus-within) button[name="destroy"] { opacity: 0 }

當 filter 鏈接是當前鏈接時,它會得到一個紅色邊框:

.todoapp input[name="filter"][value=""] ~ footer a[href$="#/"] 。
nav a:target {
   border-color: #CE4646;
}

注意,我們可以使用鏈接元素的 href 作為部分屬性選擇器 -- 不需要 JavaScript 來檢查當前的過濾器,并在適當的元素上設置一個 selected 類。

我們還使用了 :target 選擇器,這讓我們不必擔心是否要添加過濾器。

title 輸入的視圖和編輯樣式根據其只讀模式而改變:

.task input[name="title"]:read-only {
…
}


.task input[name="title"]:not(:read-only) {
…
}

過濾(即只顯示活動的和已完成的任務)是用選擇器完成的:

input[name="filter"][value="active"] ~ * .task
      :is(input[name="completed"]:checked, input[name="completed"]:checked ~ *),
input[name="filter"][value="completed"] ~ * .task
     :is(input[name="completed"]:not(:checked), input[name="completed"]:not(:checked) ~ *) {
   display: none;
}

上面的代碼可能看起來有點冗長,用 Sass 這樣的 CSS 預處理程序可能更容易閱讀。但它所做的事情很簡單:如果過濾器處于 active 狀態,而 completed 的復選框被選中,或者相反,那么我們就會隱藏復選框及其同級。

我選擇在 CSS 中實現這個簡單的過濾器,以顯示它能走多遠,但如果它開始變得棘手,那么把它移到模型中是完全有意義的。

總結及要點

我相信,框架為實現復雜的任務提供了方便的方法,而且它們有超越技術的好處,比如使一組開發人員向特定的風格和模式看齊。Web 平臺提供了許多選擇,而采用一個框架可以讓每個人至少部分地在這些選擇上達成一致,這是有價值的。另外,聲明式編程的優雅性也是值得稱道的,而且組件化的大特點也不是我在這篇文章中所處理的。

但請記住,替代模式是存在的,通常成本較低,而且不一定需要較少的開發者經驗。允許自己對這些模式感到好奇,即使你決定在使用框架時從它們中挑選。

模式概述

  • 保持 DOM 樹的穩定。它啟動了一個連鎖反應,使事情變得簡單。
  • 如果可以的話,依靠 CSS 的反應性而不是 JavaScript。
  • 使用表單元素作為表示互動數據的主要方式。
  • 使用 HTML template 元素而不是 JavaScript 生成的模板。
  • 使用雙向的變化流作為模型的接口。

作者簡介:

Noam Rosenthal,Web 平臺顧問,WebKit 和 Chromium 的貢獻者,標準編輯,也是經驗豐富的 Web 開發者。他的工作主要是在 Web 開發和瀏覽器 / 標準開發之間架起橋梁。

原文鏈接:

https://www.smashingmagazine.com/2022/02/web-frameworks-guide-part2/

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Web
    Web
    +關注

    關注

    2

    文章

    1257

    瀏覽量

    69368
  • 框架
    +關注

    關注

    0

    文章

    399

    瀏覽量

    17437
  • 編程
    +關注

    關注

    88

    文章

    3596

    瀏覽量

    93610
收藏 人收藏

    評論

    相關推薦

    五大Python Web框架詳解

    進行了擴展應用,提升了重用性且將功能分割到獨立的模塊中,而且提供了在線調試器,易于錯誤跟蹤!以上是2018年主流Python框架Web開發人員可能更感興趣一些,可以了解學習一!
    發表于 02-06 17:17

    Web框架使用哪些編程語言?

    如果你是做Web開發的,Web框架一定會很熟悉,框架Web架構開發中必不可少的工具,不僅可以提高開發效率,還能讓開發項目更成熟,并且可以提
    發表于 03-28 16:53

    主流web前端技術框架

    、強大的組件、單向響應的數據流,具有高效、靈活的性能,且代碼邏輯簡單,受到越來越多的人的關注和使用!以上目前Web開發常用的框架,每個框架都有其不同的特點,且功能都很強大,想從事Web
    發表于 03-28 16:56

    基于工作流技術的復合語義Web服務框架

    隨著Internet和Web應用的快速發展,Web應用模式及Web服務的異構和分散問題日益突出,如何復合繁復而龐大的Web服務群成了一項繁雜的工作。該文描述了一個復合語義
    發表于 03-31 10:01 ?16次下載

    基于Struts框架和Procedure的Web開發模式

    介紹基于MVC設計模式的Struts框架的組成和實現原理,總結該開發框架的應用特點和開發步驟。在分析和比較其他基于Struts開發模式特點的基礎上,提出基于Struts和存儲過程結合的Web
    發表于 04-23 10:16 ?79次下載

    基于Struts和Hibernate框架Web應用的設計與

    基于J2EE 平臺的框架技術是目前開發Web 應用的主流技術。其中,Struts 框架基于MVC 設計模式,清晰地劃分了控制部分、業務邏輯和視圖,實現了各層之間的解耦;而Hibernate 對JDBC 提供
    發表于 09-14 16:21 ?32次下載

    基于Web的自動化測試框架的研究

    根據web系統測試的特點,為提高軟件測試自動化腳本的可重用性,結合在實際項目中軟件自動化測試的實踐,提出基于Web的自動化測試框架(ACRAT)。分析了軟件自動化測試框架的優點
    發表于 11-07 15:58 ?0次下載
    基于<b class='flag-5'>Web</b>的自動化測試<b class='flag-5'>框架</b>的研究

    SSM框架Web應用開發中的設計與實現 pdf下載

    Web 應用的開發過程中,開發框架的選擇非常重要。一個好的開發框架能夠加速 Web 應用的開發速度,降低 開發成本,減少開發人員的工作量,同時能夠使
    發表于 01-29 09:47 ?2次下載

    Web服務組合匹配框架研究

    在現有服務發現方法中,單一考慮原子服務或服務組合的方式難以滿足用戶日益增長的需求。針對該問題,設計一個基于模型轉換的Web服務匹配框架。在服務發現過程中綜合考慮組合Web服務的執行過程信息和服務
    發表于 03-05 13:35 ?0次下載
    <b class='flag-5'>Web</b>服務組合匹配<b class='flag-5'>框架</b>研究

    現在流行的Web APP開發框架有哪些

    Web APP框架的開發旨在支持開發人員使用單一編程語言構建交互式應用程序。市場上推出了一系列框架,其框架結構各不相同。開發人員可以通過學習Web
    的頭像 發表于 12-29 09:50 ?1.2w次閱讀

    安利5個流暢自如的Python Web框架

    如今,可供選擇的Python web框架有不少,能幫助你更快更輕松地創建web應用。本文就將為大家介紹一些更現代、使用更廣泛的web框架。
    的頭像 發表于 07-02 17:15 ?2336次閱讀

    在micropython上搭建web框架web服務——新生代web框架:mpy-urouter

    大家好!之前我給 micropython 開發過一個名為 micro-route 的web框架,在使用的過程中發現這個框架在設計上有很多的缺陷,而且是經過一個星期的時間趕工出來的,代碼質量不太
    發表于 12-29 18:56 ?5次下載
    在micropython上搭建<b class='flag-5'>web</b><b class='flag-5'>框架</b>和<b class='flag-5'>web</b>服務——新生代<b class='flag-5'>web</b><b class='flag-5'>框架</b>:mpy-urouter

    聊聊PHP的web應用程序開發框架存在的漏洞有哪些

    簡單說下Yii 是一個高性能PHP的web 應用程序開發框架。通過一個簡單的命令行工具 yiic 可以快速創建一個 web 應用程序的代碼框架,開發者可以在生成的代碼
    的頭像 發表于 11-16 10:37 ?1726次閱讀

    Web框架替代方案分享(上)

    上周,我們從框架試圖解決哪些核心問題的角度出發,考察了使用框架的不同好處和代價,重點放在聲明性編程、數據綁定、反應性、列表和條件。今天,我們來看看能否在 Web 平臺上找到替代
    的頭像 發表于 03-20 14:51 ?473次閱讀

    Web框架替代方案分享(中)

    上周,我們從框架試圖解決哪些核心問題的角度出發,考察了使用框架的不同好處和代價,重點放在聲明性編程、數據綁定、反應性、列表和條件。今天,我們來看看能否在 Web 平臺上找到替代
    的頭像 發表于 03-20 14:51 ?526次閱讀