按鈕計數器:jQuery / AngularJS / Vue / React / dagger.js 實現對比與技術解讀

代碼來源:https://codepen.io/dagger8224/pen/myeKgVQ

任務:實現“按鈕點擊 +1”計數器,對比不同框架的寫法與特性,并給出選型建議。


目錄

  • 代碼解讀(逐框架)
    • jQuery(命令式 DOM)
    • AngularJS(作用域 + 指令)
    • Vue(響應式 + 模板指令)
    • React(狀態 + 渲染函數)
    • dagger.js(原生 DOM 上的聲明式指令,零樣板)
  • 方案對照(要點一覽)
  • 技術觀察與解讀
  • 什么時候選誰?
  • 附:關鍵代碼片段

代碼解讀(逐框架)

jQuery(命令式 DOM)

HTML 一個按鈕 #jquery,JS 里手動掛事件并改 innerHTML,用 - 0 把字符串轉數值:

$('#jquery').on('click', e => e.target.innerHTML = e.target.innerHTML - 0 + 1);

這完全把 DOM 當“狀態源”,簡單直接,但沒有數據層,后續可維護性與可組合性較弱。


AngularJS(作用域 + 指令)

ng-app="ngApp" ng-controller="buttonController" 聲明應用與控制器,$scope.count 放狀態,ng-click 觸發 handleClick()

<div ng-app="ngApp" ng-controller="buttonController"><button ng-click="handleClick()">{{ count }}</button>
</div>
<script>
angular.module('ngApp', [])
.controller('buttonController', function($scope){$scope.count = 0;$scope.handleClick = function(){ $scope.count++; };
});
</script>

模板 {{ count }}$scope 綁定,靠 digest 循環驅動更新。對這個微例子而言,樣板代碼相對偏多。


Vue(響應式 + 模板指令)

數據在 data,事件在 methods,點擊只改數據、視圖自動更新:

<div id="vue"><button v-on:click="handleClick">{{ count }}</button>
</div>
<script>
new Vue({el:'#vue',data:{ count:0 },methods:{ handleClick(){ this.count++; } }
});
</script>

結構清晰,體量中等。


React(狀態 + 渲染函數)

使用 class 組件:

class ReactButton extends React.Component {state = { count: 0 };handleClick = () => this.setState({ count: this.state.count + 1 });render(){return <button onClick={this.handleClick}>{this.state.count}</button>;}
}
ReactDOM.render(<ReactButton/>, document.getElementById('react'));

狀態在 this.state,用 setState 觸發重渲染。樣板代碼偏多(尤其在無需組件化時),但在大規模組件樹、生態配套下優勢明顯。


dagger.js(原生 DOM 上的聲明式指令,零樣板)

一行 HTML 解決:

<button id="dagger" dg-cloak +load="{ count: 0 }" +click="count++">${ count }</button>
  • +load 初始化局部作用域(當前宿主元素)。
  • ${ count } 插值。
  • +click 直接寫表達式增量。
  • dg-cloak 防止閃爍。

無需單獨 JS 模塊與掛載點,狀態與視圖強“同位(colocation)”。


方案對照(要點一覽)

