vue的data

類型:Object | Function
限制:組件的定義只接受 function。
詳細:
Vue 實例的數據對象。Vue 會遞歸地把 dataproperty 轉換為 getter/setter,從而讓 dataproperty 能夠響應數據變化。對象必須是純粹的對象 (含有零個或多個的 key/value 對):瀏覽器 API 創建的原生對象,原型上的 property 會被忽略。大概來說,data 應該只能是數據 - 不推薦觀察擁有狀態行為的對象。

一旦觀察過,你就無法在根數據對象上添加響應式 property。因此推薦在創建實例之前,就聲明所有的根級響應式 property

實例創建之后,可以通過 vm.$data 訪問原始數據對象。Vue 實例也代理了 data 對象上所有的 property,因此訪問 vm.a 等價于訪問 vm.$data.a

_ 或 $ 開頭的 property 不會被 Vue 實例代理,因為它們可能和 Vue 內置的 propertyAPI 方法沖突。你可以使用例如 vm.$data._property 的方式訪問這些 property

當一個組件被定義,data 必須聲明為返回一個初始數據對象的函數,因為組件可能被用來創建多個實例。如果 data 仍然是一個純粹的對象,則所有的實例將共享引用同一個數據對象!通過提供 data 函數,每次創建一個新實例后,我們能夠調用 data 函數,從而返回初始數據的一個全新副本數據對象。

如果需要,可以通過將 vm.$data 傳入 JSON.parse(JSON.stringify(...)) 得到深拷貝的原始數據對象。

var data = { a: 1 }// 直接創建一個實例
var vm = new Vue({data: data
})
vm.a // => 1
vm.$data === data // => true// Vue.extend() 中 data 必須是函數
var Component = Vue.extend({data: function () {return { a: 1 }}
})

注意,如果你為 data property 使用了箭頭函數,則 this 不會指向這個組件的實例,不過你仍然可以將其實例作為函數的第一個參數來訪問

data: vm => ({ a: vm.myProp })

深入響應式原理(下面是官網上總結的:)

如何追蹤變化
當你把一個普通的 JavaScript 對象傳入 Vue 實例作為 data 選項,Vue 將遍歷此對象所有的 property,并使用 Object.defineProperty 把這些 property 全部轉為 getter/setterObject.definePropertyES5 中一個無法 shim 的特性,這也就是 Vue 不支持 IE8 以及更低版本瀏覽器的原因。

這些 getter/setter 對用戶來說是不可見的,但是在內部它們讓 Vue 能夠追蹤依賴,在 property 被訪問和修改時通知變更。這里需要注意的是不同瀏覽器在控制臺打印數據對象時對 getter/setter 的格式化并不同,所以建議安裝 vue-devtools 來獲取對檢查數據更加友好的用戶界面。

每個組件實例都對應一個 watcher 實例,它會在組件渲染的過程中把“接觸”過的數據 property 記錄為依賴。之后當依賴項的 setter 觸發時,會通知 watcher,從而使它關聯的組件重新渲染。
在這里插入圖片描述
檢測變化的注意事項
由于 JavaScript 的限制,Vue 不能檢測數組和對象的變化。盡管如此我們還是有一些辦法來回避這些限制并保證它們的響應性。
Vue 無法檢測 property 的添加或移除。由于 Vue 會在初始化實例時對 property 執行 getter/setter 轉化,所以 property 必須在 data 對象上存在才能讓 Vue 將它轉換為響應式的。例如:

var vm = new Vue({data:{a:1}
})// `vm.a` 是響應式的vm.b = 2
// `vm.b` 是非響應式的

對于已經創建的實例,Vue 不允許動態添加根級別的響應式 property。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套對象添加響應式 property。例如,對于:

Vue.set(vm.someObject, 'b', 2)

有時你可能需要為已有對象賦值多個新 property,比如使用 Object.assign() 或 _.extend()。但是,這樣添加到對象上的新 property 不會觸發更新。在這種情況下,你應該用原對象與要混合進去的對象的 property 一起創建一個新的對象。

// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })

Vue 不能檢測以下數組的變動:

當你利用索引直接設置一個數組項時,例如:vm.items[indexOfItem] = newValue
當你修改數組的長度時,例如:vm.items.length = newLength
舉個例子:

var vm = new Vue({data: {items: ['a', 'b', 'c']}
})
vm.items[1] = 'x' // 不是響應性的
vm.items.length = 2 // 不是響應性的

為了解決第一類問題,以下兩種方式都可以實現和 vm.items[indexOfItem] = newValue 相同的效果,同時也將在響應式系統內觸發狀態更新:

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)

你也可以使用 vm.$set 實例方法,該方法是全局方法 Vue.set 的一個別名:

vm.$set(vm.items, indexOfItem, newValue)

為了解決第二類問題,你可以使用 splice:

vm.items.splice(newLength)

由于 Vue 不允許動態添加根級響應式 property,所以你必須在初始化實例前聲明所有根級響應式 property,哪怕只是一個空值:

var vm = new Vue({data: {// 聲明 message 為一個空值字符串message: ''},template: '<div>{{ message }}</div>'
})
// 之后設置 `message`
vm.message = 'Hello!'

如果你未在 data 選項中聲明 messageVue 將警告你渲染函數正在試圖訪問不存在的 property
這樣的限制在背后是有其技術原因的,它消除了在依賴項跟蹤系統中的一類邊界情況,也使 Vue 實例能更好地配合類型檢查系統工作。但與此同時在代碼可維護性方面也有一點重要的考慮:data 對象就像組件狀態的結構 (schema)。提前聲明所有的響應式 property,可以讓組件代碼在未來修改或給其他開發人員閱讀時更易于理解。

異步更新隊列

可能你還沒有注意到,Vue 在更新 DOM 時是異步執行的。只要偵聽到數據變化,Vue 將開啟一個隊列,并緩沖在同一事件循環中發生的所有數據變更。如果同一個 watcher 被多次觸發,只會被推入到隊列中一次。這種在緩沖時去除重復數據對于避免不必要的計算和 DOM 操作是非常重要的。然后,在下一個的事件循環“tick”中,Vue 刷新隊列并執行實際 (已去重的) 工作。Vue 在內部對異步隊列嘗試使用原生的 Promise.thenMutationObserversetImmediate,如果執行環境不支持,則會采用 setTimeout(fn, 0) 代替。

例如,當你設置 vm.someData = 'new value',該組件不會立即重新渲染。當刷新隊列時,組件會在下一個事件循環“tick”中更新。多數情況我們不需要關心這個過程,但是如果你想基于更新后的 DOM 狀態來做點什么,這就可能會有些棘手。雖然 Vue.js 通常鼓勵開發人員使用“數據驅動”的方式思考,避免直接接觸 DOM,但是有時我們必須要這么做。為了在數據變化之后等待 Vue 完成更新 DOM,可以在數據變化之后立即使用 Vue.nextTick(callback)。這樣回調函數將在 DOM 更新完成后被調用。例如:

<div id="example">{{message}}</div>
var vm = new Vue({el: '#example',data: {message: '123'}
})
vm.message = 'new message' // 更改數據
vm.$el.textContent === 'new message' // false
Vue.nextTick(function () {vm.$el.textContent === 'new message' // true
})

在組件內使用 vm.$nextTick() 實例方法特別方便,因為它不需要全局 Vue,并且回調函數中的 this 將自動綁定到當前的 Vue 實例上:

Vue.component('example', {template: '<span>{{ message }}</span>',data: function () {return {message: '未更新'}},methods: {updateMessage: function () {this.message = '已更新'console.log(this.$el.textContent) // => '未更新'this.$nextTick(function () {console.log(this.$el.textContent) // => '已更新'})}}
})

因為 $nextTick() 返回一個 Promise 對象,所以你可以使用新的 ES2017 async/await 語法完成相同的事情:

methods: {updateMessage: async function () {this.message = '已更新'console.log(this.$el.textContent) // => '未更新'await this.$nextTick()console.log(this.$el.textContent) // => '已更新'}
}

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

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

相關文章

DC電源模塊與節能環保的關系

BOSHIDA DC電源模塊與節能環保的關系 隨著全球能源危機的加劇&#xff0c;環保節能已經成為世界各國政府和企業發展的主要方向。在電子行業中&#xff0c; DC電源模塊的出現為環保節能做出了貢獻。DC電源模塊是一種電源供應器件&#xff0c;可將高電壓轉換為低電壓&#xff0c;…

柏林噪聲C++

柏林噪聲 隨機噪聲 如上圖所示隨機噪聲沒有任何規律可言&#xff0c;我們希望生成有一些意義的局部連續的隨機圖案 一維柏林噪聲 假設希望生成一段局部連續的隨機曲線&#xff0c;可以采用插值的方式&#xff1a;在固定點隨機分配y值&#xff08;一般是整數點&#xff09;&a…

【數據分析實戰】酒店行業華住集團門店分布與評分多維度分析

文章目錄 1. 寫在前面2. 數據集展示3. 多維度分析3.1 門店檔次多元化&#xff1a;集團投資戰略觀察3.1.1 代碼實現3.1.2 本人淺薄理解 3.2 門店分布&#xff1a;各省市分布概覽3.2.1 代碼實現3.2.2 本人淺薄理解 3.3 門店分級評分&#xff1a;服務水平的多維度觀察3.3.1 代碼實…

F5怎么樣?從負載均衡到云原生的進階之路

從Web時代開始至云原生時代的應用服務交付的市場&#xff0c;技術與人的變化就是關注的焦點。從單純的Web負載均衡到復雜的企業應用交付&#xff0c;從單體應用到分布式、微服務架構&#xff0c;F5為企業技術架構更好、更優、更安全的運行做出了極大的努力。那么F5怎么樣&#…

Vue 循環走馬燈

1、使用 transform: translateX()&#xff0c;循環將滾動內容在容器內偏移&#xff0c;超出容器部分隱藏&#xff1b; 2、避免滾動到末尾時出現空白&#xff0c;需要預留多幾個。 3、一次循環偏移的距離scrollLoopWidth 可能受樣式影響需要做些微調&#xff0c;比如單個item的…

題目:分糖果(藍橋OJ 2928)

題目描述&#xff1a; 解題思路&#xff1a; 本題采用貪心思想 圖解 題解&#xff1a; #include<bits/stdc.h> using namespace std;const int N 1e6 9; char s[N];//寫字符串數組的一種方法,像數組一樣***int main() {int n, x;cin >> n >> x;for(int …

CSS新手入門筆記整理:元素類型相互轉換

元素類型 塊元素&#xff08;block&#xff09; 獨占一行&#xff0c;排斥其他元素跟其位于同一行&#xff0c;包括塊元素和行內元素。塊元素內部可以容納其他塊元素和行內元素。可以定義 width&#xff0c;也可以定義 height。可以定義 4 個方向的 margin。 行內元素&#xf…

使用navicat(或者其他數據庫管理工具)、powerdesigner導出數據字典

適合先有數據庫結構&#xff0c;后需要導出數據字典的情況&#xff0c;多數在發開完成交文檔或者用戶有庫的情況下 有條件的話推薦用powerdesigner導出&#xff0c;比較好看 如果用powerdesigner導出的注釋不對&#xff0c;是因為數據庫的編碼不對 1、使用navicat導出 在該數…

代碼隨想錄算法訓練營第45天| 70. 爬樓梯 (進階) 322. 零錢兌換 279.完全平方數

JAVA代碼編寫 70. 爬樓梯&#xff08;進階版) 卡碼網&#xff1a;57. 爬樓梯&#xff08;第八期模擬筆試&#xff09; 題目描述 假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬至多m (1 < m < n)個臺階。你有多少種不同的方法可以爬到樓頂呢&#xff1f…

菜鳥學習日記(python)——推導式

python中的推導式是一種獨特的數據處理方式&#xff0c;可以從一個數據序列去構建另一個新的數據序列的結構體。 它包括以下推導式&#xff1a; 列表&#xff08;list&#xff09;推導式字典&#xff08;dict&#xff09;推導式集合&#xff08;set&#xff09;推導式元組&am…

Multi-Cell Downlink Beamforming: Direct FP, Closed-Form FP, Weighted MMSE

這里寫自定義目錄標題 Direct FPClosed-Form FPthe Lagrangian functionthe Lagrange dual function: maximizing the Lagrangianthe Lagrange dual problem: minimizing the Lagrange dual functionClosed-Form FP Weighted MMSE原論文 Lagrange dual5.1.1 The Lagrangian5.1.…

阿里云服務器經濟型、通用算力型、計算型、通用型、內存型實例區別及選擇參考

當我們通過阿里云的活動購買云服務器會發現&#xff0c;相同配置的云服務器往往有多個不同的實例可選&#xff0c;而且價格差別也比較大&#xff0c;例如同樣是4核8G的配置的云服務器&#xff0c;經濟型e實例活動價格只要1500.48/1年起&#xff0c;通用算力型u1實例要1795.97/1…

nvidia安裝出現7-zip crc error解決辦法

解決辦法&#xff1a;下載network版本&#xff0c;重新安裝。&#xff08;選擇自己需要的版本&#xff09; 網址&#xff1a;CUDA Toolkit 12.3 Update 1 Downloads | NVIDIA Developer 分析原因&#xff1a;local版本的安裝包可能在下載過程中出現損壞。 本人嘗試過全網說的…

linux 系統安全基線 安全加固操作

目錄 用戶口令設置 root用戶遠程登錄限制 檢查是否存在除root之外UID為0的用戶 ???????root用戶環境變量的安全性 ???????遠程連接的安全性配置 ???????用戶的umask安全配置 ???????重要目錄和文件的權限設置 ???????找未授權的SUID…

json轉yolo格式

json轉yolo格式 視覺分割得一些標注文件是json格式&#xff0c;比如&#xff0c;舌頭將這個舌頭區域分割出來&#xff08;用mask二值圖的形式&#xff09;&#xff0c;對舌頭的分割第一步是需要檢測出來&#xff0c;缺少數據集&#xff0c;可以使用分割出來的結果&#xff0c;將…

無公網IP環境如何SSH遠程連接Deepin操作系統

文章目錄 前言1. 開啟SSH服務2. Deppin安裝Cpolar3. 配置ssh公網地址4. 公網遠程SSH連接5. 固定連接SSH公網地址6. SSH固定地址連接測試 前言 Deepin操作系統是一個基于Debian的Linux操作系統&#xff0c;專注于使用者對日常辦公、學習、生活和娛樂的操作體驗的極致&#xff0…

數據儀表盤設計:可視化數據指標和報告

寫在開頭 在信息爆炸的時代,數據不再是簡單的數字和圖表,而是一種有機的信息體系。如何將這些琳瑯滿目的數據以一種直觀而高效的方式展示,成為企業決策者和分析師們共同關注的問題。本文將帶您深入學習如何設計和創建數據儀表盤,使數據指標和報告以一目了然的方式呈現。 …

Python---time庫

目錄 時間獲取 時間格式化 程序計時 time庫包含三類函數&#xff1a; 時間獲取&#xff1a;time() ctime() gmtime() 時間格式化&#xff1a;strtime() strptime() 程序計時&#xff1a;sleep() perf_counter() 下面逐一介紹&#…

H3.3K27M彌漫性中線膠質瘤的反義寡核苷酸治療

今天給同學們分享一篇實驗文章“Antisense oligonucleotide therapy for H3.3K27M diffuse midline glioma”&#xff0c;這篇文章發表在Sci Transl Med期刊上&#xff0c;影響因子為17.1。 結果解讀&#xff1a; CRISPR-Cas9消耗H3.3K27M恢復了H3K27三甲基化&#xff0c;并延…

Echarts地圖案例及常見問題

前言 ECharts 是一個使用 JavaScript 實現的開源可視化庫,它可以幫助用戶以簡單的方式創建復雜的時間序列、條形圖、餅圖、地圖等圖形。 Echarts繪制地圖的案例 展示了中國各省份的人口數量 var myChart = echarts.init(document.getElementById(main)); var option = {t…