【前端知識體系-JS相關】組件化和React

来源:https://www.cnblogs.com/fecommunity/archive/2019/11/24/11922109.html
-Advertisement-
Play Games

說一下使用jQuery和使用框架的區別?說一下對MVVM的理解?說一下對組件化的理解?JSX的本質是什麼…… ...


1. 說一下使用jQuery和使用框架的區別?

  1. 數據和視圖的分離,(jQuery數據和視圖混在一起,代碼耦合)-------開放封閉原則
  2. 以數據驅動視圖(只關註數據變化,DOM操作被封裝)

2.說一下對MVVM的理解?

  1. 先說MVC:Model, View, Controller(主要用於後端)
  2. MVVM: Model, View, ViewModel[中間連接者,連接view和和model]
  3. 關於ViewModel

2.2.1 MVVM在React中對應關係


  • 1) M(odel):對應組件的方法或生命周期函數中實現的業務邏輯和this.state中保存的本地數據,如果React集成了redux +react-redux,那麼組件中的業務邏輯和本地數據可以完全被解耦出來單獨存放當做M層,如業務邏輯放在Reducer和Action中。
  • 2) V(iew)-M(odel):對應組件中的JSX,它實質上是Virtual DOM的語法糖。React負責維護 Virtual DOM以及對其進行diff運算,而React-dom 會把Virtual DOM渲染成瀏覽器中的真實DOM
  • 3) View:對應框架在瀏覽器中基於虛擬DOM生成的真實DOM(並不需要我們自己書寫)以及我們書寫的CSS
  • 4)綁定器:對應JSX中的命令以及綁定的數據,如className={ this.props.xxx }、{this.props.xxx}等等

2.2.2 MVVM的雙綁和單綁區別


  • 1) 一般,只有UI表單控制項才存在雙向數據綁定,非UI表單控制項只有單向數據綁定。
  • 2) 單向數據綁定是指:M的變化可以自動更新到ViewModel,但ViewModel的變化需要手動更新到M(通過給表單控制項設置事件監聽)
  • 3) 雙向數據綁定是指念:M的變化可以自動更新到ViewModel,ViewModel的變化也可以自動更新到M
  • 4) 雙向綁定 = 單向綁定 + UI事件監聽。雙向和單向只不過是框架封裝程度上的差異,本質上兩者是可以相互轉換的。
  • 5) 優缺點:在表單交互較多的情況下,單向數據綁定的優點是數據更易於跟蹤管理和維護,缺點是代碼量較多比較啰嗦,雙向數據綁定的優缺點和單向綁定正好相反。

3.說一下對組件化的理解?

  1. 組件的封裝
    • a. 視圖的封裝
    • b. 數據的封裝
    • c. 變化邏輯(數據驅動視圖變化,setState)
  2. 組件的復用
    • a. 使用props來傳遞數據(同一個組件傳遞不同飛數據)
    • b. 組件的復用(同一個組件使用不同的數據)

4.JSX的本質是什麼?

[!NOTE]

  1. JSX語法(標簽、JS表達式,判斷,迴圈,事件綁定)
  2. JSX是語法糖, 需要被解析成JS才能運行(h函數的使用)
  3. JSX是獨立的標準,可以被其他項目使用
   // 下麵的代碼實際執行流程:
    // JSX 代碼
    const user = {
        firstName : 'xiugang',
        lastName : 'zhang'
    }
    var profile = <div>
        <img src="a.jpg" className='profile'/>
        <h3>{[user.firstName, user.lastName].join(' ')}</h3>
    </div>

    // 解析結果(重點掌握),關鍵點:是使用了一個React.createElement來創建節點的
    var profile = React.createElement('div', null, [
        React.createElement('img', {src : 'a.jpg', className : 'profile'}),
        React.createElement('h3', null, [[user.firstName, user.lastName].join(' ')])
])

/* @jsx h*/
// 1. 使用插件:cnpm install babel-plugin-transform-react-jsx
// 2. 開始編譯JSX: babel --plugins transform-react-jsx demo.js
// 3. 可以自定義React.createElement變為一個h函數: /* @jsx h*/

5.JSX和VDOM的關係?

5.1 分析為何需要VDOM

  1. VDOM是React初次推廣開來的,結合JSX
  2. JSX就是模板渲染成HTML
  3. 初次渲染 + 修改state之後的re-render
  4. 正好符合VDOM的應用場景

    5.2 React.createElement和h函數

    5.3 何時patch?

  5. 初次渲染----
    js ReactDOM.render(<App/>, container)
  6. 會觸發patch(container, vnode)函數
  7. re-render-- setState
  8. 會觸發patch(vNode, newVNode)

    5.4 自定義組件的解析?

5.4.1 自定義組件的解析(TODOInput和TODOList組件的解析)

  1. ‘div’可以直接渲染即可,vdom可以實現
  2. TodoInput和TodoList是自定義組件(class),vdom不認識
  3. 因此Input和List定義的時候必須聲明render函數
  4. 根據props屬性初始化實例,然後執行實例的render函數
  5. render函數返回的還是vnode的對象