維度jQueryAngularJSVueReactdagger.js
狀態歸屬DOM 即狀態$scopedatathis.state元素局部作用域(+load
事件綁定代碼里手綁ng-clickv-on:clickonClick+click(表達式)
視圖更新手改 DOMdigest響應式重渲染直接驅動 DOM(無 VDOM)
樣板/文件數最少,但可維護性弱偏多適中偏多極少(常一行搞定)
學習/心智低,命令式指令+作用域模板+響應式組件/狀態/JSX原生 DOM + 輕指令
適配復雜度組件化弱過時生態生態完善生態最強輕量、無構建亦可

注:上表依據本例的寫法與常見范式總結。


技術觀察與解讀

  1. “狀態在哪里”決定復雜度走向

    • jQuery:把 DOM 當真相源,最輕,但交互增多時難控。
    • Vue/React:數據為真相源,模板/JSX 由狀態驅動,易規模化。
    • dagger.js:把“小狀態”就地掛在元素作用域,天然就近,適合局部交互。
  2. 事件寫法的表達力與可組合性

    • Vue/Angular/React:聲明事件名 → 調函數。
    • dagger.js:+click="count++" 直接表達更新意圖,減少樣板(無需 methods / this.setState)。
  3. 引導方式與掛載點

    • AngularJS:ng-app / ng-controller
    • Vue:new Vue({ el })
    • React:ReactDOM.render()
    • dagger.js:元素上聲明即可,不依賴全局掛載點,適合“就地增強”。
  4. 樣板與可讀性

    • 本例中,從多到少大致是:React ≥ AngularJS ≥ Vue > jQuery ≈ dagger.js。
    • 對“按鈕 + 計數”這類微交互,dagger 的“一行式”復制擴散成本最低。
  5. 可規模化與生態

    • 組件通信、路由、狀態管理、SSR、工程化鏈路:React/Vue 生態占優。
    • dagger.js:無需構建的輕交互、內嵌到現有頁面、分散微部件;與 jQuery 滲透場景重疊,但更現代、聲明式。

什么時候選誰?

  • 給現有頁面補幾個小交互/小掛件:首選 dagger.js(或其他輕量范式),因為“就地聲明 + 無樣板”。
  • 中大型單頁應用React / Vue 更穩,生態豐富、協作友好。
  • 快速腳本式改動jQuery 可用,但謹慎可維護性與狀態一致性。
  • AngularJS 存量:按存量維護;新項目不建議再啟用 AngularJS。

附:關鍵代碼片段

以下為本示例中各技術棧的最小可用版本,便于復制到自己的實驗頁面。

jQuery

<button id="jquery">0</button>
<script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
<script>
$('#jquery').on('click', e => e.target.innerHTML = e.target.innerHTML - 0 + 1);
</script>

AngularJS

<div ng-app="ngApp" ng-controller="buttonController"><button ng-click="handleClick()">{{ count }}</button>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
<script>
angular.module('ngApp', [])
.controller('buttonController', function($scope){$scope.count = 0;$scope.handleClick = function(){ $scope.count++; };
});
</script>

Vue

<div id="vue"><button v-on:click="handleClick">{{ count }}</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.min.js"></script>
<script>
new Vue({el:'#vue',data:{ count:0 },methods:{ handleClick(){ this.count++; } }
});
</script>

React

<div id="react"></div>
<script src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script type="text/babel">
class ReactButton extends React.Component {state = { count: 0 };handleClick = () => this.setState({ count: this.state.count + 1 });render(){return <button onClick={this.handleClick}>{this.state.count}</button>;}
}
ReactDOM.render(<ReactButton/>, document.getElementById('react'));
</script>

dagger.js

<script type="module" crossorigin="anonymous" src="https://assets.codepen.io/5782383/dagger-1.0.0-RC.js" defer></script>
<button id="dagger" dg-cloak +load="{ count: 0 }" +click="count++">${ count }</button>

本文內容就到這里,后續文章將為大家帶來更多案例和講解。

如果對dagger.js感興趣的話,請您點贊收藏、分享本系列文章,也歡迎留言或者私信作者提出問題和建議,您的關注是對我最大的支持和鼓勵。感謝您的閱讀,祝工作學習順利!

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

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

相關文章

useEffect中直接使用 await報錯

在 useEffect 中直接使用 await 會報錯&#xff0c;因為 useEffect 的回調函數不能是 async 函數。有幾種正確的方式來處理異步操作&#xff1a; 方法一&#xff1a;在 useEffect 內部創建 async 函數并立即調用 這是最常用的方式。 import React, { useEffect } from react;co…

卷積神經網絡為什么要填充(Padding)

填充&#xff08;Padding&#xff09;是卷積神經網絡中一個至關重要且巧妙的設計。它的核心目的可以概括為&#xff1a;為了解決卷積操作導致的特征圖尺寸縮小和邊緣信息丟失問題。

C++ 并發編程:全面解析主流鎖管理類

在 C 的并發世界里&#xff0c;管理共享資源就像是在一個繁忙的十字路口指揮交通。如果指揮不當&#xff0c;就會發生混亂甚至致命的“死鎖”。C 標準庫提供的各種鎖管理工具&#xff0c;就是我們手中的“交通信號燈”&#xff0c;它們各自擁有獨特的職能&#xff0c;幫助我們編…

Spring boot 啟用第二數據源

1. 數據源配置代碼&#xff1a;import com.alibaba.druid.pool.DruidDataSource; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilde…

Wi-Fi 時延與掉包的關鍵因素全解析

在無線網絡性能優化中&#xff0c;時延&#xff08;Latency&#xff09;與掉包&#xff08;Packet Loss&#xff09;是最核心的兩個指標。本文將從 物理層、MAC層、系統棧、業務形態與環境 等多個維度&#xff0c;對 Wi-Fi 時延與掉包的關鍵因素進行全面梳理&#xff0c;并結合…

《Python 文本分析實戰:從單詞頻率統計到高效可視化的全流程指南》

《Python 文本分析實戰:從單詞頻率統計到高效可視化的全流程指南》 一、引言:小任務背后的大世界 在我多年的開發與教學中,文本處理始終是一個繞不開的主題。無論是日志分析、自然語言處理,還是搜索引擎、推薦系統,幾乎所有數據驅動的系統都離不開對文本的理解。而“統計…

12KM無人機高清圖傳通信模組——打造未來空中通信新高度

在無人機技術飛速發展的今天&#xff0c;高清圖傳和穩定的通信模塊無疑是提高無人機作業效率和可靠性的關鍵因素。作為新一代無人機核心技術之一&#xff0c;深圳云望物聯12KM無人機高清圖傳通信模組憑借其卓越的性能&#xff0c;正逐步成為行業內的寵兒&#xff0c;成為無人機…

【LeetCode 熱題 100】62. 不同路徑——(解法二)遞推

Problem: 62. 不同路徑 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(m * n)空間復雜度&#xff1a;O(m * n)整體思路 這段代碼同樣旨在解決 “不同路徑” 問題&#xff0c;但它采用的是一種 自底向上&#xff08;Bottom-Up&#xff09;的動態規劃 方法&#x…

C++ 高階錯誤解析:MSVC 與 Qt 全景指南

在 C 開發中&#xff0c;尤其是在 Windows 平臺使用 MSVC 或 Qt 框架 時&#xff0c;程序員經常會遇到編譯錯誤、鏈接錯誤和運行時異常。本文將系統梳理這些問題&#xff0c;按 語法錯誤、類型錯誤、鏈接錯誤、Qt 運行錯誤 分類&#xff0c;并給出 觸發示例、原因分析及修復策略…

基于Net海洋生態環境保護系統的設計與實現(代碼+數據庫+LW)

摘要 隨著全球氣候變化和人類活動的加劇&#xff0c;海洋生態系統面臨著前所未有的威脅。污染、過度捕撈、棲息地破壞等問題嚴重影響了海洋生物多樣性和生態平衡。為了應對海洋生態系統面臨的嚴重威脅&#xff0c;如污染、過度捕撈和棲息地破壞等問題&#xff0c;利用C#語言和…

DoIP路由激活報文

目錄 DoIP路由激活報文詳解 基本概念 報文結構 響應報文 通信流程 注意事項 **DoIP (Diagnostics over Internet Protocol) 報文詳解** **1. DoIP 報文結構** **1.1 通用報文格式** **2. 常見 DoIP 報文類型** **3. 典型 DoIP 報文示例** **3.1 車輛識別請求(廣播)** **3.2 車…

學習Python中Selenium模塊的基本用法(8:元素操作-2)

定位網頁元素后&#xff0c;調用is_displayed函數可以判斷元素的顯示狀態&#xff0c;如百度網站中有默認隱藏的元素&#xff0c;此時即可使用is_displayed函數判斷該元素的顯示狀態&#xff0c;如下面代碼所示&#xff1a;driver webdriver.Chrome() driver.get("https:…

雙指針:從「LC11 盛最多水的容器」到「LC42 接雨水」

LC11 盛最多水的容器 選擇兩條線&#xff0c;它們與x軸構成的容器可以盛的水量取決于兩條線中較短的那條以及兩條線之間的距離。 樸素的思想是使用i和j遍歷height中的所有線&#xff0c;但是這樣的時間復雜度是O(n2)O(n^2)O(n2)。 我們讓i從0開始&#xff0c;j從n-1開始&…

WINTRUST!_GetMessage函數分析之CRYPT32!CryptSIPGetSignedDataMsg函數的作用是得到nt5inf.cat的信息

UEDIT打開nt5inf.cat。第一部分&#xff1a;BOOL _GetMessage(CRYPT_PROVIDER_DATA *pProvData) {DWORD dwMsgEncoding;SIP_SUBJECTINFO *pSubjInfo;SIP_DISPATCH_INFO *pSip;DWORD cbEncodedMsg;BYTE *pbEncodedMsg;DWORD …

編譯esp32報錯解決辦法

報錯信息&#xff1a;CMake Error at build/CMakeFiles/git-data/grabRef.cmake:48 (file):file failed to open for reading (No such file or directory):這個錯誤是由于 Git 的安全檢查導致的。從錯誤信息可以看出&#xff0c;Git 檢測到了"可疑的所有權"&#xf…

【AI】常見8大LLM大語言模型地址

序號AI名稱地址1 ChatGPT &#xff08;OpenAI&#xff09;https://chat.openai.com/2Gemini (Google personal AI assistant)https://gemini.google.com/app3Grok (xAI Grok LLM)https://x.ai/4DeepSeek (DeepSeek AI chatbot)DeepSeek5Claude (Anthropic Claude AI)App unavai…

軟件系統的部署方式:單機、主備(冷主備、熱主備)、集群

一、單機部署單機部署是將軟件系統所有組件&#xff08;應用、數據庫等&#xff09;部署在單臺服務器上&#xff0c;架構簡單、成本低但存在單點故障風險&#xff0c;適用于低負載或測試場景。一臺服務器壞了&#xff0c;軟件系統無法服務。二、主備&#xff08;冷主備、熱主備…

從體驗到系統工程丨上手評測國內首款 AI 電商 App

作者&#xff1a;王晨&#xff08;望宸&#xff09; 產品界面&#xff0c;往往體現了產品的設計哲學&#xff0c;界面是產品的第一入口。 近期&#xff0c;1688 推出了 1688 AI App&#xff0c;這貌似是國內第一個電商領域的獨立 AI App 應用&#xff08;若不是&#xff0c;歡…

QML QQuickImage: Cannot open: qrc:/images/shrink.png(已解決)

此問題是 在 QT Quick 項目 顯示圖片的時候 遇到&#xff0c;顯示&#xff1a;QML QQuickImage: Cannot open: qrc:/images/shrink.png&#xff0c;不能 打開 圖片。為了解決此問題&#xff0c;找了很多資料&#xff0c;雖然是比較簡單&#xff0c;但對于初學者來說&#xff0c…

maven scope 詳解

Maven 的 scope用于定義依賴項在項目構建生命周期中的可見性和傳遞性&#xff0c;控制依賴在編譯、測試、運行等階段的可用性及是否被打包到最終產物中。以下是詳細解析&#xff1a;?? ??一、Scope 的核心作用????生命周期控制??決定依賴在編譯、測試、運行階段的可用…