React 第三十章 React 和 Vue 描述頁面的區別

面試題:React 和 Vue 是如何描述 UI 界面的?有一些什么樣的區別?
標準且淺顯的回答:
React 中使用的是 JSX,Vue 中使用的是模板來描述界面

前端領域經過長期的發展,目前有兩種主流的描述 UI 的方案:

  • JSX
  • 模板

JSX 歷史來源

JSX 最早起源于 React 團隊。在 React 中所提供的一種類似于 XML 的 ES 語法糖:

const element = <h1>Hello</h1>

經過 Babel 編譯之后,就會變成:

// React v17 之前
var element = React.createElement("h1", null, "Hello");// React v17 之后
var jsxRuntime = require("react/jsx-runtime");
var element = jsxRuntime.jsx("h1", {children: "Hello"});

無論是 17 之前還是 17 之后,執行了代碼后會得到一個對象:

{"type": "h1","key": null,"ref": null,"props": {"children": "Hello"},"_owner": null,"_store": {}
}

這個其實就是大名鼎鼎的虛擬 DOM。

React 團隊認為,UI 本質上和邏輯是有耦合部分的,例如:

  • 在 UI 上面綁定事件
  • 數據變化后通過 JS 去改變 UI 的樣式或者結構

作為一個前端工程師,JS 是用得最多,所以 React 團隊思考屏蔽 HTML,整個都用 JS 來描述 UI。因為這樣做的話,可以讓 UI 和邏輯配合得更加緊密,所以最終設計出來了類 XML 形式的 JS 語法糖

由于 JSX 是 JS 的語法糖(本質上就是 JS),因此可以非常靈活的和 JS 語法組合使用,例如:

  • 在 if 或者 for 當中使用 jsx
  • 將 jsx 賦值給變量
  • 將 jsx 當作參數來傳遞
  • 在一個函數中返回一段 jsx

示例代碼

function App({isLoading}){if(isLoading){return <h1>loading...</h1>}return <h1>Hello World</h1>;
}

這種靈活性就使得 jsx 可以輕松的描述復雜的 UI,如果和邏輯配合,還可以描述出復雜 UI 的變化。

使得 React 社區的早期用戶可以快速實現各種復雜的基礎庫,豐富社區生態。又由于生態的豐富,慢慢吸引了更多的人來參與社區的建設,從而源源不斷的形成了一個正反饋。

模板的歷史來源

模板的歷史就要從后端說起。

在早期前后端未分離的時候,最流行的方案就是使用模板引擎。模板引擎可以看作是在正常的 HTML 上面進行挖坑(不同的模板引擎語法不一樣),挖了坑之后。服務器端會將數據填充到挖了坑的模板里面,生成對應的 html 頁面返回給客戶端。

image-20211103140631869

所以在那個時期前端人員的工作,主要是 html、css 和一些簡單的 js 特效(輪播圖、百葉窗…)。寫好的 html 是不能直接用的,需要和后端確定用的是哪一個模板引擎,接下來將自己寫好的 html 按照對應模板引擎的語法進行挖坑

image-20211103143319523

不同的后端技術對應的有不同的模板引擎,甚至同一種后端技術,也會對應很多種模板引擎,例如:

  • JavaJSP、Thymeleaf、Velocity、Freemarker
  • PHPSmarty、Twig、HAML、Liquid、Mustache、Plates
  • PythonpyTenjin、Tornado.template、PyJade、Mako、Jinja2
  • node.jsJade、Ejs、art-template、handlebars、mustache、swig、doT

模板引擎代碼片段

  • twig 模板引擎
基本語法
{% for user in users %}* {{ user.name }}
{% else %}No users have been found.
{% endfor %}指定布局文件
{% extends "layout.html" %}
定義展示塊
{% block content %}Content of the page...
{% endblock %}
  • blade 模板引擎
<html><head><title>應用程序名稱 - @yield('title')</title></head><body>@section('sidebar')這是 master 的側邊欄。@show<div class="container">@yield('content')</div></body>
</html>
  • EJS 模板引擎
<h1><%=title %>
</h1>
<ul><% for (var i=0; i<supplies.length; i++) { %><li><a href='supplies/<%=supplies[i] %>'><%= supplies[i] %></a></li><% } %>
</ul>

這些模板引擎對應的模板語法就和 Vue 里面的模板非常的相似。

現在隨著前后端分離開發的流行,已經沒有再用模板引擎的模式了,后端開發人員只需要書寫數據接口即可。但是如果讓一個后端人員來開前端的代碼,那么 Vue 的模板語法很明顯對于后端開發人員來講要更加親切一些。

最后我們做一個總結,雖然現在前端存在兩種方式:JSX 和模板的形式都可以描述 UI,但是出發點是不同

  • 模板語法的出發點是,既然前端框架使用 HTML 來描述 UI,那么我們就擴展 HTML。讓 HTML 種能夠描述一定程度的邏輯,也就是“從 UI 出發,擴展 UI,在 UI 中能夠描述邏輯”。

  • JSX 的出發點,既然前端使用 JS 來描述邏輯,那么就擴展 JS,讓 JS 也能描述 UI,也就是“從邏輯出發,擴展邏輯,描述 UI”。

