Vue.js常被提及的面試題

来源:https://www.cnblogs.com/h5hu/archive/2019/07/23/11234797.html
-Advertisement-
Play Games

對於MVVM的理解 由 Model、View、ViewModel 三部分構成,由MVC衍生。 Model: 層代表數據模型,也可以在Model中定義數據修改和操作的業務邏輯, View: 代表UI 組件,它負責將數據模型轉化成UI 展現出來, ViewModel: 是一個同步View 和 Model ...


對於MVVM的理解

 

ModelViewViewModel 三部分構成,由MVC衍生。

 

Model: 層代表數據模型,也可以在Model中定義數據修改和操作的業務邏輯,

 

View: 代表UI 組件,它負責將數據模型轉化成UI 展現出來,

 

ViewModel: 是一個同步View 和 Model的對象。

 

在MVVM架構下,View 和 Model 之間並沒有直接的聯繫,而是通過ViewModel進行交互,Model 和 ViewModel 之間的交互是雙向的, 因此View 數據的變化會同步到Model中,而Model 數據的變化也會立即反應到View 上。 (註意)

 

ViewModel 通過雙向數據綁定把 View 層和 Model 層連接了起來,而View 和 Model 之間的同步工作完全是自動的,無需人為干涉,因此開發者只需關註業務邏輯,不需要手動操作DOM, 不需要關註數據狀態的同步問題,複雜的數據狀態維護完全由 MVVM 來統一管理

 

Vue.js雙向數據原理

 

Vue.js 可以說是MVVM 架構的最佳實踐,專註於 MVVM 中的 ViewModel,不僅做到了數據雙向綁定,而且也是一款相對來比較輕量級的JS 庫,API 簡潔,很容易上手。

 

Vue.js 是採用 Object.defineProperty 的 getter 和 setter,並結合觀察者模式來實現數據綁定的。當把一個普通 Javascript 對象傳給 Vue 實例來作為它的 data 選項時,Vue 將遍歷它的屬性,用 Object.defineProperty 將它們轉為 getter/setter。用戶看不到 getter/setter,但是在內部它們讓 Vue 追蹤依賴,在屬性被訪問和修改時通知變化註意:據悉vue3.0將採用Proxy替代Object.defineProperty

 

 

圖的解析:

 

Observer :數據監聽器,能夠對數據對象的所有屬性進行監聽,如有變動可拿到最新值並通知訂閱者,內部採用Object.defineProperty的getter和setter來實現 。

 

Compile  :指令解析器,它的作用對每個元素節點的指令進行掃描和解析,根據指令模板替換數據,以及綁定相應的更新函數 。

 

Watcher  :訂閱者,作為連接 Observer 和 Compile 的橋梁,能夠訂閱並收到每個屬性變動的通知,執行指令綁定的相應回調函數 。

 

Dep :消息訂閱器,內部維護了一個數組,用來收集訂閱者(Watcher),數據變動觸發notify 函數,再調用訂閱者的 update 方法 。

 

執行過程:

 

當執行 new Vue() 時,Vue 就進入了初始化階段,一方面Vue 會遍歷 data 選項中的屬性,並用 Object.defineProperty 將它們轉為 getter/setter,實現數據變化監聽功能;另一方面,Vue 的指令編譯器Compile 對元素節點的指令進行掃描和解析,初始化視圖,並訂閱 Watcher 來更新視圖, 此時Wather 會將自己添加到消息訂閱器中(Dep),初始化完畢。

 

當數據發生變化時,Observer 中的 getter 方法被觸發(註意這裡觸發什麼),getter 會立即調用Dep.notify(),Dep 開始遍歷所有的訂閱者,並調用訂閱者的 update 方法,訂閱者收到通知後對視圖進行相應的更新。同理當表單輸入內容發生變化時, 就會觸發setter,watcher監聽機制就會執行, watcher通知Vue生成新的VDOM樹,再通過render函數進行渲染,生成真實DOM 。

 

通過 Object.defineProperty 實現見簡單的雙向數據綁定:

 

<body>
    <div id="demo"></div>
    <input type="text" id="inp">
</body>
<script>
    let obj = {};
    let demo = document.querySelector('#demo');
    let inp = document.querySelector('#inp');
    Object.defineProperty(obj,'name',{
        get : () => {
            return inp.value;
        },
        set : (newVal) => {//當該屬性被賦值的時候觸發
            inp.value  = newVal;
            demo.innerHTML = newVal;
        }
    });
    inp.addEventListener('input',(e) => {
        // 給obj的name屬性賦值,進而觸發該屬性的set方法
        obj.name = e.target.value;
    })
    obj.name = 'huqinggui';//在給obj設置name屬性的時候,觸發了set這個方法
</script>

 

為什麼vue3.0要用Proxy替代Object.defineProperty 實現雙向數據綁定

 

替換不是因為不好,是因為有更好的方法使用效率更高


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天使用sql developer 新建連接資料庫測試時,有”狀態: 失敗 -測試失敗: Listener refused the connection with the following error:ORA-12514, TNS:listener does not currently know ...
  • 1.停庫[oracle@testdb ~]$ sqlplus / as sysdbaSQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> exit 2.停監聽[oracle@ ...
  • 1. 需求描述 觀察MongoDB的啟動Log,會看到一個關於 NUMA 的警告 和 優化建議 那麼我們是不是要調整下Linux的系統配置?首先我們先補充下基本知識。 2.相關知識介紹 2.1 NUMA和SMP NUMA和SMP是兩種CPU相關的硬體架構。 SMP (對稱多處理器結構: Symmet ...
  • 一、多表查詢 # 創建部門表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept (NAME) VALUES ('開發部'),('市場部'),('財務部'); # 創建員 ...
  • 步驟其實很簡單,一共三步,但是每一步都需要完成,步驟如下: 打開控制面板或騰訊軟體管家等執行常規的卸載操作。 找到SDK的安裝目錄手動刪除SDK。 進入“C:\Users\<你的用戶名下>”目錄下,手動刪除".android"、".AndroidStudioX.X"、".gradle"目錄(比如我登 ...
  • 1.截取字元串abcdace的acealert('abcdace'.substring(4)); 2.規避javascript多人開發函數重名問題命名空間封閉空間js模塊化mvc(數據層、表現層、控制層)seajs變數轉換成對象的屬性對象化 3.javascript面向對象中繼承實現function ...
  • 實例: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>靈_e夜</title> 6 </head> 7 <body> 8 9 <h1>我的第一個標題</h1> 10 11 <p>我的第一個段落。</p> 1 ...
  • 1.常量 ES5沒有定義聲明常量的方式,ES6標準中引入了新的關鍵字const來定義常量。 常量必須給初始值; 常量不能在同一作用域內重新定義或賦值; 2.塊級作用域 JS中作用域有:全局作用域、函數作用域 ES6中新增了塊級作用域。 塊作用域由 { } 包括,if語句和for語句裡面的{ }就屬於 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...