整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          8 種現代 JavaScript 響應式模式

          應性本質上是關于系統如何對數據變化作出反應,有不同類型的響應性。然而,在這篇文章中,我們關注的是響應性,即響應數據變化而采取行動。

          作為一名前端開發者,Pavel Pogosov 每天都要面對這個問題。因為瀏覽器本身是一個完全異步的環境。現代 Web 界面必須快速響應用戶的操作,這包括更新 UI、發送網絡請求、管理導航和執行各種其他任務。

          盡管人們常常將響應性與框架聯系在一起,Pavel Pogosov 認為通過純 JavaScript 實現響應性可以學到很多。所以,我們將自己編寫一些模式代碼,并研究一些基于響應性的原生瀏覽器 API。

          目錄

          • PubSub(發布-訂閱模式)
          • 自定義事件作為瀏覽器版本的 PubSub
          • 自定義事件目標
          • 觀察者模式
          • 使用 Proxy 的響應式屬性
          • 單個對象屬性和響應性
          • 使用 MutationObserver 的響應式 HTML 屬性
          • 使用 IntersectionObserver 的響應式滾動

          1. PubSub(發布-訂閱模式)

          class PubSub {
            constructor() {
              this.subscribers = {};
            }
          
            subscribe(event, callback) {
              if (!this.subscribers[event]) {
                this.subscribers[event] = [];
              }
          
              this.subscribers[event].push(callback);
            }
          
            // 向特定事件的所有訂閱者發布消息
            publish(event, data) {
              if (this.subscribers[event]) {
                this.subscribers[event].forEach((callback) => {
                  callback(data);
                });
              }
            }
          }
          
          const pubsub = new PubSub();
          
          pubsub.subscribe('news', (message) => {
            console.log(`訂閱者1收到了新聞:${message}`);
          });
          
          pubsub.subscribe('news', (message) => {
            console.log(`訂閱者2收到了新聞:${message}`);
          });
          
          // 向 'news' 事件發布消息
          pubsub.publish('news', '最新頭條新聞:...');
          
          // 控制臺日志輸出:
          // 訂閱者1收到了新聞:最新頭條新聞:...
          // 訂閱者2收到了新聞:最新頭條新聞:...
          
          

          一個常見的使用示例是 Redux。這款流行的狀態管理庫基于這種模式(或更具體地說,是 Flux 架構)。在 Redux 的上下文中,工作機制相當簡單:

          發布者:store 充當發布者。當一個 action 被派發時,store 會通知所有訂閱的組件狀態的變化。 訂閱者:應用程序中的 UI 組件是訂閱者。它們訂閱 Redux store 并在狀態變化時接收更新。

          自定義事件作為瀏覽器版本的 PubSub

          瀏覽器通過 CustomEvent 類和 dispatchEvent 方法提供了一個用于觸發和訂閱自定義事件的 API。后者不僅能讓我們觸發事件,還能附加任何想要的數據。

          const customEvent = new CustomEvent('customEvent', {
            detail: '自定義事件數據', // 將所需數據附加到事件
          });
          
          const element = document.getElementById('.element-to-trigger-events');
          
          element.addEventListener('customEvent', (event) => {
            console.log(`訂閱者1收到了自定義事件:${event.detail}`);
          });
          
          element.addEventListener('customEvent', (event) => {
            console.log(`訂閱者2收到了自定義事件:${event.detail}`);
          });
          
          // 觸發自定義事件
          element.dispatchEvent(customEvent);
          
          // 控制臺日志輸出:
          // 訂閱者1收到了自定義事件:自定義事件數據
          // 訂閱者2收到了自定義事件:自定義事件數據
          
          

          自定義事件目標

          如果你不想在全局 window 對象上分派事件,可以創建你自己的事件目標。

          通過擴展原生 EventTarget 類,你可以向其新實例分派事件。這確保你的事件僅在新類本身上觸發,避免了全局傳播。此外,你可以直接將處理程序附加到這個特定實例上。

          class CustomEventTarget extends EventTarget {
            constructor() {
              super();
            }
          
            // 觸發自定義事件的自定義方法
            triggerCustomEvent(eventName, eventData) {
              const event = new CustomEvent(eventName, { detail: eventData });
              this.dispatchEvent(event);
            }
          }
          
          const customTarget = new CustomEventTarget();
          
          // 向自定義事件目標添加事件監聽器
          customTarget.addEventListener('customEvent', (event) => {
            console.log(`自定義事件收到了數據:${event.detail}`);
          });
          
          // 觸發自定義事件
          customTarget.triggerCustomEvent('customEvent', '你好,自定義事件!');
          
          // 控制臺日志輸出:
          // 自定義事件收到了數據:你好,自定義事件!
          
          

          觀察者模式

          觀察者模式與 PubSub 非常相似。你訂閱 Subject,然后它通知其訂閱者(觀察者)關于變化,使他們能夠做出相應的反應。這種模式在構建解耦和靈活的架構中發揮了重要作用。

          class Subject {
            constructor() {
              this.observers = [];
            }
          
            addObserver(observer) {
              this.observers.push(observer);
            }
          
            // 從列表中移除觀察者
            removeObserver(observer) {
              const index = this.observers.indexOf(observer);
          
              if (index !== -1) {
                this.observers.splice(index, 1);
              }
            }
          
            // 通知所有觀察者關于變化
            notify() {
              this.observers.forEach((observer) => {
                observer.update();
              });
            }
          }
          
          class Observer {
            constructor(name) {
              this.name = name;
            }
          
            // 通知時調用的更新方法
            update() {
              console.log(`${this.name} 收到了更新。`);
            }
          }
          
          const subject = new Subject();
          const observer1 = new Observer('觀察者1');
          const observer2 = new Observer('觀察者2');
          
          // 將觀察者添加到主體
          subject.addObserver(observer1);
          subject.addObserver(observer2);
          
          // 通知觀察者關于變化
          subject.notify();
          
          // 控制臺日志輸出:
          // 觀察者1 收到了更新。
          // 觀察者2 收到了更新。
          
          

          使用 Proxy 的響應式屬性

          如果你想對對象的變化做出反應,Proxy 是一個好方法。它讓我們在設置或獲取對象字段的值時實現響應性。

          const person = {
            name: 'Pavel',
            age: 22,
          };
          
          const reactivePerson = new Proxy(person, {
            // 攔截設置操作
            set(target, key, value) {
              console.log(`將 ${key} 設置為 ${value}`);
              target[key] = value;
          
              // 表示設置值是否成功
              return true;
            },
            // 攔截獲取操作
            get(target, key) {
              console.log(`獲取 ${key}`);
          
              return target[key];
            },
          });
          
          reactivePerson.name = 'Sergei'; // 將 name 設置為 Sergei
          console.log(reactivePerson.name); // 獲取 name: Sergei
          
          reactivePerson.age = 23; // 將 age 設置為 23
          console.log(reactivePerson.age); // 獲取 age: 23
          
          

          單個對象屬性和響應性

          如果你不需要跟蹤對象中的所有字段,可以使用 Object.defineProperty 或一組 Object.defineProperties 來選擇特定的一個或幾個。

          const person = {
            _originalName: 'Pavel', // 私有屬性
          }
          
          Object.defineProperty(person, 'name', {
            get() {
              console.log('獲取屬性 name')
              return this._originalName
            },
            set(value) {
              console.log(`將屬性 name 設置為值 ${value}`)
              this._originalName = value
            },
          })
          
          console.log(person.name) // '獲取屬性 name' 和 'Pavel'
          person.name = 'Sergei' // 將屬性 name 設置為值 Sergei
          
          

          使用 MutationObserver 的響應式 HTML 屬性

          在 DOM 中實現響應性的一種方法是使用 MutationObserver。其 API 允許我們觀察目標元素及其子元素的屬性變化和文本內容變化。

          function handleMutations(mutationsList, observer) {
            mutationsList.forEach((mutation) => {
              // 觀察到的元素的一個屬性發生了變化
              if (mutation.type === 'attributes') {
                console.log(`屬性 '${mutation.attributeName}' 更改為 '${mutation.target.getAttribute(mutation.attributeName)}'`);
              }
            });
          }
          
          const observer = new MutationObserver(handleMutations);
          const targetElement = document.querySelector('.element-to-observe');
          
          // 開始觀察目標元素
          observer.observe(targetElement, { attributes: true });
          
          

          使用 IntersectionObserver 的響應式滾動

          IntersectionObserver API 允許對目標元素與另一個元素或視口區域的交集做出反應。

          function handleIntersection(entries, observer) {
            entries.forEach((entry) => {
              // 目標元素在視口中
              if (entry.isIntersecting) {
                entry.target.classList.add('visible');
              } else {
                entry.target.classList.remove('visible');
              }
            });
          }
          
          const observer = new IntersectionObserver(handleIntersection);
          const targetElement = document.querySelector('.element-to-observe');
          
          // 開始觀察目標元素
          observer.observe(targetElement);
          
          

          感謝閱讀!

          這個適合初學者的指南中,你將學習如何創建一個響應式電子郵件模板。你將跟隨逐步說明以及代碼片段設計一個在任何設備上都看起來很棒的電子郵件模板。

          這個項目非常適合渴望掌握電子郵件設計基礎的新手!

          (本文視頻講解:java567.com)

          何讓你的網站在其出現的任何設備和屏幕尺寸上能夠完美的呈現?響應式設計完美的解決了這一難題,作為現在的網頁設計師都應該了解響應式網頁設計的原則。而對于剛步入網頁設計的新手設計師,如果你還不了解什么是響應式設計?如何制作響應式頁面?這篇文章為大家提供了12個基礎的響應式網頁設計的教程,結尾還附上了個人最喜歡的3款響應式網頁設計的工具, 輕松帶你入門。

          1. What is Responsive Web Design?

          https://smallbiztrends.com/2013/05/what-is-responsive-web-design.html

          隨著智能手機,平板電腦以及其他移動設備的增長,越來越多人使用小屏幕來查看和閱讀網頁信息。響應式網頁設計完美的滿足了這一點,它使得用戶能夠在各種設備下查看網頁,并且保持良好的網頁可讀性。并且, 在2018年4月Google宣布了移動優先索引的原則,所以響應式網頁設計已經是一個必須。這篇文章是一篇新手文章,對于還不懂什么是響應式設計的設計師一個很好的開篇解釋。

          2. Responsive Web Design Tutorial and Explanation

          https://www.youtube.com/watch?v=BIz02qY5BRA

          如果你對響應式網頁設計的概念完全陌生,又不想看冗長的文章,那么這個視頻絕對是你的不二之選。本視頻解釋了什么是響應式網頁設計,結合具體的例子介紹讓你更加了解,當然最重要的是視頻中詳細的介紹如何通過寫代碼去設計一個響應式網頁布局。

          3. Responsive Web Design with HTML&CSS

          https://learn.shayhowe.com/advanced-html-css/responsive-web-design/

          本教程解釋了響應式設計和自適應設計的區別,并且詳細介紹如何使用HTML和CSS寫響應式網頁,以及介紹媒體查詢和mobile-first的使用。

          4. Responsive Data Table Roundup

          https://css-tricks.com/responsive-data-table-roundup/

          數據表是HTML的重要組成部分,雖然它們過去經常被用于布局,但現在它們主要是用于標記數據。本文具體介紹了如何制作響應式數據表,文章包含多個demo可供參考。

          5. Bootstrap Responsive Web Design Tutorial For Beginners

          https://www.udemy.com/bootstrap-responsive-web-design-tutorial-for-beginners/

          Bootstrap是最受歡迎的HTML,CSS和JS框架之一,用于在Web上開發響應式,移動友好的項目。本教程幫組你如何使用bootstrap框架來開發響應式網頁,你可以從中學到:

          使用Twitter bootstrap制作響應式網頁

          了解bootstrap組件的使用

          學習要求:

          對Html有基本理解

          希望擴展知識的Web Masters和Web開發人員

          價格:.99

          6. How to Make Responsive WordPress Websites (With Themes)

          https://business.tutsplus.com/articles/how-to-make-responsive-websites--cms-29942

          在構建網站時,使用響應式設計不再只是一種選擇,它是必須。無論你的用戶使用哪種設備進行查看和瀏覽網頁內容,響應式網站設計都能讓你的網站看起來很棒。對于許多企業來說,WordPress是個很好的選擇,鑒于它的靈活性和易于使用。從本教程中,你可以學習到如何使用響應式WordPress模板來創建你的網站以及如何選擇響應式WordPress主題。

          7. Responsive Web Design - Introduction

          https://www.w3schools.com/css/css_rwd_intro.asp

          W3schools是個代碼學習的網站,你可以在這里找到你想要學習的一切代碼知識。當然這里提供的響應式網頁設計的教程是非常全面且具體的。你可以學習到:

          RWD視口

          RWD網格視圖

          RWD媒體查詢

          RWD圖像

          RWD視頻

          RWD框架

          RWD模板

          8. 10 Best Free Responsive HTML5 Web Templates in 2018

          https://www.mockplus.com/blog/post/free-responsive-html5-web-design-templates

          本文為制作HTML響應式設計的設計師提供了最佳的10個模板,讓你能夠輕松應用。

          9. The Ultimate Responsive Web Design Tutorials for Beginners

          https://www.youtube.com/watch?v=YBK_1WrM294

          Chris Converse在本教程中分享自己的專業技術,幫助初學者如何建立一個響應式網站。Chris還展示了如何使用CSS加載圖像,重新定位導航欄以便在移動設備上更好地查看,以及如何通過提供多個版本的banner圖形和其他圖像來縮短小屏幕的下載時間。另外,你還能了解如何使用CSS 媒體查詢替換Retina顯示器的高分辨率版本的圖形。這篇教程可以說是最終極的響應式網頁設計教程。

          10. Build An HTML5 Website With A Responsive Layout

          https://www.youtube.com/watch?v=Wm6CUkswsNw

          這個視頻教程對于新手來說是一個很好的學習響應式網頁設計的教程,教大家如何創建一個實例的HTML5的響應式網頁。視頻還將談論如何使用HTML語義化標簽,諸如,頁面和頁腳。

          11. Responsive Web Design Tutorial

          https://www.youtube.com/watch?v=3tLb3i7GB38&list=PL4cUxeGkcC9g9Vh9MAA-XKnfJsWZnPZFw

          本系列教程涵蓋了12個學習視頻,可以說是一個很完整的響應式網頁設計的教程。從介紹什么是響應式網頁設計到如何創建響應式網頁,你可以學習到你想要了解響應式網頁的一切知識點。

          12. The pro's guide to responsive web design

          https://www.creativebloq.com/rwd/pros-guide-responsive-web-design-71515692

          我們都知道響應式設計對于每一個網站都是必須的,但在實踐中,我們也知道了它并不是那么容易實現的技術。本文集合了許多優秀的網頁設計師的建議,幫助大家如何從基礎知識上升到高層次的響應式網頁設計。

          響應式網頁設計的工具

          Bootstrap

          Bootstrap是美國Twitter公司的設計師Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript 開發的簡潔、直觀、強悍的前端開發框架,使得 Web 開發更加快捷。它也是最受歡迎的HTML、CSS 和 JS 框架,用于開發響應式布局、移動設備優先的web項目。

          Mockplus

          Mockplus是一款在線協作設計工具,允許你創建交互式網頁和原型。這個工具很強大,可以快速的輸出交互網頁,為用戶提供包含通用設計的工具包和組件庫。

          Responsinator

          這是一個響應式網頁測試的工具,只要輸入網站的URL就能輕松的知道你的網站是否友好。并且,你還可以直接與頁面進行交互,點擊頁面鏈接。

          總結

          響應式布局可以為不同終端的用戶提供更加舒適的界面和更好的用戶體驗,而且隨著目前各種移動設備的普及,用“大勢所趨”來形容也不為過。新手網頁設計師必須掌握這一技術來實現更好的網站用戶體驗,以上12個教程以及3個響應式網頁設計工具希望可以輕松帶你入門。


          主站蜘蛛池模板: 国产品无码一区二区三区在线蜜桃| 在线观看国产区亚洲一区成人| 亚洲一区二区在线免费观看| 亚洲AV无码一区二区三区国产| 综合一区自拍亚洲综合图区| 亚洲日韩AV一区二区三区中文| 亚洲欧美成人一区二区三区 | 中文字幕精品一区| 精品一区二区三区AV天堂| 精品一区二区久久久久久久网精| 亚洲AV无码一区二区三区鸳鸯影院| 中文字幕一区在线观看视频| 国产一区二区不卡老阿姨| 国产精品一区二区无线| 国产suv精品一区二区6| 国产福利一区二区在线视频 | 一区二区三区无码被窝影院| 日韩一区二区三区射精| 在线精品自拍亚洲第一区| 日本一区二区三区免费高清在线| 日亚毛片免费乱码不卡一区 | 果冻传媒董小宛一区二区| 变态拳头交视频一区二区| 亚洲av一综合av一区| 久久精品免费一区二区| 国产小仙女视频一区二区三区| | 国产精品综合一区二区三区| 视频一区二区精品的福利| 91久久精一区二区三区大全| 奇米精品视频一区二区三区 | 亚洲一区爱区精品无码| 日韩爆乳一区二区无码| 无码午夜人妻一区二区不卡视频| 精品视频在线观看一区二区三区| 台湾无码AV一区二区三区| 亚洲男女一区二区三区| 国产一区二区视频免费| 国产在线无码一区二区三区视频| 国产精品自拍一区| 精品不卡一区中文字幕|