前端基礎之《Vue(4)—響應式原理》

一、什么是響應式

1、響應式英文reactive
當你get/set一個變量時,你有辦法可以“捕獲到”這種行為。

2、一個普通對象和一個響應式對象對比

(1)普通對象

<script>// 這種普通對象不具備響應式var obj1 = {a: 1,b: 2}
</script>

普通對象,當我們獲取、修改屬性的時候沒辦法捕獲get/set行為(這種普通對象是不具備響應式的):

(2)響應式對象

<script>var obj2 = {}var a = 1var b = 2// 給obj2這個對象添加一個新屬性Object.defineProperty(obj2, 'a', {get() {console.log(`有人訪問了a`)return a},set(val) {console.log(`有人修改了a`)a = val}}) // 給obj2對象加一個a屬性Object.defineProperty(obj2, 'b', {get() {console.log(`有人訪問了b`)return b},set(val) {console.log(`有人修改了b`)b = val}}) // 給obj2對象加一個b屬性</script>

當獲取、修改obj2屬性的時候,會觸發鉤子函數。obj2對象多了get和set函數。obj2具有了響應式:

二、響應式原理

1、流程圖

2、代碼

<html>
<head><title>響應式原理</title></head>
<body>輸入:<input id="ipt" type="text" />輸出:<h2 id="h2" style='display:inline-block;'></h2><hr><h1 id="h1"></h1><button id="btn">自增</button><script>// 這是模擬data選項(普通的對象)const data = {name: '張三',num: 1}// 這是模擬vue組件實例const app = {}// 對data進行遍歷,['name', 'num']// 遍歷完了把數組放到app上// 生命周期的第一階段(劫持,就是添加get/set)Object.keys(data).forEach(k=>{Object.defineProperty(app, k, {// handle加劫持get() {console.log(`getter ${k}`) // touch操作return data[k]},set(val) {console.log(`setter ${k}`) // notify操作data[k] = valwatcher(k) // 通知更新界面}})})// dep對象專門用于依賴收集的const dep = {name: [],num: []}// 生命周期的第二階段(相當于掛載階段)// Collect as Dependency依賴收集function init() {// 模擬v-model='name'dep['name'].push(() => { // 依賴收集document.getElementById('ipt').value = app.name // get功能})// 綁定input事件document.getElementById('ipt').addEventListener('input', ev => {app.name = ev.target.value // set功能})// 模擬v-text='name'dep['name'].push(() => {document.getElementById('h2').innerText = app.name // get功能})dep['num'].push(()=> {document.getElementById('h1').innerText = app.num // get功能})document.getElementById('btn').addEventListener('click', ev => {app.num++ //set功能})// 第一次更新DOMObject.keys(dep).forEach(k=>watcher(k))}// 封裝一個Watcherfunction watcher(k) {dep[k].forEach(fn=>fn()) // 循環調用變量依賴的function}// 調用initinit()</script></body>
</html>

3、說明
(1)生命周期的第一階段(劫持,就是添加get/set)
"Touch"和Notify
(2)生命周期的第二階段(相當于掛載階段)
把DOM放在真實的DOM上渲染,Collect as Dependency依賴收集
收集的結果是得到一個Watcher,通過re-render更新DOM(以后變量有變化,我通知Watcher,讓Watcher再去更新界面)
(3)依賴收集
我要改變表單的值,并且要push一個依賴

二、vue的響應式原理小結

1、正常的對象是沒有辦法做更新的,必須要給它加鉤子,才能知道它被訪問

2、解釋幾個重要概念
劫持:使用Object.defineProperty對data選項進行遍歷并添加getter/setter的鉤子
touch:當指令第一次與聲明式變量綁定時,第一次觸發聲明式變量的get鉤子
依賴收集:當第一次touch時,把當前聲明式變量的更新方法添加到dep依賴數組中
watcher:與聲明式變量對應的DOM方法
re-render:當聲明式變量被set時,Vue通知watcher更新DOM

3、響應式原理
當vue組件被創建時,在生命周期的第一階段,vue使用Object.defineProperty()對data選項進行遍歷劫持并添加get/set鉤子。
在生命周期第二階段,指令第一次與聲明式變量touch時,發生依賴收集,再調用當前組件的watch第一次更新DOM,DOM視圖就顯示出來了。
當聲明式變量發生變化時,vue再次通知watcher更新視圖,這就是響應式。
?

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

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