這兩者雖然都可以描述 UI,但是思路或者說方向是完全不同的,從而造成了整體框架架構上面也是不一樣的。

真題解答

題目:React 和 Vue 是如何描述 UI 界面的?有一些什么樣的區別?

參考答案

在 React 中,使用 JSX 來描述 UI。因為 React 團隊認為UI 本質上與邏輯存在耦合的部分,作為前端工程師,JS 是用的最多的,如果同樣使用 JS 來描述 UI,就可以讓 UI 和邏輯配合的更密切。

使用 JS 來描述頁面,可以更加靈活,主要體現在:

  • 在 if 語句和 for 循環中使用 JSX
  • 將 JSX 賦值給變量
  • 可以把 JSX 當作參數傳入
  • 在函數中返回 JSX

而模板語言的歷史則需要從后端說起。早期在前后端未分離時代,后端有各種各樣的模板引擎,其本質是擴展了 HTML,在 HTML 中加入邏輯相關的語法,之后在動態的填充數據進去。
如果單看 Vue 中的模板語法,實際上和后端語言中的各種模板引擎是非常相似的。

總結起來就是:

模板語法的出發點是,既然前端框架使用 HTML 來描述 UI,那么就擴展 HTML 語法,使它能夠描述邏輯,也就是“從 UI 出發,擴展 UI,在 UI 中能夠描述邏輯”。

而 JSX 的出發點是,既然前端使用 JS 來描述邏輯,那么就擴展 JS 語法,讓它能夠描述 UI,也就是“從邏輯出發,擴展邏輯,描述 UI”。

雖然這兩者都達到了同樣的目的,但是對框架的實現產生了不同的影響。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11882.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11882.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11882.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Q1季度電飯煲家電行業線上市場(京東天貓淘寶)銷售數據排行榜

鯨參謀監測的2024年Q1季度線上電商平臺&#xff08;天貓淘寶京東&#xff09;電飯煲家電銷售數據已出爐&#xff01; 今年Q1季度&#xff0c;電飯煲銷售成績不如預期。根據鯨參謀數據顯示&#xff0c;今年Q1季度在線上電商平臺&#xff08;淘寶天貓京東&#xff09;電飯煲銷量…

三種有效方法:快速將視頻格式轉換mp4格式

在當今數字化時代&#xff0c;視頻文件的格式多種多樣&#xff0c;而將視頻轉換為MP4格式是一種常見的需求。MP4格式具有廣泛的兼容性&#xff0c;適用于多種設備和平臺&#xff0c;因此經常被選擇作為視頻文件的輸出格式。 無論是為了在移動設備上觀看視頻&#xff0c;還是為…

照妖鏡api接口,查詢旺旺的降權、黑號舉報數據(全網實時更新)

照妖鏡api接口&#xff0c;查詢旺旺的降權、黑號舉報數據&#xff08;全網實時更新&#xff09; 照妖鏡查號功能說明&#xff1a; 1.照妖鏡查號功能的打標信息為商家主動共享&#xff0c;不對相關使用效果或糾紛承擔責任&#xff1b; 2.本功能于查詢互聯網用戶防止電信詐騙&…

NSS【web】刷題

[SWPUCTF 2021 新生賽]jicao 類型&#xff1a;PHP、代碼審計、RCE 主要知識點&#xff1a;json_decode()函數 json_decode()&#xff1a;對JSON字符串解碼&#xff0c;轉換為php變量 用法&#xff1a; <?php $json {"ctf":"web","question"…

YOLOV8實戰-和平精英敵我檢測

YOLOV8實戰&#xff0c;從環境配置、數據準備、數據標注、模型訓練、模型導出到源碼分享 前言&#xff1a;效果展示圖片展示視頻展示 簡介&#xff1a;**【YOLOV8是啥&#xff1f;】****【YOLOV8能干啥&#xff1f;有啥應用場景&#xff1f;】** 一、環境準備1、新建一個虛擬環…

多讀書,多鍛煉,勇敢點,去面對,去解決

這些建議都是非常積極和有益的&#xff0c;它們涵蓋了身心健康和個人成長的重要方面。以下是對這些建議的詳細解釋&#xff1a; 多讀書&#xff1a; 拓寬視野&#xff1a;書籍是知識的海洋&#xff0c;通過閱讀&#xff0c;我們可以接觸到各種各樣的思想、文化和經驗&#xff0…

“webpack-dev-server --config build/webpack.dev.conf.js” 請問這個問題要如何修復

解決方案 修改部署方式&#xff1a; 使用 webpack 來打包你的項目&#xff0c;生成靜態文件。在生產環境中&#xff0c;使用 Nginx 或其他 HTTP 服務器來提供服務&#xff0c;而不是使用 webpack-dev-server。 Dockerfile 調整&#xff1a; 確保 Dockerfile 中使用的命令是用于…

ArcGIS Maps :在Vue3中加載ArcGIS地圖