React.createElement(TodoInput, { addTitle: this.addTitle.bind(this) }),
    React.createElement(TodoList, { data: this.state.list })

    // 上面的代碼相當於是先去創建一個TodoList實例對象
    var list = new TodoList({ data: this.state.list });
    // 然後再去調用這個函數的render方法(返回的是一個JSX,然後對當前的這個JSX渲染為VDOM)
    var vnode = list.render();

6.說一下setState的過程?

    // 1. 每個組件實例,都有renderComponent方法
    class Component {
        constructor(){

        }

        // 每個組件都有這個函數
        renderComponent(){
            // 獲取上一次的vNode
            const prevVnode = this._vnode;

            // render函數只需之後,得到的還是一個新的node
            const newVnode = this.render();

            // 開始對比,找出差異
            patch(prevVnode, newVnode);

            // 更新node為最新的node
            this._vnode = newVnode;
        }
    }

    // 2. 執行renderComponent會重新執行實例的render方法
    // 3. render函數返回newVnode,然後拿到prevNode(也就是上次的vnode)----多次執行setState視圖最終也只會渲染一次
    // 4. 執行patch(preVnode, newVNode)

[!NOTE]

  1. setState通過一個隊列機制實現state更新,當執行setState時,會將需要更新的state很後放入狀態隊列,而不會立即更新this.state,隊列機制可以高效地批量更新state。如果不通過setState而直接修改this.state的值
  2. 那麼該state將不會被放入狀態隊列中。當下次調用setState並對狀態隊列進行合併時,就會忽略之前修改的state,造成不可預知的錯誤
  3. 同時,也利用了隊列機制實現了setState的非同步更新,避免了頻繁的重覆更新state

7.7. 闡述自己對React和Vue的認識?

7.7.1. 兩者的本質區別

  • vue本質是MVVM框架,由MVC發展而來
  • React本質是前端組件化框架,由後端組件化發展而來
  • 並不妨礙兩者都能實現相同的功能

    7.7.2. 模板的區別

  • vue-使用模板(最初由angular提出)
  • React-使用JSX
  • 模板語法上,我更傾向於JSX
  • 模板分離上,我更傾向於Vue
  • 模板應該和JS邏輯分離
  • “開放封閉原則”

    7.7.3. 組件化的區別

  • React本身就是組件化,沒有組件哈就不是React
  • vue也支持組件化,不過是在MVVM上的擴展
  • 查閱vue組件化的文檔
  • 組件化更適合選擇React

    7.7.4. 兩者的共同點

  • 都支持組件化
  • 都是數據驅動視圖

    7.7.5. 如何選擇

  • 國內使用,首推vue。文檔更易讀,易學,社區夠大
  • 如果團隊水平較高,推薦使用React,組件化和JSX


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

-Advertisement-
Play Games
更多相關文章
  • 堆疊(棧)上下文 (stack context) 由某個元素創建的一塊獨立區域,規定了該區域中的內容在Z軸上(z index )的排列的先後順序。(類似bfc) 創建堆疊(棧)上下文(stack context)的元素 1. 根元素(html) 2. 定位元素設置了z index!=auto(z i ...
  • 練習1:求數組中所有元素的和 var arr1 = [10, 20, 30, 40, 50]; var sum = 0; for (var i = 0; i < arr1.length; i++) { sum += arr1[i]; } console.log(sum); 練習2:求數組中所有元素的 ...
  • 列表樣式屬性 在 中有 種列表、無序列表和有序列表,在工作中無序列表比較常用,無序列表就是 標簽和 標簽組合成的稱之為無序列表,那什麼是有序列表呢?就是 標簽和 標簽組合成的稱之為有序列表,列表的基礎知識就簡單說明下,本章內容主要說明的是如何給列表設置樣式,若有不懂列表是什麼的園友筆者建議去 "W3 ...
  • for迴圈遍曆數組 要顯示數組中的每個數據,可以如下: var arr=[10,20,30,40,50]; //顯示數組中的每個數據 console.log(arr[0]); console.log(arr[1]); console.log(arr[2]); console.log(arr[3]); ...
  • 數組: 存儲一組有序的數據 數組的作用: 一次性存儲多個數據 數組的定義方式: 1.構造函數定義數組: var 數組名=new Array(); 2.字面量方式定義數組: var 數組名=[]; 以下數組的含義: var 數組名=new Array();空數組 var 數組名=new Array(值 ...
  • Javascript實現繼承的底層原理是什麼?你瞭解幾種方式實現JavaScript的繼承呢?不同方式實現繼承的優缺點是什麼? ...
  • 1、準備好js文件(我用的是谷歌瀏覽器) 這個文件是為了防止你的jQuery版本過高而不適配的問題 這是調用瀏覽器列印的js插件 2、引入js文件 1 <script src="js/jquery.jqprint-0.3.js"></script> 2 <script src="js/jquery- ...
  • Vue 中三要素的是什麼?Vue中如何解析模板?Vue中如何實現響應式的呢?說一下Vue的整體實現流程…… ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...