相關文章

【技術派部署篇】Windows本地部署技術派

一、技術派簡介 技術派是一個采用 Spring Boot、MyBatis-Plus、MySQL、Redis、ElasticSearch、MongoDB、Docker、RabbitMQ 等技術棧的社區系統&#xff0c;其 1.0 版已正式上線。該項目的技術棧按階段集成引入&#xff0c;開發者可根據自身需求選擇不同版本進行學習。 二、環…

DeepSeek和ChatGPT的全面對比

DeepSeek和ChatGPT作為當前領先的大語言模型&#xff0c;代表了AI發展的不同技術路徑和應用理念。以下從技術架構到用戶體驗的全面對比分析&#xff0c;將揭示兩者在AI競賽中的獨特定位。 一、模型架構與原理 1. DeepSeek 架構特點&#xff1a;采用混合專家系統&#xff08;…

Python星球日記 - 第20天:數據分析入門

??引言: 歡迎來到Python星球??的第20天!今天我們將踏入數據分析的世界,學習如何使用pandas處理數據并提取有價值的信息。無論你是想分析商業銷售數據、股票市場趨勢還是科學實驗結果,pandas都是你必不可少的工具! 上一篇:Python星球日記 - 第19天:Web開發基礎 名人…

算力云平臺部署—SadTalker的AI數字人視頻

選擇算力 部署選擇 選擇鏡像 機器管理 控制臺 通過平臺工具進入服務器 認識管理系統 打開命令行 進入目錄 stable-diffusion-webui# cd 增加執行權限 chmod x ./webui.sh 運行命令 bash ./webui.sh sudo apt install -y python3 python3-venv git 安裝軟件 Creating the …

Linux目錄結構:核心目錄功能與用途解析

引言 Linux的目錄結構就像一棵精心設計的大樹&#x1f333;&#xff0c;每個分支都有其特定的用途和規范&#xff01;與Windows不同&#xff0c;Linux采用單一的目錄層次結構&#xff0c;所有設備、分區和網絡資源都掛載在這個統一的目錄樹下。本文將帶你深入探索Linux目錄結構…

【學習筆記】兩個類之間的數據交互方式

在面向對象編程中&#xff0c;兩個類之間的數據交互可以通過以下幾種方式實現&#xff0c;具體選擇取決于需求和設計模式&#xff1a; 1. 通過方法調用 一個類通過調用另一個類的公共方法來獲取或傳遞數據。這是最常見的方式&#xff0c;符合封裝原則。 class ClassA:def __…

神經網絡學習--誤差反向傳播法

最近在學習神經網絡&#xff0c;主要是依據書本《深度學習入門&#xff08;基于Python的理論與實現&#xff09;》&#xff0c;現對第5章“誤差反向傳播法”中的示例程序進行注釋修改如下&#xff0c;以備后續查閱。 編程軟件用的是Eric7&#xff0c;界面如下&#xff1a; 神經…

前端常用組件庫全覽與推薦

&#x1f4cc; 一、組件庫生態全景圖 &#x1f680; 二、React 生態組件庫推薦 名稱簡介官網Ant Design阿里出品&#xff0c;企業級 UI 系統&#xff0c;設計規范完整&#xff0c;適合后臺系統https://ant.designMaterial UIGoogle Material Design 實現&#xff0c;樣式響應式…

群暉如何通過外網訪問

1、進入群暉控制面板-》連接性-》外部訪問-》DDNS 2、新增&#xff0c;添加DDNS 選擇服務供應商&#xff0c;我這里以DNSPod.cn為例。 3、這一步開始&#xff0c;需要前往DNSPod.cn進行注冊域名&#xff08;也可以使用你已有的域名&#xff0c;轉入即可&#xff09;&#xff0…

3.2.2.1 Spring Boot配置靜態資源映射

在Spring Boot中配置靜態資源映射&#xff0c;可以通過默認路徑或自定義配置實現。默認情況下&#xff0c;Spring Boot會在classpath:/static/等目錄下查找靜態資源。若需自定義映射&#xff0c;可通過實現WebMvcConfigurer接口的addResourceHandlers方法或在全局配置文件中設置…

【概念】什么是UI(User interface)什么是UX(User experience)?