Vue3中使用ArcGIS Maps SDK for JavaScript的步驟 一、創建 Vue 3 項目 1、新建ArcGISAPIProject文件夾&#xff0c;并用vscode打開 2、打開終端&#xff0c;在終端中輸入npm create vitelatest項目名稱vite-vue3-arcgis,選擇vue框架&#xff0c;并選中JavaScript語音創建項目…

Linux中的網絡隔離功能 netns

Network Namespace&#xff08;netns&#xff09; 是Linux內核提供的一項實現網絡隔離的功能&#xff0c;它能隔離多個不同的網絡空間&#xff0c;并且各自擁有獨立的網絡協議棧。通過 namespace 可以隔離容器的進程 PID、文件系統掛載點、主機名等多種資源&#xff0c;它可以為…

水利行業工程設計資質標準

甲級資質&#xff1a; 具有獨立企業法人資格。社會信譽良好&#xff0c;注冊資本不少于600萬元人民幣。企業完成過的工程設計項目應滿足所申請行業主要專業技術人員配備表中對工程設計類型業績考核的要求&#xff0c;且要求考核業績的每個設計類型的大型項目工程設計不少于1項…

vscode調試Electron+ts

調試Electronjs 調試Electronjs: https://www.electronjs.org/zh/docs/latest/tutorial/debugging-vscode 調試Electronts 首先看一下&#xff0c;我的目錄結構。目錄結構決定了launch.json中的路徑部分。我將在項目根目錄下進行調試&#xff0c;項目根目錄下包含electron代碼…

探索QChart:Qt中的數據可視化藝術

目錄標題 1. QChart概述2. 創建QChart對象3. 添加數據系列&#xff08;Series&#xff09;4. 定制圖表外觀5. 交互與動畫6. 圖表布局與管理7. 實例代碼與解析8. 總結 在數字化的世界里&#xff0c;數據是新的石油。然而&#xff0c;原始數據本身往往難以理解&#xff0c;數據可…

數據可視化(十一):Pandas餐飲信息表分析——交叉表、離群點分析,多維分析等高級操作

Tips&#xff1a;"分享是快樂的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不僅有知識的海洋&#x1f30a;&#xff0c;還有滿滿的正能量加持&#x1f4aa;&#xff0c;快來和我一起分享這份快樂吧&#x1f60a;&#xff01; 喜歡我的博客的話&#xff0c;記得…

golang創建式設計模式------單例模式

目錄導航 1.單例模式1)什么是單例模式 2)使用場景3)實現方式1.懶漢式單例模式2.餓漢式3.雙重檢查式4.sysc.Once式 4)實踐案例5)優缺點分析 1.單例模式 1)什么是單例模式 單例模式(Singleton Pattern)是一種常用的設計模式。單例模式的類提供了一種訪問其唯一對象的方法&#…

RAG系列論文

檢索增強模型&#xff1a; 提出Atlas &#xff1a;預訓練檢索增強模型 Few-shot Learning with Retrieval Augmented Language Models 鏈接 根據輸入問題的不同&#xff0c;挑選合適的提示詞 Learning To Retrieve Prompts for In-Context Learning 鏈接 RAG&#xff1a; M…

【數據結構】線性表--順序表(二)

文章目錄 1、什么是線性表2、線性表的基本操作3、順序表3.1、順序表的定義3.2、順序表的實現方式&#xff1a;靜態分配3.3、順序表的實現方式&#xff1a;動態分配3.4、順序表的特點3.5、順序表的初始化與插入操作3.6、順序表的刪除與查詢 1、什么是線性表 ? 線性表是具有相同…

【Python快速上手(二十二)】

目錄 Python快速上手&#xff08;二十二&#xff09;Python3 使用數據庫-pymysql1. 創建數據庫連接2. 創建數據表3. 插入數據4. 查詢數據5. 使用 WHERE 條件語句6. 排序7. 刪除記錄8. 更新表數據9. 刪除表10.異常處理總結 Python快速上手&#xff08;二十二&#xff09; Pytho…

通過EXCEL控制PLC啟停電機的一種方法

概述 本例將介紹用微軟EXCEL電子表格控制西門子S7-1200 PLC實現電機啟停的一種方法。 第1步&#xff1a; 添加PLC設備&#xff0c;選擇西門子S7-1214C CPU&#xff0c;設置IP地址&#xff1a;192.168.18.18&#xff0c;子網掩碼&#xff1a;255.255.255.0。 第2步&#xff1a…

vue3中通過自定義指令實現loading加載效果

前言 在現代Web開發中&#xff0c;提升用戶體驗一直是開發者們追求的目標之一。其中&#xff0c;一個常見的場景就是在用戶與應用程序進行交互時&#xff0c;特別是當進行異步操作時&#xff08;如網絡請求&#xff09;&#xff0c;為用戶提供即時的反饋&#xff0c;避免用戶因…

Flet初體驗:Python跨平臺開發新選擇

文章目錄 ?? 介紹 ???? 演示環境 ???? 初識Flet ???? 安裝與配置?? 構建第一個Flet應用?? Flet打包:跨平臺的魔法?? Flet與FastAPI的結合?? 總結?? 相關鏈接 ???? 介紹 ?? “探索未知,擁抱創新,Flet讓我在應用開發的世界中找到了新的航標。”…