1. 軟件生命周期管理 (Software Life Cycle Management) 解釋&#xff1a; 中文&#xff1a; 軟件生命周期管理是指從軟件規劃、設計、開發、測試、部署到后續維護甚至退役的整個過程。English: Software Life Cycle Management refers to the systematic process of plannin…

第十六屆藍橋杯大賽軟件賽省賽 C/C++ 大學B組

由于官方沒有公布題目的數據, 所以代碼僅供參考 1. 移動距離 題目鏈接&#xff1a;P12130 [藍橋杯 2025 省 B] 移動距離 - 洛谷 【問題描述】 小明初始在二維平面的原點&#xff0c;他想前往坐標 (233, 666)。在移動過程中&#xff0c;他 只能采用以下兩種移動方式&#xf…

??IPerf工具使用筆記(基于MobaXterm串口終端)?

??一、問題現象?? ??終端輸入無響應?? 啟動iperf服務器后&#xff0c;終端被阻塞&#xff0c;無法輸入其他命令&#xff08;如圖中重復輸出日志覆蓋輸入區域&#xff09;。??直接原因??&#xff1a;iperf_server線程未正確處理退出標志&#xff0c;導致select或acc…

【從C到C++的算法競賽遷移指南】第五篇:現代語法糖精粹 —— 寫出優雅的競賽代碼

系列導航&#xff1a; [第一篇] 基礎語法與競賽優勢[第二篇] 動態數組與字符串革命[第三篇] 映射與集合的終極形態[第四篇] STL算法與迭代器[? 本篇] 現代語法糖精粹[第六篇] 競賽實戰技巧 一、范圍for循環&#xff1a;告別索引的束縛 1.1 C風格遍歷的四大痛點 // 痛點示例&…

mongodb在window10中創建副本集的方法

創建Mongodb的副本集最好是新建一個文件夾&#xff0c;如D:/data&#xff0c;不要在mongodb安裝文件夾里面創建副本集&#xff0c;雖然這樣也可以&#xff0c;但是容易造成誤操作或路徑混亂&#xff1b;在新建文件夾里與現有 MongoDB 數據隔離&#xff0c;避免誤操作影響原有數…

使用Python進行AI圖像生成:從GAN到風格遷移的完整指南

AI圖像生成是一個非常有趣且前沿的領域&#xff0c;結合了深度學習和計算機視覺技術。以下是一些使用Python和相關庫進行AI圖像生成的創意和實現思路&#xff1a; 1. 使用GAN&#xff08;生成對抗網絡&#xff09; 基本概念&#xff1a;GAN由兩個神經網絡組成&#xff1a;生成…

P10413 [藍橋杯 2023 國 A] 圓上的連線

題意&#xff1a; 給定一個圓&#xff0c;圓上有 n2023 個點從 1 到 n 依次編號。 問有多少種不同的連線方式&#xff0c;使得完全沒有連線相交。當兩個方案連線的數量不同或任何一個點連接的點在另一個方案中編號不同時&#xff0c;兩個方案視為不同。 答案可能很大&#x…

鴻蒙5.0 非桌面頁面,設備來電后掛斷,自動返回桌面

1.背景 其實在Android上面打開一個應用,然后設備來電后掛斷應該是返回到前面打開的這個應用的,但是在鴻蒙里面現象是直接返回桌面,設計如此 2.分析 這個分析需要前置知識,鴻蒙的任務棧頁面棧,具體參考如下鏈接: zh-cn/application-dev/application-models/page-missio…

智能Todo協作系統開發日志(二):架構優化與安全增強

&#x1f4c5; 2025年4月14日 | 作者&#xff1a;Aphelios380 &#x1f31f; 今日優化目標 在原Todo單機版基礎上進行三大核心升級&#xff1a; 組件化架構改造 - 提升代碼可維護性 本地數據加密存儲 - 增強隱私安全性 無障礙訪問支持 - 踐行W3C標準 一、組件化架構改造 …

linux電源管理(二),內核的CPUFreq(DVFS)和ARM的SCPI

更多linux系統電源管理相關的內容請看&#xff1a;https://blog.csdn.net/u010936265/article/details/146436725?spm1011.2415.3001.5331 1 簡介 CPUFreq子系統位于drivers/cpufreq目錄下&#xff0c;負責進行運行過程中CPU頻率和電壓的動態調整&#xff0c;即DVFS (Dynami…